文档章节

TClientDataSet[23]: 使用数据集字段(TDataSetField)

涂孟超
 涂孟超
发布于 2014/09/26 15:30
字数 648
阅读 12
收藏 0

运行时的设计方法:



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

 
 
 
 
 

 

 

  

设计时完成数据集字段:



本文转载自:http://www.cnblogs.com/del/archive/2010/02/06/1664908.html

涂孟超
粉丝 12
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
TClientDataSet使用(二)

转自:http://hi.baidu.com/zwl232/blog/item/76f011dfc9543812622798f2.html TClientDataSet    与TTable、TQuery一样,TClientDataSet也是从TDataSet继承下来的,它通常用于多层体系结构的......

天地弦
2007/06/01
0
0
TClientDataSet的使用以及遇到的坑

在Delphi未加入之前,似乎是没有内存表控件的(也许有,可能我不知道吧),但是可以用控件来做内存表使用,即使有了可以使用,我还是觉得更好用一些。 做内存表使用 创建 排序 在定义字段后,...

天朝八阿哥
01/12
157
0
ClientDataSet探讨(1)-介绍

KeyLife富翁笔记 作者: hongxingdl 标题: ClientDataSet探讨(1)-介绍 关键字: midas 分类: 开发经验 密级: 公开 与TTable、TQuery一样,TClientDataSet也是从TDataSet继承下来的,...

天地弦
2004/08/06
0
0
Android开发数据库三层应用-DataSnap

Android开发数据库三层应用-DataSnap 时间:2013-10-24 13:41:54 点击:4988   核心提示:我觉得Delphi最强大的的功能之一就是开发数据库三层应用的DataSnap,在Android上的实现,首先是完...

vga
2014/06/01
227
0
JSon SuperObject 研究2:数据集与JSON对象互转

JSon SuperObject 研究2:数据集与JSON对象互转 JSON不能完全替代XML,但绝对是未来的大势所趋,其优点是简单、体积小、解析更快、解析占用资源更少。在delphi中,数据集是最常用数据存取方式...

vga
2014/12/20
772
2

没有更多内容

加载失败,请刷新页面

加载更多

【0918】正则介绍_grep

【0918】正则介绍_grep 9.1 正则介绍_grep上 9.2 grep中 9.3 grep下 一、正则介绍 正则是一串有规律的字符串,它使用单个字符串来描述或匹配一系列符合某个语法规则的字符串。 二、grep工具 ...

飞翔的竹蜻蜓
19分钟前
4
0
为什么要在网站中应用CDN加速?

1. 网页加载速度更快 在网站中使用CDN技术最直接的一个好处就是它可以加快网页的加载速度。首先,CDN加速的内容分发是基于服务器缓存的,由于CDN中缓存了不少数据,它能够给用户提供更快的页...

云漫网络Ruan
57分钟前
8
0
亚玛芬体育(Amer Sports)和信必优正式启动合作开发Movesense创新

亚玛芬体育和信必优正式启动合作开发Movesense创新,作为亚玛芬体育的完美技术搭档,信必优利用Movesense传感器技术为第三方开发移动应用和服务。 Movesense基于传感器技术和开放的API,测量...

symbiochina88
今天
4
0
创龙TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA核心板规格书

SOM-TL437xF是一款广州创龙基于TI AM437x ARM Cortex-A9 + Xilinx Spartan-6 FPGA芯片设计的核心板,采用沉金无铅工艺的10层板设计,适用于高速数据采集和处理系统、汽车导航、工业自动化等领...

Tronlong创龙
今天
4
0
好程序员Java学习路线分享MyBatis之线程优化

  好程序员Java学习路线分享MyBatis之线程优化,我们的项目存在大量用户同时访问的情况,那么就会出现大量线程并发访问数据库,这样会带来线程同步问题,本章我们将讨论MyBatis的线程同步问...

好程序员官方
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部