运行时的设计方法:
设计时的准备工作:
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;
设计时完成数据集字段: