Xác định trạng thái cập nhật bản ghi trong kbmMWClientQuery

Đôi khi khi làm việc với kbmMWClientQuery trên ứng dụng client, bạn cần biết một bản ghi cụ thể đang ở trạng thái nào: đã thêm mới, đã sửa, đã xóa, hay không thay đổi.

Hàm sau đây giúp xác định trạng thái cập nhật của bản ghi hiện tại trong aDataSet:

function TKiemTraTrangThaiCapNhat(aQuery: TkbmMWCustomClientQuery): TUpdateStatus;
var
  chiSo: TkbmNativeInt;
  pGhiNhan, pGhiNhanGoc, pGhiNhanCu: PkbmRecord;
  trangThai: TUpdateStatus;
  giaTriCu, giaTriMoi: Variant;
  coThayDoiGiaTri: Boolean;
begin
        pGhiNhan := pkbmRecord(aQuery.ActiveBuffer);
        if pGhiNhan = nil then
           Exit;
        pGhiNhanGoc := pGhiNhan;
        while pGhiNhanGoc^.PrevRecordVersion <> nil do
        begin
             pGhiNhanGoc := pGhiNhanGoc^.PrevRecordVersion;
        end;

        if pGhiNhan^.UpdateStatus = usDeleted then
        begin
             if pGhiNhanGoc^.UpdateStatus = usInserted then
                trangThai := usUnmodified; // Bản ghi thêm mới rồi bị xóa coi là không thay đổi
             end
             else if pGhiNhanGoc^.UpdateStatus = usInserted then
                     trangThai := usInserted
                  else
                     trangThai := pGhiNhan^.UpdateStatus;

        if trangThai = usModified then
        with aQuery do
        begin
            coThayDoiGiaTri := False;
            pGhiNhanCu := OverrideActiveRecordBuffer;
            try
                for chiSo := 0 to FieldCount - 1 do
                begin
                  OverrideActiveRecordBuffer := pGhiNhan; // Trỏ đến dữ liệu đã sửa
                  giaTriMoi := FieldByName(Fields[chiSo].FieldName).Value;
                  OverrideActiveRecordBuffer := pGhiNhanGoc; // Trỏ đến dữ liệu gốc
                  giaTriCu := FieldByName(Fields[chiSo].FieldName).Value;
                  if giaTriMoi <> giaTriCu then
                  begin
                    coThayDoiGiaTri := True;
                    Break;
                  end;
                end;
                if not coThayDoiGiaTri then
                   trangThai := usUnmodified;
            finally
              OverrideActiveRecordBuffer := pGhiNhanCu;
            end;
        end;
        result := trangThai;
end;

Đây là mã kiểm tra để sử dụng hàm trên:

procedure TKiemTraTrangThaiBtnClick(Sender: TObject);
var
  trangThai: TUpdateStatus;
begin
  trangThai := KiemTraTrangThaiCapNhat(m);

  if trangThai = TUpdateStatus.usModified then
    Memo1.Lines.Add(' usModified ' + ' RecordID=' + m.RecordID.ToString)
  else if trangThai = TUpdateStatus.usInserted then
    Memo1.Lines.Add(' usInserted' + ' RecordID=' + m.RecordID.ToString)
  else if trangThai = TUpdateStatus.usDeleted then
    Memo1.Lines.Add(' usDeleted' + ' RecordID=' + m.RecordID.ToString)
  else if trangThai = TUpdateStatus.usUnmodified then
    Memo1.Lines.Add(' usUnmodified' + ' RecordID=' + m.RecordID.ToString);
end;

Lưu ý: Hàm này chỉ áp dụng cho kbmMWClientQuery, không dùng được với kbmMemTable.

Thẻ: kbmMWClientQuery Delphi TUpdateStatus kbmMW

Đăng vào ngày 26 tháng 5 lúc 08:15