随笔 - 2146  文章 - 97 评论 - 11767 trackbacks - 253


运行时的设计方法:



设计时的准备工作:
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;


设计时完成数据集字段:



posted on 2010-02-06 12:51  万一  阅读(...)  评论(...编辑  收藏