ClientDataSet的隐含功能------转载《Delphi 从入门到精通》
来源:互联网 发布:斗鱼妃凌雪淘宝店多少 编辑:程序博客网 时间:2024/05/22 03:53
======================================================
注:本文源代码点此下载
======================================================
keylife富翁笔记
作者: hongxing_dl
标题: clientdataset的隐含功能
关键字: midas
分类: 开发经验
密级: 公开
clientdataset的隐含功能------转载《delphi 从入门到精通》
可能与前面的笔记有重复的地方
clientdataset组件支持很多特性,其中一些与三级结构有关,而且还可以用在其他环境中。该组件说明了一个数据库完全映象在内存中,这使得可以进行动态的操作,如建立一个索引,其他数据集合通常不支持该特性。例如,为了对查询分类,我们通常是重新执行它。为了索引一个局部表格,需要定义索引。只有ado数据集合有一些与clientdataset一样的动态索引功能。
索引并不是clientdataset提供的全部功能。当我们拥有了索引之后,可以基于它定义组,可能是多级别的分组。对于确定一个记录在组中的位置(头、尾或中间位置),甚至有专门的支持。在组或整个数据表格中,我们可以定义总计;也就是说,可以动态计算整个表格或当前组中一列的总和或平均值。数据不需要发送给物理服务器,因为这些总计操作发生在内存中。我们甚至可以定义新的总计字段,可以直接与数据敏感控件相连。
注意,所有这些特性不但可以用与midas应用程序,还可以用与客户机/服务器,甚至是局部瘦应用程序。事实上,clientdataset组件可以从远程midas连接、局部数据集合(建立起数据的快照)、或局部文件(就象在公文包模式中一样,但使用的只是在客户机数据集合中定义的整个表格)中获得起数据。
这是另一个需要研究的领域,所以将向读者演示两个范例来突出关键特性。这些范例没有基于midas,而是基于局部表格。
1、定义抽象的数据的数据类型
vcl数据库支持的一个有趣的特性是,当我们基于局部文件使用clientdataset时,可以定义抽象的数据类型。只需在窗体上放置一个clientdataset组件,为fielddefs属性激活编辑器,添加两个字段,并为他们的datatype属性选择ftadt值。现在,移到childdefs属性,并定义子字段,下面是adtdemo范例的字段定义:
fielddefs =
datatype = ftadt
size = 2
end>
在此,只需为clientdataset的filename属性输入一个名称,用鼠标右键单击组件,并选择create table命令即可;我们准备编译并运行应用程序(在向它连接数据敏感组件之后)。数据会自动从提供的文件中读取,关闭程序时会将变化保存在文件中。
如果使用dbgrid查看结果数据集合,它允许我们展开或压缩adt字段的子字段。我们可以通过定义字段的ongettext事件提供它的压缩值(在delphi4 中有一个缺省值,但delphi5中没有):
procedure tform1.clientdataset1namegettext(sender:tfield;
var text:string;displaytext:boolean);
begin
text:=clientdataset1namefirstname.asstring+' '+
clientdataset1namelastname.asstring;
end;
2、动态索引
一旦clientdataset上有了数据,数据就已全部处于内存中了。当我们将组件基于局部文件中时(如在adtdemo范例中),在程序启动时整个文件就被装载到了内存总。这与从paradox数据表格中装载数据(bde只装载正访问的字段)不同。
将整个表格装在内存中的优点是,我们可以快速地对它进行分类。使用clientdataset组件,我们可以通过赋给indexfieldnames属性相应的字段名来实现分类。在adtdemo(以及很多程序)中,该索引变动会在单击dbgrid控件的标题(触发ontitleclick事件)时执行:
procedure tform1.dbgrid1titleclick(column:tcolumn);
begin
if column.field.fullname = 'name' then
clientdataset1.indexfieldnames := 'name.lastname'
else
clientdataset1.indexfieldnames := column.field.fullname;
end;
由于adt定义,程序使用了字段的fullname属性(而不是fieldname属性)。事实上,对于子字段来说,索引应该基于name.lastname,而不是lastname。而且adt字段不能自己被索引,所以如果选择它,程序会使用lastname子字段作为索引。这些索引不是持久性的;它们没有保存在文件中,而只是在内存中应用于数据。
技巧:clientdataset可以拥有基于计算字段的索引,特别是内部计算字段,这种字段类型只能用于该数据集合。
3、分组
一旦为clientdataset定义了一个索引,就可以通过该索引对数据进行分组了。实际上,一组被定义为连续记录的一个列表(根据索引),记录中被索引的字段的值不会改变。例如,如果有一个基于国家的索引,带有该国家的所有地址都将归为一组。
cdscalcs范例有一个clientdataset组件,它同样从dbdemos数据库的country表格中读取其数据。该操作可以在设计时,使用clientdataset组件快捷菜单的assign local data命令来执行。为了在运行时读取数据,获得一个更新的快照,可以向窗体添加一个datasetprovider组件,如下连接三个组件:
object table :ttable
active = true
databasename = 'dbdemos'
tablename = 'country.db'
end
object datasetprovider1: tdatasetprovider
dataset = table1
end
object clientdataset1: tclientdataset
providername = 'datasetprovider1'
end
现在我们来看看组的定义。该定义可以通过为索引指定一个分组级别,与索引定义一起获得:
object clientdataset1: tclientdataset
indexdefs =
indexname = 'clientdtaset1index1'
当拥有了一组之后,我们可以在dbgrid中向用户显示分组结构。只需为分组字段(在范例中是continent字段)处理ongettext事件,只有当记录是组的第一个记录是才显示文本:
procedure tform1.clientdataset1continentgettext(sender:tfield;
var text:string;displaytext:boolean);
begin
if gbfirst in clientdataset1.getgroupstate(1) then
text:= sender.asstring
else
text:='';
end;
4、定义合计
clientdataset组件另一个功能强大的特性是对合计的支持。合计是一个基于多个记录的计算值,如整个数据表格或一组记录(使用我们刚才讨论过的分组逻辑来定义)中某个字段的和值或平均值。合计是可持续的;也就是说,如果有一个记录发生改变,会立刻重新计算合计值。例如,当拥护在发货清单条目中输入时,发货单的总和会自动被重新计算出来。
注意:::合计是递增维持的,而不是每当有一个值改动时就重新计算所有的值。合计的更新利用了clientdataset追踪的delta。例如,当字段发生改变时,为了更新sum,clientdataset会从合计中读取旧值,并加上新值。只需要两次计算,即使在该合计组中有上千行。因此,合计更新是瞬时的。
有两种方法定义合计。我们可以使用clientdataset(是一个集合)的aggregates属性,或可以使用fields编辑器定义合计字段。在这两种情况下,我们定义的合计表达式,赋给它一个名称,并将它与一个索引和一个分组级别(除非想将它应用于整个数据表格)连接。下面是cdscalcs范例的aggregates集合:
object clientdataset1: tclientdataset
aggregates =
aggregatesactive = true
注意,在上面的最后一行代码中,除了激活每个想使用的特定合计之外,我们还必须为合计激活支持。解除合计是重要的,因为合计太多会减慢程序执行的速度。我们曾提到的另一种方法是使用fields编辑器,在其快捷菜单中选择new field命令,并选择aggregate选项(只有在一个clientdataset中可以与internalcalc选项一起使用)。下面是一个合计字段的定义:
object clientdataset1: tclientdataset
object clientdataset1totalarea: taggregatefield
fieldname = 'totalarea'
readonly = true
visible = true
active = true
displayformat = '###,###,###'
expression = 'sum(area)'
groupinglevel = 1
indexname = 'clientdataset1index1'
end
合计字段在fields编辑器中被显示为独立的一组。与普通合计相比,使用合计字段的优点是,我们可以定义显示格式,并将字段直接与数据敏感控件相连,如cdscalcs范例中的dbedit。因为合计与一个组相连,所以要选择了另一组的记录,输出就会被自动更新。而且,如果改变数据,合计值也会立刻显示新值。
为了使用普通合计,必须编写一些代码,如下例子中所示(注意合计的value是一个变体):
procedure tform1.button1click(sender: tobject);
begin
label1.caption:= 'area : '+ clientdataset1totalarea.displaytext +
#13'population : ' + formatfloat('###,###,###',clientdataset1.aggregates[1].value)
+ #13'number : ' + inttostr(clientdataset1.aggregates[0].value);
end;
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
- ClientDataSet的隐含功能------转载《Delphi 从入门到精通》
- ClientDataSet的隐含功能------转载《Delphi 从入门到精通》
- Java学习从入门到精通[转载]
- Google从入门到精通(转载)
- [转载]Java学习从入门到精通
- Google从入门到精通(转载)
- Google从入门到精通[转载]
- Google从入门到精通[转载]
- 【转载】Java学习从入门到精通
- Java学习从入门到精通[转载]
- Java学习从入门到精通(转载)
- CUDA从入门到精通(转载)
- 【转载】google搜索从入门到精通
- Delphi 7从入门到精通之二
- Delphi 7从入门到精通之二
- 电子书下载:Delphi 7 从入门到精通
- 从入门到精通
- Google搜索从入门到精通V4.0 (转载)
- Ajax技术案例分析__AJAX案例研究之Gmail
- 找到几篇有关delphi vcl消息机制的文章,收藏先~
- Javascript访问html页面的控件
- 在HTML中利用js调用php的内容
- delphi窗体动态设计 在系统运行时动态更改控件属性
- ClientDataSet的隐含功能------转载《Delphi 从入门到精通》
- ajax操作调用后台代码之(一)
- lexloo
- Html 常用标志总结
- AJAX学习笔记(一)
- 减小Delphi2010程序的尺寸(关闭RTTI反射机制)
- Ajax简单客户登陆验证
- 【转】华为Java笔试题
- delphi热键设定的方法