Q6:二つのデータベースファイルにアクセスして、それぞれの中にあるテーブルから一つの表に取り出すということはできるのでしょうか?
Q6-1:
MZPlatform内でODBCを利用したデータベースアクセスについての質問です。
データベースアクセスチュートリアル等、ODBCを利用したデータベースへのアクセスの際一つのデータベースファイル(Accessなら****.mdbというファイル)にアクセスしてSQLで制御したりしています。これを二つのデータベースファイルにアクセスして、それぞれの中にあるテーブルから一つの表に取り出すということはできるのでしょうか?
文章だけだとわかりにくいと思うので具体例を下記に載せます。
*現在可能なこと
ABC.mdb
table a ←SQL文でtable a,b全てを表示
table b 例:select * from table a,table b;
table c
*今回の質問
ABC.mdb XYZ.mdb
table a table x ←ABC.mdbのtable aとXYZ.mdbのtable xの全てを表示
table b table y SQL文??
table c table z
こんな感じです。SQL文でも少し調べましたが違うデータベースからテーブルを抜き出してきて結合というのはわかりませんでした。MZPlatform内でも一つのプログラムの中で二つの「データベースアクセス」コンポーネントを利用し、二つを別々で表示することは可能だったので、二つのデータベースにODBCを利用して同時にアクセスするというのは大丈夫なようでした。
方法として候補があったのでそれを紹介します。
1.新しく白紙のデータベースを作り、そこに二つのデータベースを順にコピーしていき、一つのデータベースにする。その後中にあるテーブルをSQL文で制御して取り出す。
2.一時的にデータを確保しておくのは1と同じだが、新たにデータベースを作るのではなく、メモリ等に変数として保存して、その中からSQL文で制御する。
考え方としては二つともあまりかわりないです。1の方法ならMZPlatform内のプログラムでもいけそうですが、かなり大掛かりなことになってしまいそうで、実用性の観点から見るとちょっと難しいと思います。ただ、javaのプログラミングでは結構簡単にいけるようで、プログラムを作成中です。補足になりますが、MySQLはまだうまく使えていません。ひょっとしたらMySQLの中でそういうことが実現可能かとも考えましたが調べきれませんでした。
今回の質問では、
1.二つのデータベースから表を取り出すのはMZPlatform内で可能なのか?
2.可能ならどういうコンポーネントの組み合わせでできるのか?
3.不可能ならどういうコンポーネントがあればできるのか?
という項目にお答えいただければ幸いです。
A6-1:
お問い合わせの件、MZ Platformのデータベースアクセスコンポーネントは同時には1つのデータベースファイルにしかアクセスできません。
従いまして、同時に複数のデータベースファイルにアクセスする場合には、基本的にはご提示いただきましたような2つの方法しかないのではないかと思います。
方法1では、もしテーブルが1つのデータベースファイルにコピーし統合できるのであれば、SQL文で複数のテーブルに対する様々な処理ができることから、MZ
Platformでの処理は簡単になると思います。
方法2では、MZ Platformに呼び出した2つのテーブルに対して、SQL文に相当する処理をコンポーネント間の接続で実現する必要があります。
さらに、レコードの変更が生ずる(MZ Platform上のテーブルデータに変更が生ずる)場合には、同様の結果になるように元々の2つのデータベースファイル(Access)のテーブルに対してSQL文を実行する必要があります。
方法3としまして、Accessの場合にはテーブルのリンク機能がありますので、異なるデータベースファイルのテーブルを参照するテーブルを作成することができます。この場合には、1つのデータベースファイルに存在するのと同じように、複数のテーブル間の処理ができます。
従いまして、頂きました文面だけで判断しますと、方法1、3が適切であるように思います。
ただし、この件に関しましては、アプリケーションの設計思想に依存いたしますので、適切な方法をご判断いただきたいと思います。
> 1.二つのデータベースから表を取り出すのはMZPlatform内で可能なのか?
> 2.可能ならどういうコンポーネントの組み合わせでできるのか?
> 3.不可能ならどういうコンポーネントがあればできるのか?
従いまして、1、2に関しましては、1つのSQL文で異なるファイルのデータベースからテーブル情報を取得することはできません。同様の処理を行うには上述の3方法の何れかになると思います。3に関しましては良い答えが思いつきません。ご提示の処理を行うコンポーネントを作成していただくということになると思います。
MySQLに関しましては、1つのMySQLシステムの中に複数のデータベースをもつ仕様になっておりますので、異なるデータベースから1つのSQL文でテーブルを参照することが可能です。
例えば、SELECT * FROM ABC.table_a, XYZ.table_x;
(ただし、データベースABC,XYZは同一のMySQLシステムに存在)
ただし、MySQLシステム自身が複数ある場合(例えば異なるコンピュータにそれぞれMySQLがインストールされ、それぞれのテーブルを参照し処理する場合)には、同様の問題が発生します。