TClientDataSet[9]: 计算字段和 State
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的更多相关文章
- openerp学习笔记 计算字段、关联字段(7.0中非计算字段、关联字段只读时无法修改保存的问题暂未解决)
计算字段.关联字段,对象修改时自动变更保存(当 store=True 时),当 store=False 时,默认不支持过滤和分组7.0中非计算字段.关联字段只读时无法修改保存的问题暂未解决 示例代码: ...
- 在标准实体特殊消息上注册插件及Dynamics CRM 2015中计算字段的使用
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复157或者20151005可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 前面的 插件系列博客教程 讲述了 ...
- 读书笔记--SQL必知必会07--创建计算字段
7.1 计算字段 字段(field),基本与列(column)含义相同. 利用计算字段可以直接从数据库中检索出转换.计算或格式化过的数据. 计算字段不实际存在于数据库表中,是运行时在SELECT语句内 ...
- 使用XtraReport的CalculatedFiled(计算字段)实现RDLC报表中表达式
DevExpress报表确实强大,花样繁多,眼花缭乱. 这次使用XtraReport开发报表,很多问题在官方的文档中并没有详细的说明,特此记录. 1.XtraReport中FormattingRule ...
- EF Power Tools的Reverse Engineer Code First逆向生成Model时处理计算字段
VS2013上使用EF Power Tools的Reverse Engineer Code First逆向生成Model时,没有处理计算字段.在保存实体时会出现错误. 可以通过修改Mapping.tt ...
- (转)SQL Server 2005 中的计算字段
在实际工作上遇到的问题: 在订单表中有某项商品是将“订购数量(Quantity)”乘以“单件价格(UnitCost)”等于该项商品的总价(Subtotal). 在数据表中有的列(以下皆改叫为“字段”) ...
- SQL学习之计算字段的用法与解析
一.计算字段 1.存储在数据库表中的数据一般不是应用程序所需要的格式.大多数情况下,数据表中的数据都需要进行二次处理.下面举几个例子. (1).我们需要一个字段同时显示公司名和公司地址,但这两个信息存 ...
- QuickBI助你成为分析师——计算字段功能
摘要: 在用户创建报表时,通过现有字段数据不能直接满足展示需求,需要进行一定建模操作.目前产品支持在数据集编辑界面进行初步建模,下面主要介绍新建字段功能,以达到展示需求. 在用户创建报表时,有时通过现 ...
- Dynamics CRM项目实例之六:积分管理,汇总字段,计算字段,快速查看视图
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复137或者20141228可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 博文讲述的主要是如 ...
随机推荐
- POJ1127 Jack Straws
给你一些线段,求出哪些线段是相连的,哪些是不相连的.相连包括间接相连,即这两条线段本身不直接相连,而是通过其它线段的连接而间接相连. 线段相交+并查集 这里主要说如何判断线段相交:快速排斥试验+跨立试 ...
- day 43
今日内容 1.视图 2.事务 3.SQL注入问题 4.存储过程 首先回顾一下昨天所学 子查询: in (select a where 字段名 in select b) exists(判断后面语句执行结 ...
- 第7章 使用寄存器点亮LED灯
第7章 使用寄存器点亮LED灯 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...
- OpenShift-EFK日志管理
1.准备工作 思路: 在OpenShift容器平台上以daemonset方式部署Fluentd收集各节点中的日志.更改其配置让日志输出到外部Elasticsearch中,最终通过Kibana展示. 资 ...
- 调用聊天机器人 -小I机器人
public static string sendMsg2(string msg) { try { msg = Uri.EscapeDataString( msg); string sUrl = &q ...
- 20155233 Exp1 PC平台逆向破解(5)M
Exp1 PC平台逆向破解(5)M 实践一 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数. 步骤 1.cp pwn1 pwn20155233拷贝pwn1文件,命名为pwn201 ...
- PostgreSQL基础知识与基本操作索引页
磨砺技术珠矶,践行数据之道,追求卓越价值 返回顶级页:PostgreSQL索引页 luckyjackgao@gmail.com 本页记录所有本人所写的PostgreSQL的基础知识和基本操作相关文摘和 ...
- 【转载】WINAPI宏
原文:http://blog.sina.com.cn/s/blog_3f27dee60100qi4j.html 一直搞不懂为什么在函数前面加上WINAPI.CALLBACK等是什么意思 又不是返回值 ...
- 升级webpack2
更新:webpack3已经出来了,官方说从2到升级到3不用改一行配置,98%的人没有错误. 项目中用的是webpack1.webpack2已经出来一段时间了.决定升级.其实改动不是很大.修改加测试共花 ...
- CS229笔记:生成学习算法
在线性回归.逻辑回归.softmax回归中,学习的结果是\(p(y|x;\theta)\),也就是给定\(x\)的条件下,\(y\)的条件概率分布,给定一个新的输入\(x\),我们求出不同输出的概率, ...