いつも参考にさせてもらっています。
少々困ってましてみなさんの知恵を借してください。
<環境>
WindowsXP SP2
Delphi7
サーバー1:(OS400) Delphi/400:あり
サーバー2:(OS400) Delphi/400:なし
別々のサーバーのテーブルに対してJOINを行ったSQLを発行したいのですが,
一方のテーブルの認識ができないようです(TDataBaseは一つなので当たり前かもしれませんが)。
SQLでサーバーを認識させることはできないものでしょうか?
接続方法としてはBDE接続とADO接続で試してみました。
SQLで解決する方法はあるでしょうか?
また上記の処理が出来ないことも考え,
一度ローカル(Paradox)にテーブルデータ(フィールド数:約140)をコピーする方法も考えています。
(全てのテーブルをローカルに落とせば一応SQLは通るので・・・)
ただ,データ件数が9万件と多く処理時間がかかりすぎています。
私が処理した方法として以下の2つ試してみました。
・パターン1
1.データソースを作成
2.BDEを使用して接続
3.コピー元と同じテーブル構成をローカルに作成
4.TBatchMoveコンポーネントを使用してコピー
※結果:約2分30秒
・パターン2
1.TADOConnectionにて接続
2.TADOQuery.CursorLocationプロパティをclUserServerに設定
(この設定がないとADOQueryオープン時に時間がかかる)
3.コピー元と同じテーブル構成をローカルに作成
4.INSERT INTO にて1件ずつデータをコピー
※結果:60分以上
他にデータのコピーを早くする手法をご存じ方はいませんでしょうか?
以上です。よろしくお願いします。
片方のテーブルをTDataSetなどへ読み込み、TFieldのLookupDataSetプロパティには,もう片方のテーブルを読み込ませたTDataSetなどを設定して、LookupDataSet側の項目をTField.FieldKindプロパティをfkLookupに設定したフィールドへ読み込ませる方法はどうでしょうか?
ただし、処理速度がどのくらいかは分かりませんし、実際に検証していませんので外していたらすみません。
何故、結合する必要があるのか分かりませんが、9万件のデータを同時にアクセスする必要がなければTClientDataSetなどへ必要分読み込んで処理しても良いのでないでしょうか?
返信ありがとうございます。
検索キーによっては別々のテーブルに対象フィールドがある為,
結合した上でSQLを発行しなければならないと思いました。
ただ,SQLで完結した場合の方が早いかどうかは不明です。
※以下の実験では検索キーが別々のテーブルにあるため一度全てのデータをClientDataSetに落としています。
DataSet間でINNER JOINみたいなことが出来ればいいんですが・・・
フィールドの参照設定を試してみましたが『この機能は使用できません』とメッセージがでました。
同じDatabaseを使用した場合は参照設定はできました。
別々のDatabaseを使用した場合がダメなのかもしれないので別途調べます。
各々のテーブルを一旦ClientDataSetに落としフィールドの参照設定を行うと
正常に値を読み込むことが出来ました。(処理時間:約2分)
ただ検索の代わりにフィルターを使用したところ
『項'xxx'をフィルター式で使うことは出来ません』とメッセージがでました。
これは参照フィールドだからでしょうか?
参照設定を行ったClieantDatasetを再度DataSetProvider→ClientDataSetと設定を行うと,
フィルターで条件を絞ることは出来ましたが2回もClientDataSetを経由させているせいか,
少々処理時間がかかりました(処理時間:約9分)
設定変更等をして早くならないか調べてみます。
(各コンポーネントの繋がり)
サーバー1 → Table1(データ) → DataSetProvider1 → ClientDataSet1(ClientDataSet2の値を参照設定)
→ DataSetProvider3 → ClientDataSet3(フィルター処理) → DataSource1 → DBGrid1
サーバー2 → Table2(マスタデータ等) → DataSetProvider2 → ClientDataSet2
あとTQueryのヘルプ見落としていたんですが,
『異種間の問い合わせの作成』というのを見つけました。
試してみたんですが,
設計時:QueryをActive=TrueにするとDelphiが終了する。
実行時:QueryをOpenするとメモリエラー?が発生する。
という状態です。
この方法で繋げることできた人はいますでしょうか?
よろしくお願いします。
異種間の問い合わせのエラーですが,
どうもDelphi/400が原因の可能性が出てきました。
Delphi/400が使用するドライバを使用せずに
データソースを使用してつなげた場合は,
異種間の問い合わせは出来ました。
スピードは早いとは言い切れませんが・・・
パフォーマンスが上がるように工夫してみて
最善の方法でしようと思います。
moruさんありがとうございました。
エラーの件はDelphi/400の開発元に問い合わせてみます。
ツイート | ![]() |