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. 在Node.js中操作文件系统(一)

    在Node.js中操作文件系统 在Node.js中,使用fs模块来实现所有有关文件及目录的创建,写入及删除操作.在fs模块中,所有对文件及目录的操作都可以使用同步与异步这两种方法.比如在执行读文件操作 ...

  2. nodeSelector + deamonset

    DaemonSet 配置文件的语法和结构与 Deployment 几乎完全一样,只是将 kind 设为 DaemonSet. 选择运行节点:当指定.spec.template.spec.nodeSel ...

  3. Eclipse-快捷键大全(转载)

    快速展开类:ctrl + shift +*(小键盘) 快速关闭类:ctrl+ shift + /(小键盘)  Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行 Ctrl ...

  4. 20155333 《网络对抗》 Exp6 信息搜集与漏洞扫描

    20155333 <网络对抗> Exp6 信息搜集与漏洞扫描 基础问题 哪些组织负责DNS,IP的管理? 全球根服务器均由美国政府授权的ICANN统一管理,负责全球的域名根服务器.DNS和 ...

  5. python 回溯法 子集树模板 系列 —— 1、8 皇后问题

    问题 8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 分析 为了简化问题,考虑到8个皇后不同行,则每一行放置一个皇后,每一行的 ...

  6. PHP 练习(租房子)

    一.题目要求 二.题目做法 1.建立数据库 2.封装类文件 <?php class DBDA { public $fuwuqi="localhost"; //服务器地址 pu ...

  7. 5.Xilinx RapidIO核例子工程源码分析

    https://www.cnblogs.com/liujinggang/p/10091216.html 一.软件平台与硬件平台 软件平台: 操作系统:Windows 8.1 64-bit 开发套件:V ...

  8. python3获取主机名、主机IP

    python3可以通过socket模块获取主机名及主机IP 代码如下: *********************************************************** 学习永远 ...

  9. 1、Docker概述与安装

    1.Docker概述 原文地址:https://docs.docker-cn.com/engine/docker-overview/#docker-engine Docker是一个开发,集装,运行应用 ...

  10. ReactJS实用技巧(1):JSX与HTML的那些不同

    在项目中使用ReactJS也已经有大半年了,收获很多也踩过不少坑.不想把这个系列写成抄书似的罗列,旨在总结些常用的技巧及常见的坑,以帮助初心者快速入门,想系统学习的同学还是多阅读文档. JSX本质上与 ...