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 = < item name = \'clientdataset1index1\' fields = \'continent\' groupinglevel = 1 end> 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 = < item Active = True AggregateName = \'Count\' Expression = \'Count(Name)\' GroupingLevel = 1 IndexName = \'ClientDataSet1Index1\' Visible = False end item Active = True AggregateName = \'TotalPopulation\' Expression = \'SUM(POPULATION)\' Visible = False end> 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; 来源:考试大-计算机二级考试 |
|
来自: 远在南非 > 《TClientDataSet控件》