kbmMWClientQuery判断一个字段是否修改?

function TForm5.IsFieldChanged(aDataSet: TkbmMWCustomClientQuery; aFieldName: string): Boolean;
var
  i: TkbmNativeInt;
  pRec, pOrigRec, pOldRec: PkbmRecord;
  st: TUpdateStatus;
  aOldV, aNewV: Variant;
  IsFieldValueChanged:Boolean;
begin
    if ADataSet.FindField(aFieldName)=nil then
      raise EMemTableError.Create('当前数据集无此字段.');

    IsFieldValueChanged:=False;
    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
        pOldRec := OverrideActiveRecordBuffer;
        try
              OverrideActiveRecordBuffer := pRec; // 指向修改后的数据
              aNewV := FieldByName(aFieldName).Value;
              OverrideActiveRecordBuffer := pOrigRec; // 指向修改前的数据
              aOldV := FieldByName(aFieldName).Value;
              if aNewV <> aOldV then
              begin
                IsFieldValueChanged:=True;
              end;
        finally
          OverrideActiveRecordBuffer := pOldRec;
        end;
    end;
    result:=IsFieldValueChanged;

end;

猜你喜欢

转载自www.cnblogs.com/kinglandsoft/p/10845367.html