ClientDataSet应用
2018-08-13 07:35:01来源:博客园 阅读 ()
最近维护一个项目,里面用到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>0) 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:=0 to csdTemp.RecordCount-1 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(['7008','1982',false,false,'2018-06-28 19:19:26','','7993','PM','1000495']);
如果需要在ClientDataSet中处理SQL或生成字段信息,那么可以在ClientDataSet的CommandText处理,但前提是要在DataSetProvider的Options中设置poAllowCommandText为true。
待续......
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:PHP页面静态化
- uniGUI 应用程序体系结构(11) 2020-02-04
- TClientDataSet 提交时提示 Field value Required 但是未提 2018-12-06
- 小组件---快递查询组件 2018-06-21
- C# Win32控制台应用程序忽略 Ctrl + C,阻止程序退出 2018-06-21
- C#中那些[举手之劳]的性能优化 2018-06-21
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash