Đô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.