ClientDataSet应用
最近维护一个项目,里面用到ClientDataSet,由于之前接触ClientDataSet比较少,所以这个星期补了一下关于ClientDataSet的知识,并在此记录下我所了解到的并应用到实际项目中的ClientDataSet的知识。
项目新需求:1.从别的数据库导入物料资料,并允许操作员做修改后保存提交;2.从别的数据库导入价格资料,并允许操作员做出修改并保存;3.记录相应的日志。4.允许操作员过滤关键字查找。
(PS:项目的数据连接模式为:ADOConnection→ADOQuery→DataSetProvider→ClientDataSet→DataSource→数据集显示控件,包括DBGrid,DBLookupComboboxEh等)
更新单条记录
If cdsRecord.UpdateStatus <> usUnModified then //让clientdataset处于非编辑状态
Raise Exception.Create('You must apply updates before refreshing the current record.');
cdsRecord.RefreshRecord;//更新单条记录,此处要注意,不单要在ClientDataSet中设置主键,要去对应的adoquery设置主键(ProviderFlags的pfInKey设置为true)
过滤
cdsRecord.Filtered := False;
cdsRecord.Filter := 'itemcode='+QuotedStr(code);
cdsRecord.Filtered := True;
如果过滤条件为空,则显示全部记录
cdsRecord.Filtered := False;
cdsRecord.Filter :='itemcode like '+QuotedStr('%%');
cdsRecord.Filtered := True;
过滤条件集添加“全部”记录
cdsLookUp.Close;
cdsLookUp.CommandText := 'select * from jc_zd_item';
cdsLookUp.Open;
cdsLookUp.First;
cdsLookUp.InsertRecord(['','全部','','QB']);
记录日志
在提交前的事件cdsRecordBeforeApplyUpdates中处理
procedure TForm1.cdsRecordBeforeApplyUpdates(Sender: TObject;
var OwnerData: OleVariant);
var
csdTemp: TClientDataSet;
i : Integer;
begin
//准备提交
if not (cdsRecord.ChangeCount>) then //判断数据集是否有更改,ChangeCount>0表示有更改
Exit;
csdTemp := TClientDataSet.Create(nil);
csdTemp.Data := cdsRecord.Data;//复制数据集,否则在这个事件里面处理自身的数据集会进入死循环
csdTemp.First; if not adqLog.Active then //adqLog是连接日志表的ADOQuery,属性LockType选择ltBatchOptimistic(批量提交),这就可以在提交前记录好日志,在提交后再把日志批量上传
adqLog.Active := True;
for i:= to csdTemp.RecordCount- do //whilt not csdTemp.eof do同理
begin
if csdTemp.UpdateStatus=usModified then //如果当前记录是修改的
begin
adqLog.Append;
adqLog.FieldByName('pk').AsString := 'itemcode';
adqLog.FieldByName('newValue').AsString := csdTemp.FieldByName('itemcode').AsString;
adqLog.FieldByName('remark').AsString := '修改';
adqLog.FieldByName('oldvalue').AsString := csdTemp.FieldByName('itemcode').OldValue;
adqLog.Post;
ShowMessage(IntToStr(Integer(csdTemp.UpdateStatus)));
end;
if csdTemp.UpdateStatus=usInserted then //如果当前记录是新增的
begin
adqLog.Append;
adqLog.FieldByName('pk').AsString := 'itemcode';
adqLog.FieldByName('newValue').AsString := csdTemp.FieldByName('itemcode').AsString;
adqLog.FieldByName('remark').AsString := '新增';
adqLog.FieldByName('oldvalue').AsString := '';
adqLog.Post;
end;
csdTemp.Next;
end;
end;
批量提交修改后的clientdataset数据集
if cdsRecord.State in [dsEdit, dsInsert] then //判断数据集是否在编辑状态,如果是,则把正在编辑的内容提交到内存
cdsRecord.Post;
cdsRecord.ApplyUpdates(0); //提交cdsRecord数据集到数据库,参数0表示遇到提交异常则返回,如果你能容忍某一条记录提交失败仍然可以执行下一条的,那么可以填写你的容忍值
这里要注意,DataSetProvider的UpdateMode要设置为upWhereKeyOnly,并在cdsRecord的主键(或其他不被修改的字段)的ProviderFlags的pfInKey设置为true。
在cdsRecordAfterApplyUpdates中提交日志
//提交后记录提交日志
if adqLog.State in [ dsEdit, dsInsert] then
adqLog.Post;
adqLog.UpdateBatch(arAll);//这里是ADOQuery的一个批量上传选项
ClientDataSet增加一条记录
cdsRecord.AppendRecord(['','',false,false,'2018-06-28 19:19:26','','','PM','']);
如果需要在ClientDataSet中处理SQL或生成字段信息,那么可以在ClientDataSet的CommandText处理,但前提是要在DataSetProvider的Options中设置poAllowCommandText为true。
待续......
ClientDataSet应用的更多相关文章
- delphi中的ClientDataSet组件的open和Execute方法各自在什么情况下用?
ClientDataSet组件本来是给midas用的,也是所谓的borland的三层数据技术,使用这个控件必须发行midas.dll挺麻烦的 open是通过应用的SQL语句为SELECTexecute ...
- 捕获ClientDataSet.ApplyUpdates和SocketConnection异常
核心提示:如何捕获ClientDataSet.ApplyUpdates的错误,不用ReconcileError... var cdsEmp:TClientDataSet; //保存 procedure ...
- clientdataset<---->json
现在,DATASNAP倾向于使用JSON作为统一的数据序列格式,以期达到跨平台的效果.于是使用JSON便成为热点. unit uJSONDB; interface uses SysUtils, C ...
- ClientDataSet使用locate或Filter定位到字段为空值的记录
场景,程序想检查是否存在某个字段的值是空的,如果存在,则不允许增加记录,否则允许增加记录. 解决这个问题,我一开始用了两种错误的方法 if not clientdataset.locate('AFie ...
- Delphi ClientDataSet 主从结构 BUG
使用ADO控件 .ClientDataSet .增加了从表与主表的关连字段 SheetID,别的设置全为默认.如图1所示 图1 ======= 问题 BUG: 打开主表与从表,先不对主表进行任何操作. ...
- ClientDataSet
TField对象的SetText和GetText事件处理函数 使用TField对象的SetText和GetText事件处理函数可方便的解决字段的代码与代码所对应值的显示问题 TSimpleDatase ...
- DataSnap ClientdataSet 三层中主从表的操作
非原创 摘自:http://hi.baidu.com/yagzh2000/blog/item/fc69df2cb9845de78b139946.html三层中主从表的操作(删除.新增.修改)一定要在 ...
- clientdataset.open 报错 Name not unique in this context
clientdataset.open 报错 Name not unique in this context clientdataset有一些自定义字段,clientdataset绑定了adoquer ...
- ClientDataSet 心得
1. 与TTable.TQuery一样,TClientDataSet也是从TDataSet继承下来的,它通常用于多层体系结构的客户端.很多数据库应用程序都用了BDE,BDE往往给发布带来很大的不便 ...
随机推荐
- 2019-泰迪杯c题数据处理,WGS-84(世界标准地理坐标系) 转为 BD-09(百度地理坐标系)
2019-泰迪杯c题数据处理,WGS-84(世界标准地理坐标系) 转为 BD-09(百度地理坐标系) 本次泰迪杯的数据为经纬度数据,并且题目给的是WGS-84(世界标准地理坐标系)格式的,所有如果调用 ...
- Bresenham算法
1 算法原理 基本原理从某处摘得:设直线方程为yi+1=yi+k(xi+1-xi)+k.假设列坐标象素已经确定为xi,其行坐标为yi.那么下一个象素的列坐标为xi+1,而行坐标要么为yi,要么递增1为 ...
- 复旦大学2017--2018学年第二学期高等代数II期末考试情况分析
一.期末考试成绩班级前十名 张菲诺(95).刘宇其(95).魏一鸣(93).郭宇城(92).程梓兼(91).葛珈玮(90).汪子怡(90).余张伟(90).张昰昊(89).朱柏青(89) 二.总成绩计 ...
- Spring之bean的生命周期
这篇博文是spring生命周期的详解,目前限于作者自身的水平对于一些内容可能只知其然不知其所以然,所以博文中如果出现错误欢迎各位指出,同时我也会逐步提升自己的水平,争取能够多发布一些能让大家获益的博文 ...
- sql server把一个库表的某个字段更新到另一张表的相同字段
缘由:进行update时忘了加where条件,导致所有数据全部update.. sql: 1 update Activity set endTime=b.endTime from idj_tl_bf. ...
- vue文档阅读笔记——计算属性和侦听器
页面链接:https://cn.vuejs.org/v2/guide/computed.html 注意点 计算属性用于 替代模板内的表达式. 如果计算属性所依赖的属性未更新,会返回自身的缓存. 侦听器 ...
- 使用TLS证书保护Docker
使用TLS证书保护Docker 当我们使用远程调用docker时,未设置TLS的docker,将可以被任何人调用,这是极其危险的. 在阿里云上跑的docker,这次就被不怀好意的人扫描到了默认端口,2 ...
- Java问题解决:springboot启动出现-Your ApplicationContext is unlikely to start due to a @ComponentScan of the default package
参考资料: http://www.mamicode.com/info-detail-2101273.html https://blog.csdn.net/u012834750/article/deta ...
- 你有可能不知道的css浮动问题
最近在开发过程中,有的时候会经常遇见明明知道需要这样做,但是为什么要这样做的原因我们却总是不明所以然. 先来解释下什么叫做清除浮动吧: 在非IE浏览器(如Firefox)下,当容器的高度为auto,且 ...
- eclipse配置运行时变量
说明:我这里是在执行测试方法是配置的环境变量 步骤: 选中测试方法 -> 右键 -> run as -> run configurations ->