• 如何判断kbmMWClientQuery当前记录的增改状态?


    有朋友问我,客户端使用了kbmMWClientQuery,对其进行了编辑后,对于指定的记录,如何判断是否是增加的记录,或者是被修改后的记录?

     下面这个函数,返回aDataSet当前记录的修改状态:

    function TForm5.GetUpdateStatus(aDataSet: TkbmMWCustomClientQuery): TUpdateStatus;
    var
      i: TkbmNativeInt;
      pRec, pOrigRec, pOldRec: PkbmRecord;
      st: TUpdateStatus;
      aOldV, aNewV: Variant;
      IsFieldValueChanged:Boolean;
    begin
    
            pRec := pkbmRecord(aDataSet.ActiveBuffer);
            if pRec = nil then
               Exit;
            pOrigRec:=pRec;
            while pOrigRec^.PrevRecordVersion <> nil do
            begin
                 pOrigRec := pOrigRec^.PrevRecordVersion;
            end;
    
            if pRec^.UpdateStatus = usDeleted then
            begin
                 if pOrigRec^.UpdateStatus = usInserted then
                    st := usUnmodified; //增加的记录又删除记为usUnmodified.
                 end
                 else if pOrigRec^.UpdateStatus = usInserted then
                         st := usInserted
                      else
                         st := pRec^.UpdateStatus;
    
            if st = usModified then
            with aDataSet do
            begin
                IsFieldValueChanged:=False;
                pOldRec := OverrideActiveRecordBuffer;
                try
                    for i := 0 to FieldCount - 1 do
                    begin
                      OverrideActiveRecordBuffer := pRec; // 指向修改后的数据
                      aNewV := FieldByName(Fields[i].FieldName).Value;
                      OverrideActiveRecordBuffer := pOrigRec; // 指向修改前的数据
                      aOldV := FieldByName(Fields[i].FieldName).Value;
                      if aNewV <> aOldV then
                      begin
                        IsFieldValueChanged:=True;
                        Break;
                      end;
                    end;
                    if not IsFieldValueChanged then
                       st:= usUnmodified;
                finally
                  OverrideActiveRecordBuffer := pOldRec;
                end;
            end;
            result:=st;
    
    end;

    这是测试代码:

    procedure TForm5.Button3Click(Sender: TObject);
    var
      st:TUpdateStatus;
    begin
    
      st:=  GetUpdateStatus(m);
    
      if st = TUpdateStatus.usModified then
        Memo1.Lines.Add(' usModified ' + ' RecordID=' + m.RecordID.ToString)
      else if st = TUpdateStatus.usInserted then
        Memo1.Lines.Add(' usInserted' + ' RecordID=' + m.RecordID.ToString)
      else if st = TUpdateStatus.usDeleted then
        Memo1.Lines.Add(' usDeleted' + ' RecordID=' + m.RecordID.ToString)
      else if st = TUpdateStatus.usUnmodified then
        Memo1.Lines.Add(' usUnmodified' + ' RecordID=' + m.RecordID.ToString);
    
    end;

    参考: http://blog.sina.com.cn/s/blog_44fa172f0102wmsg.html

    注意:只适用于kbmMWClientQuery,不适用于kbmMemTable。

  • 相关阅读:
    jQuery cxCalendar 日期选择器
    JS中this的4种绑定规则
    Redis入门教程
    大型网站限流算法的实现和改造
    JS中的继承(下)
    剑指Offer面试题:6.旋转数组中的最小数字
    剑指Offer面试题:5.重建二叉树
    剑指Offer面试题:4.从尾到头打印链表
    C++之运算符重载
    剑指Offer面试题:3.替换空格
  • 原文地址:https://www.cnblogs.com/kinglandsoft/p/10823424.html
Copyright © 2020-2023  润新知