ClientDataSet应用

最近维护一个项目,里面用到ClientDataSet,因为以前接触ClientDataSet比较少,因此这个星期补了一下关于ClientDataSet的知识,并在此记录下我所了解到的并应用到实际项目中的ClientDataSet的知识。数据库

项目新需求:1.从别的数据库导入物料资料,并容许操做员作修改后保存提交;2.从别的数据库导入价格资料,并容许操做员作出修改并保存;3.记录相应的日志。4.容许操做员过滤关键字查找。app

(PS:项目的数据链接模式为:ADOConnection→ADOQuery→DataSetProvider→ClientDataSet→DataSource→数据集显示控件,包括DBGrid,DBLookupComboboxEh等)ide

 

更新单条记录spa

  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)日志

过滤code

  cdsRecord.Filtered := False;
  cdsRecord.Filter := 'itemcode='+QuotedStr(code);
  cdsRecord.Filtered := True;orm

若是过滤条件为空,则显示所有记录blog

    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。

 

待续......

相关文章
相关标签/搜索