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! 博文讲述的主要是如 ...
随机推荐
- leetcode121—Best Time to Buy and Sell Stock
Say you have an array for which the ith element is the price of a given stock on day i. If you were ...
- Android给拼接好的Bitmap加上个性化边框
在上一节中将到将若干张图片拼接成为一张图片.但是这种简单的操作往往不能满足实际的需求,有时我们会需要给图片添加上个性化的边框,来更好的展示图片. 下面就讲一下在图片拼接后如何给bitmap添加边框. ...
- C. Greedy Arkady
kk people want to split nn candies between them. Each candy should be given to exactly one of them o ...
- POJ 2367 Genealogical tree 拓扑排序入门题
Genealogical tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8003 Accepted: 5184 ...
- 6-51单片机ESP8266学习-AT指令(8266TCP服务器--做自己的AndroidTCP客户端发信息给单片机控制小灯的亮灭)
http://www.cnblogs.com/yangfengwu/p/8776712.html 先把源码和资料链接放到这里 链接: https://pan.baidu.com/s/1jpHZjW_7 ...
- 【转】PHP之FastCGI与mod_php详解
原文地址:http://article.gitos.cn/2015/Aurthur/PHP-Mod-PHP-And-Fast-CGI-Explain.html 背景 PHP最常用的方式是以模块的方式( ...
- rpm yum apt-get redhat centos ubuntu
rpm是由红帽公司开发的软件包管理方式,使用rpm我们可以方便的进行软件的安装.查询.卸载.升级等工作.但是rpm软件包之间的依赖性问题往往会很繁琐,尤其是软件由多个rpm包组成时.Yum(全称为 Y ...
- sql 两表更新
UPDATE sale_origin_line set state='cancel' from sale_origin p,sale_origin_line q where p.id=q.or ...
- 大数据入门第十七天——storm上游数据源 之kafka详解(一)入门与集群安装
一.概述 1.kafka是什么 根据标题可以有个概念:kafka是storm的上游数据源之一,也是一对经典的组合,就像郭德纲和于谦 根据官网:http://kafka.apache.org/intro ...
- 20155337《网络对抗》Exp5 MSF基础应用
20155337<网络对抗>Exp5 MSF基础应用 实践目标 本实践目标是掌握metasploit的基本应用方式,重点常用的三种攻击方式的思路.具体需要完成: 1.1一个主动攻击实践,如 ...