FireDACラーニング-7:3層データベース、1回に複数のテーブルのデータを渡す



需要
MIDASアーキテクチャでは、プライマリスレーブテーブルは、複数のネストされたテーブルのデータを一度にクライアントに渡すネストされたテーブル方式を採用することができる.主従テーブルFdQuery 1とFdQuery 2があると仮定すると、大まかなやり方は以下の通りです.
1.サーバ側では、FdQuery 1とFdQuery 2がそれぞれデータベースサーバ内のテーブルに対応しています.対応するテーブルには主従関係があり、主テーブルの主キーフィールド名はIDである.テーブルの外部キーフィールド名もIDです.
2.サーバ側、DataSource 1はFdQuery 1に対応.
3.FdQuery 2のSQL文は大体:select*from Table 2 where ID=:ID;
4. FdQuery2.MasterSource := DataSource1;
5.サーバ側にはFdQuery 1であるDataSetProvider 1が配置される.ここで、DataSetProvider 1を介してクライアントに出力されるデータは、ネストされたテーブルであり、2つのテーブル(複数のネストされたテーブルであってもよい)が一度に出力される.
6.クライアント、ClientDataSet 1のProviderNameをサーバー側のDataSetProvider 1に設定する.
7.クライアント、設計期間、ClientDataSet 1ポップアップフィールド編集ボックスをダブルクリックし、このボックスの右クリックメニューにAdd All Fieldsがあればフィールドを追加します.これらのフィールドには、FdQuery 1に対応するテーブルのすべてのフィールドに加えて、1つのフィールドが追加されます.このフィールドは実は中に埋め込まれたスレーブテーブルです.フィールド名はFdQuery 2です.
8.クライアント、設計期間、ClientDataSet 2のDataSetFieldは前述のFdQuery 2フィールドであり、ClientDataSet 2ポップアップフィールド編集ボックスをダブルクリックし、右クリックメニューでAdd All Fieldsを選択するとテーブル(つまりFdQuery 2対応テーブル)のすべてのフィールドからロードされる.
9.DataSetProvider 1から実行する.GetRecordsメソッドで取得するパケット(データ型はOleVariant)はクライアントに渡され、ClientDataSet 1となる.Data:=上記サーバ側から取得したパケットClientDataSet 2にも同時にデータがある.
FireDACアーキテクチャの下で、FdQueryからネストされたプライマリ・セカンダリ・データを取得する方法はまだ分かりません.
ただし、FireDACは、ネストされているかどうかにかかわらず、複数のテーブルのデータを一度にクライアントに出力することができます.次に、ネストされたテーブルのプライマリ・スレーブ関係を、クライアントでプライマリ・スレーブ関係を確立する方法によって表示します.
-----------FireDACは、複数のテーブルのデータを一度にクライアントに出力する-----------
FireDACの実装方法
1.前と同様に、サーバ側FdQuery 1とFdQuery 2は、それぞれデータベースサーバの2つのテーブルに対応している.
2.FDSchemaAdapter 1をドラッグします.FdQuery 1とFdQuery 2のSchemaAdapter属性をFDSchemaAdapter 1に指定します.
3.出力データ、コードは以下の通り:
FDSchemaAdapter1.SaveToStream(AStream, TFDStorageFormat.sfBinary);

4.上記AStreamは、サーバ側から出力されるデータであり、FdQuery 1のデータとFdQuery 2のデータを同時に含んでいる.このデータをクライアントに渡すと、
5.クライアント、FDSchemaAdapter 3をドラッグします.
6.クライアント、2つのFDTableAdapter 31とFDTableAdapter 32をドラッグする.
7.FDTable Adapter 31及びFDTable Adapter 32のSchemaAdapterをFDSchemaAdapter 3とする.
8.FDTable Adapter 31を設定.DatSTableName属性はFdQuery 1、FDTable Adapter 32のこの属性はFdQuery 2である.ここの名前は必ずサーバー側のFdQuery 1とFdQuery 2の名前に対応しなければならないので、間違えたり、勝手に名前をつけたりしてはいけません.
9.2つのFDMemTable 31およびFDMemTable 32をドラッグし、それぞれのAdapter属性をFDTableAdapter 31およびFDTableAdapter 32とする.
10.上記の設定ができたら、実行コードは以下の通りです.
FDSchemaAdapter3.LoadFromStream(AStream, TFDStorageFormat.sfBinary);

つまり、FDSchemaAdapter 3でAStreamをロードすることで、2つのFdMemTableに同時にサーバ側からのデータをロードすることができます.
11.クライアントで2つのDataSource 31とDataSource 32をドラッグして、それぞれFDMemTable 31とFDMemTable 32に対応する.
12.クライアントで2つのDBGrid 1とDBGrid 2をドラッグして、上記2つのDataSourceに対応します.
13.ここで、コードを実行すると、クライアントがロードしたデータが2つのDBGridに表示されます.ここで見られるスレーブテーブルのデータは、MIDASアーキテクチャのようにネストされたテーブルのスレーブデータではなく、すべてのデータです.
14.DBGridにマスターデータを表示するには、FDMemTable 32のいくつかの属性を設定します.
14.1. MasterSourceはData Source 31です.
14.2. MasterFieldsはID(関連する外部キーフィールド名);
14.3. IndexFieldNameはIDです.これが設定されていなければ、マスタテーブルのIDレコードによってフィルタリングされたレコードをマスタテーブルに追従するのではなく、テーブルDBGridから全てのレコードが表示される.
15.ここで、ランタイムクライアントインタフェース上の2つのDBGridは、2つのテーブルのデータを見ることができ、マスタスレーブ関係である.
ここで,3層データベースがFireDACの下でサーバ側から複数のテーブルのデータを一度に取得する方法はすでに解決されている.クライアントの複数のテーブルのデータを一度にコミットする方法(特にプライマリ・スレーブ・テーブルは、サーバ側の同じ取引で完了するために一度にコミットする必要があります)、次回にします.