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>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。

待续......

原文地址:https://www.cnblogs.com/Kwong/p/9465387.html

时间: 2024-10-10 20:39:00

ClientDataSet应用的相关文章

ClientDataSet中动态添加计算字段并用计算字段显示记录的UpdateStatus

ClientDataSet中每条记录都有UpdateStatus=(usUnmodified, usModified, usInserted, usDeleted)记录该条数据是修改的,删除的,还是新增的等.有时候我们只想看修改的或新增的或删除的就可能用到这一属性.下图用计算字段显示UpdateStatus状态. ********************************************************************************************

ClientDataSet中的错误处理

当修改数据发生错误时会先触发DataSetProvider.OnUpdateError事件处理过程然后触发ClientDataSet.OnReconcileError事件处理过程. OnUpDateError原型: procedure OnUpdateError( Sender: TObject;//触发此事件的对象 DataSet: TCustomClientDataSet; //产生错误的数据集 E: EUpdateError; //生成的错误对象 UpdateKind: TUpdateKi

Delphi ClientDataSet 主从结构 BUG

使用ADO控件 .ClientDataSet .增加了从表与主表的关连字段 SheetID,别的设置全为默认.如图1所示 ======= 问题 BUG: 打开主表与从表,先不对主表进行任何操作.图2所示. 在从表编辑中,使用 ClientDataSet2.Delete; 进行对从表进行删除行,将该SheetID(B41170600011)的从表的所有行删除.如图3所示. 这里,对主表对应的行(B41170600011)字段,除了SheetID字段进行编辑,你会发现,从表里刚才删除的数据又回来了.

clientdataset&lt;----&gt;json

现在,DATASNAP倾向于使用JSON作为统一的数据序列格式,以期达到跨平台的效果.于是使用JSON便成为热点. unit uJSONDB;   interface uses SysUtils, Classes, Variants, DB, DBClient, SuperObject, Dialogs; type TJSONDB = class   private class function getJsonFieldNames(res: ISuperObject):TStringList ;

JSON转ClientDataSet

这是网上的一段JSON转ClientDataSet和ClientDataSet转JSON的代码.有一个小Bug else I := I + 2; 导致在中文处理时.解析错误 正确的应该是 else I := I + 1; 汉字Unicode是双字节. I的值本来是1, 加2就是3字节了.导致包含汉字JSON分切的时候老出错. 希望对大家有用 ------------------------------------------------------------------------------

clientdataset 做为 单机数据库的 使用 学习

http://blog.csdn.net/waveyang/article/details/34146737 unit Unit3; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids, Vcl.DBGr

dbgrid,datasoure,ClientDataSet的简单应用

dbgrid是用来在界面上显示数据的,需要连接源dbgrid1.datasource := datasource1; datasource:作为dbgrid,clientDataset的连接桥梁,需要数据集datasource1.dataset := clientDataSet1; 一个简单的例子如下: uses db,midaslib;//没有midaslib会出现缺少midas.dll,就算系统注册midas.dll,运行程序还是会报内存错误: procedure TForm1.FormCr

ClientDataset+TDataSetProvider的数据保存问题

看到一篇介绍ClientDataSet和TDataSetProvider,非常精彩,特此保存. ================================================================================= 前台:D7或D2005; DBExpress连接组件:TSqlConnection,TSqlQuery ,TDataSetProvider,TClientDataSet;后台:SQL Server 2000; 更新数据的命令:DataSet

ClientDataSet建立索引和排序

可用ClientDataSet.AddIndex或ClientDataSet1.IndexDefs.AddIndexDef建立索引. AddIndex( const Name:string;                   //索引名 const Fields:string;                    //索引字段,多个用;隔开 options:TIndexOptions;              //选项[IxPrimary,IxUnique,ixDescending,ixC

Delphi:ClientDataset+TDataSetProvider的数据保存问题

看到一篇介绍ClientDataSet和TDataSetProvider,非常精彩,特此保存. =========================================================================== TClientDataSet用法 第十一章 TClientDataSet 与TTable.TQuery一样,TClientDataSet也是从TDataSet继承下来的,它通常用于多层体系结构的客户端.TClientDataSet最大的特点是它不依赖于