TClientDataSet 中计算字段有两种: Calculated(计算字段)、InternalCalc(内部计算字段).

两者区别是: Calculated 在每次需要时都要重新计算; InternalCalc 只需要计算一次.
Calculated 需要计算的时间, InternalCalc 需要存取的时间; 当然后者快.

计算字段不会被保存到文件.


下面的例子先定义了两个整数字段: sum1、sum2;
又定义了两个计算字段: SUM(求和)、MUL(求积), 分别指定了 Calculated、InternalCalc.

计算是在 TClientDataSet 的 OnCalcFields 事件中完成的, 每当需要计算结果时事件会被自动激活.
除了 OnCalcFields 事件中的代码外, 其他都可以在设计时完成; 这里是动态完成的.


//准备: 窗体放置 ClientDataSet1、DataSource1、DBGrid1(关联一下)、Button1
//程序运行后, 可用 Tab 和 ↑ ↓ → ← 键配合着输入测试数据. { 建立数据集, 包括计算字段 }
procedure TForm1.Button1Click(Sender: TObject);
begin
  with TIntegerField.Create(Self) do
  begin
    FieldName := 'num1';      { FieldKind 的默认值是 fkData }
    DataSet := ClientDataSet1;
  end;   with TIntegerField.Create(Self) do
  begin
    FieldName := 'num2';
    DataSet := ClientDataSet1;
  end;   with TIntegerField.Create(Self) do
  begin
    FieldName := 'SUM';
    FieldKind := fkCalculated;  { 指定为计算字段 }
    DataSet := ClientDataSet1;
  end;   with TIntegerField.Create(Self) do
  begin
    FieldName := 'MUL';
    FieldKind := fkInternalCalc; { 指定为内部计算字段 }
    DataSet := ClientDataSet1;
  end;   ClientDataSet1.CreateDataSet;
  Button1.Enabled := False;
end; { OnCalcFields 事件 }
procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet);
begin
  { 获取计算字段的值 }
  DataSet['SUM'] := DataSet['num1'] + DataSet['num2'];   { 获取内部计算字段的值; 一般要先判断一下以避免重复运算 }
  if DataSet.State = dsInternalCalc then
    DataSet['MUL'] := DataSet['num1'] * DataSet['num2'];
end;

在上面程序的基础上再添加一个 Timer1, 为详细测试 Calculated 和 InternalCalc 的区别, 代码修改如下:


var
  Calc, InternalCalc: Integer; procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  with TIntegerField.Create(Self) do
  begin
    FieldName := 'num1';
    DataSet := ClientDataSet1;
  end;   with TIntegerField.Create(Self) do
  begin
    FieldName := 'num2';
    DataSet := ClientDataSet1;
  end;   with TIntegerField.Create(Self) do
  begin
    FieldName := 'SUM';
    FieldKind := fkCalculated;
    DataSet := ClientDataSet1;
  end;   with TIntegerField.Create(Self) do
  begin
    FieldName := 'MUL';
    FieldKind := fkInternalCalc; { 指定为内部计算字段 }
    DataSet := ClientDataSet1;
  end;
  ClientDataSet1.CreateDataSet;   { 添加测试数据 }
  ClientDataSet1.DisableControls;
  for i := to do ClientDataSet1.AppendRecord([i, i]);
  ClientDataSet1.EnableControls;   Button1.Enabled := False;
end; procedure TForm1.ClientDataSet1CalcFields(DataSet: TDataSet);
begin
  Inc(Calc);
  DataSet['SUM'] := DataSet['num1'] + DataSet['num2'];   if DataSet.State = dsInternalCalc then
  begin
    Inc(InternalCalc);
    DataSet['MUL'] := DataSet['num1'] * DataSet['num2'];
  end;
end; procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Text := Format('Calc: %d; InternalCalc: %d', [Calc, InternalCalc]);
end;

测试图:


TDataSetState.State: TDataSetState;

TDataSetState = (
dsInactive,    { 数据集被关闭 }
dsBrowse,      { 浏览模式 }
dsEdit,        { 编辑模式, 意味着 Edit 方法已被调用, 而编辑后的数据尚未被提交 }
dsInsert,      { 插入模式, 即 insert 被调用, 但变化还没有提交 }
dsSetKey,      { 设置键值模式, 意味着 SetKey 被调用, 而 GotoKey 尚未被调用 }
dsCalcFields,  { OnCalcFields 事件已发生, 对记录值的计算正在进行中 }
dsFilter,      { 数据集正在处理一个记录过滤器、查找字段或其他需要用到过滤器的操作 }
dsNewValue,    { 数据集处于 NewValue 属性被访问的临时状态 }
dsOldValue,    { 数据集处于 OldValue 属性被访问的临时状态 }
dsCurValue,    { 数据集处于 CurValue 属性被访问的临时状态 }
dsBlockRead,    { 数据正被写入缓冲区, 此时数据库表中指针的移动并不触发数据感知组件的更新和事件的发生 }
dsInternalCalc, { 一个字段值正在被计算, 以供一个有 fkInterternalCalc 类型的 Fieldkind 属性的字段使用 }
dsOpening      { 数据集处于正在打开状态但是还没有结束, 这种状态发生在数据集被异步打开时 }
);

 
 

TClientDataSet[9]: 计算字段和 State的更多相关文章

  1. openerp学习笔记 计算字段、关联字段(7.0中非计算字段、关联字段只读时无法修改保存的问题暂未解决)

    计算字段.关联字段,对象修改时自动变更保存(当 store=True 时),当 store=False 时,默认不支持过滤和分组7.0中非计算字段.关联字段只读时无法修改保存的问题暂未解决 示例代码: ...

  2. 在标准实体特殊消息上注册插件及Dynamics CRM 2015中计算字段的使用

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复157或者20151005可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 前面的 插件系列博客教程 讲述了 ...

  3. 读书笔记--SQL必知必会07--创建计算字段

    7.1 计算字段 字段(field),基本与列(column)含义相同. 利用计算字段可以直接从数据库中检索出转换.计算或格式化过的数据. 计算字段不实际存在于数据库表中,是运行时在SELECT语句内 ...

  4. 使用XtraReport的CalculatedFiled(计算字段)实现RDLC报表中表达式

    DevExpress报表确实强大,花样繁多,眼花缭乱. 这次使用XtraReport开发报表,很多问题在官方的文档中并没有详细的说明,特此记录. 1.XtraReport中FormattingRule ...

  5. EF Power Tools的Reverse Engineer Code First逆向生成Model时处理计算字段

    VS2013上使用EF Power Tools的Reverse Engineer Code First逆向生成Model时,没有处理计算字段.在保存实体时会出现错误. 可以通过修改Mapping.tt ...

  6. (转)SQL Server 2005 中的计算字段

    在实际工作上遇到的问题: 在订单表中有某项商品是将“订购数量(Quantity)”乘以“单件价格(UnitCost)”等于该项商品的总价(Subtotal). 在数据表中有的列(以下皆改叫为“字段”) ...

  7. SQL学习之计算字段的用法与解析

    一.计算字段 1.存储在数据库表中的数据一般不是应用程序所需要的格式.大多数情况下,数据表中的数据都需要进行二次处理.下面举几个例子. (1).我们需要一个字段同时显示公司名和公司地址,但这两个信息存 ...

  8. QuickBI助你成为分析师——计算字段功能

    摘要: 在用户创建报表时,通过现有字段数据不能直接满足展示需求,需要进行一定建模操作.目前产品支持在数据集编辑界面进行初步建模,下面主要介绍新建字段功能,以达到展示需求. 在用户创建报表时,有时通过现 ...

  9. Dynamics CRM项目实例之六:积分管理,汇总字段,计算字段,快速查看视图

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复137或者20141228可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me!        博文讲述的主要是如 ...

随机推荐

  1. Python2.7-textwrap

    textwrap主要针对英文的文本 模块内方法: wrap(text[, width, ...]),把text分成每行width长,返回一个列表,没有结尾的\n.fill(text[, width, ...

  2. anaconda使用以及创建python3.7+pytorch1.0虚拟环境以及Jupyter notebook初级使用

    查看所有已安装的软件包$ conda list# packages in environment at S:\Users\jiangshan\Anaconda3:## Name Version Bui ...

  3. (二)Lua脚本语言入门(关于函数)

    上一篇文章忘了插入代码了,方便粘贴复制...... 函数 对于c语言就是 void aa()//c语言是用void { print("这是一个函数") } Lua就变成了 func ...

  4. jquery练习笔记

    <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  5. ADO.NET TransactionScope使用说明(转载)

    TransactionScope是.Net Framework 2.0滞后,新增了一个名称空间.它的用途是为数据库访问提供了一个“轻量级”[区别于:SqlTransaction]的事物.使用之前必须添 ...

  6. git reset之后找回本地未提交的代码

    头脑发热使用了git reset命令回退到了之前的一个版本,结果把本地没有提交的代码给覆盖掉了..... 作为一个bug员自然是想恢复,毕竟重新写还得再测一遍,本着能懒一点是一点的原则,开始了恢复代码 ...

  7. HO引擎近况20190110

    前两天更新完,挺兴奋 趁着兴奋把虚拟机里面的MACOSX从10.12.6升级到了10.14 然后装XCODE,虽然比较熟悉了,但是架不住慢啊 先下载了一个DMG的镜像文件,用不了,转成ISO也不行 然 ...

  8. 在testbench从文件读入激励

    在验证verilog逻辑模块功能时候,我们可以从文件中读入激励,便于大规模的验证.文件中的数据我们可以用c++编写程序产生. 第一种读入文件的方法是用系统函数:$readmemb, readmemh, ...

  9. stl源码剖析 详细学习笔记 set map

    // //  set map.cpp //  笔记 // //  Created by fam on 15/3/23. // // //---------------------------15/03 ...

  10. Git多人协作工作流程

    前言 之前一直把Git当做个人版本控制的工具使用,现在由于工作需要,需要多人协作维护文档,所以去简单了解了下Git多人协作的工作流程,发现还真的很多讲解的,而且大神也已经讲解得很清楚了,这里就做一个简 ...