運行時的設計方法:
設計時的准備工作:
ClIEntDataSet1、DataSource1、DBGrid1 並關聯, 這用於主表;
ClIEntDataSet2、DataSource2、DBGrid2 並關聯, 這將成為主表的一個字段(或叫嵌套表);
還可以放個 Splitter1 來協調 DBGrid 的大小.
procedure TForm1.FormCreate(Sender: TObject);
begin
{ 主表: 定義了兩個字段, 其中 "銷售明細" 是 DataSet 字段 }
with TStringFIEld.Create(Self) do begin
FIEldName := '銷售員';
Size := 11;
DataSet := ClIEntDataSet1;
end;
with TDataSetFIEld.Create(Self) do begin
FIEldName := '銷售明細';
DataSet := ClIEntDataSet1;
end;
{ 從表: 定義了三個字段 }
with TIntegerFIEld.Create(Self) do begin
FIEldName := '商品ID';
DataSet := ClIEntDataSet2;
end;
with TStringFIEld.Create(Self) do begin
FIEldName := '商品名稱';
Size := 7;
DataSet := ClIEntDataSet2;
end;
with TIntegerFIEld.Create(Self) do begin
FIEldName := '銷售數量';
DataSet := ClIEntDataSet2;
end;
{ 讓 ClientDataSet1 的 DataSet 字段(銷售明細) 關聯到 ClIEntDataSet2 }
ClientDataSet2.DataSetField := TDataSetField(ClientDataSet1.FIEldByName('銷售明細'));
ClientDataSet1.CreateDataSet; { 數據集 ClientDataSet2 現在是 ClIEntDataSet1 的一個字段 }
{ 添加測試數據 }
ClIEntDataSet1.AppendRecord(['張三']);
ClIEntDataSet2.AppendRecord([1, '手機', 11]);
ClIEntDataSet2.AppendRecord([2, '電腦', 22]);
ClIEntDataSet2.AppendRecord([3, '打印機', 33]);
ClIEntDataSet1.AppendRecord(['李四']);
ClIEntDataSet2.AppendRecord([1, '手機', 55]);
ClIEntDataSet2.AppendRecord([2, '電腦', 66]);
ClIEntDataSet1.AppendRecord(['王五']);
ClIEntDataSet2.AppendRecord([3, '打印機', 77]);
end;
{ 訪問嵌套表的方法 }
procedure TForm1.Button1Click(Sender: TObject);
var
DataSetField: TDataSetFIEld;
begin
DataSetField := ClientDataSet1.FieldByName('銷售明細') as TDataSetFIEld;
ShowMessage(DataSetField.NestedDataSet.FIElds[1].AsString);
ShowMessage(DataSetField.FIElds[1].AsString);
end;
僅就這個例子來講, "商品"和對應的編號應該是統一的, 為避免出錯和輸入方便, 這裡應該使用查找字段.
下面是為添加查找字段重寫的代碼(設計時再多添加一個 ClIEntDataSet3 ):
procedure TForm1.FormCreate(Sender: TObject);
begin
{ 先准備給 ClIEntDataSet2 的查找字段使用的數據集}
with ClIEntDataSet3 do begin
FIEldDefs.Add('ID', ftInteger);
FIEldDefs.Add('Name', ftString, 7);
CreateDataSet;
AppendRecord([1, '手機']);
AppendRecord([2, '電腦']);
AppendRecord([3, '打印機']);
AppendRecord([4, '掃描儀']);
end; //------------------------------------------
{ 主表: 定義了兩個字段, 其中 "銷售明細" 是 DataSet 字段 }
with TStringFIEld.Create(Self) do begin
FIEldName := '銷售員';
Size := 11;
DataSet := ClIEntDataSet1;
end;
with TDataSetFIEld.Create(Self) do begin
FIEldName := '銷售明細';
DataSet := ClIEntDataSet1;
end;
{ 從表: 定義了三個字段 }
with TIntegerFIEld.Create(Self) do begin
FIEldName := '商品ID';
DataSet := ClIEntDataSet2;
end;
with TStringFIEld.Create(Self) do begin { 這個定義為查找字段 }
FIEldName := '商品名稱';
FIEldKind := fkLookup;
DataSet := ClIEntDataSet2;
KeyFIElds := '商品ID';
LookupDataSet := ClIEntDataSet3;
LookupKeyFIElds := 'ID';
LookupResultFIEld := 'Name';
end;
with TIntegerFIEld.Create(Self) do begin
FIEldName := '銷售數量';
DataSet := ClIEntDataSet2;
end;
{ 讓 ClientDataSet1 的 DataSet 字段(銷售明細) 關聯到 ClIEntDataSet2 }
ClientDataSet2.DataSetField := TDataSetField(ClientDataSet1.FIEldByName('銷售明細'));
ClientDataSet1.CreateDataSet; { 數據集 ClientDataSet2 現在是 ClIEntDataSet1 的一個字段 }
{ 添加測試數據 }
ClIEntDataSet1.AppendRecord(['張三']);
ClIEntDataSet2.AppendRecord([1, null, 11]); { 查找字段會自動填寫, 不需要輸入 }
ClIEntDataSet2.AppendRecord([2, null, 22]);
ClIEntDataSet2.AppendRecord([3, null, 33]);
ClIEntDataSet1.AppendRecord(['李四']);
ClIEntDataSet2.AppendRecord([1, null, 55]);
ClIEntDataSet2.AppendRecord([2, null, 66]);
ClIEntDataSet1.AppendRecord(['王五']);
ClIEntDataSet2.AppendRecord([3, null, 77]);
end;
設計時完成數據集字段:
查看原圖(大圖)