zoukankan      html  css  js  c++  java
  • TClientDataSet[23]: 使用数据集字段(TDataSetField)


    运行时的设计方法:



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

    设计时完成数据集字段:



  • 相关阅读:
    Mybatis-plus学习笔记(一)
    Mysql基础(四)分组查询及连接查询
    Mysql 基础(三)排序查询及常用函数
    CyclicBarrier 使用详解
    countDownLatch
    pom所有依赖version红色但是不影响运行
    iText5实现Java生成PDF文件完整版
    【Maven】---Nexus私服配置Setting和Pom
    引用、指针、const、define、static、sizeof、左值右值
    事物隔离级别、MVCC以及数据库中常见锁介绍
  • 原文地址:https://www.cnblogs.com/del/p/1664908.html
Copyright © 2011-2022 走看看