RBA*_*RBA 7 delphi dataset delphi-2006
当数据集已处于插入状态时,如何确定数据感知组件字段是否已被修改?我想知道一个字段是否真的被"修改"了.(我不在乎用户是否在某个字段中输入了某些东西,然后擦除所有内容,这意味着发生了修改).
DataSet.Modified,DataSet.UpdateStatus或ChangeCount都没有解决我的问题.
LE:让我更深入地解释一下.所以,初始数据集看起来像
-------------------------------------
|PK | Field1| Field2| Field3|Field4|
-------------------------------------
| 1 | a | b | c | d |
-------------------------------------
Run Code Online (Sandbox Code Playgroud)
插入后
-------------------------------------
|PK | Field1| Field2| Field3|Field4|
-------------------------------------
| 2 | | | | |
-------------------------------------
| 1 | a | b | c | d |
-------------------------------------
Run Code Online (Sandbox Code Playgroud)
当数据集真正被修改时
-------------------------------------
|PK | Field1| Field2| Field3|Field4|
-------------------------------------
| 2 | avalue| | | |
-------------------------------------
| 1 | a | b | c | d |
-------------------------------------
Run Code Online (Sandbox Code Playgroud)
您可以DataSet
修改/ 更改它的Modified
属性AfterInsert
/ AfterEdit
(并设置初始值/默认值)并稍后测试DataSet.Modified
(例如在发布之前).
为了确定修改了哪些特定字段,我保留了初始记录的副本,例如:
type
TDataRecord = array of record
FieldName: string;
Value: Variant;
end;
type
TForm1 = class(TForm)
...
private
FInitRecord, FPostRecord: TDataRecord;
end;
function GetDataRecord(DataSet: TDataSet): TDataRecord;
var
I: Integer;
begin
Result := nil;
if Assigned(DataSet) then begin
SetLength(Result, DataSet.FieldCount);
for I := 0 to DataSet.FieldCount - 1 do begin
Result[I].FieldName := DataSet.Fields[I].FieldName;
Result[I].Value := DataSet.Fields[I].Value;
end;
end;
end;
type
TDataSetAccess = class(TDataSet);
procedure TForm1.ADODataSet1AfterInsert(DataSet: TDataSet);
begin
// set initial values
ADODataSet1.FieldByName('PK').Value := GetMyPKValue;
ADODataSet1.FieldByName('DateCreated').AsDateTime := Now();
// un-modify
TDataSetAccess(ADODataSet1).SetModified(False);
// save initial record
FInitRecord := GetDataRecord(ADODataSet1);
end;
procedure TForm1.ADODataSet1BeforePost(DataSet: TDataSet);
var
I: Integer;
begin
if ADODataSet1.Modified then
begin
FPostRecord := GetDataRecord(ADODataSet1);
Memo1.Lines.Clear;
for I := 0 to Length(FPostRecord) - 1 do begin
if FPostRecord[I].Value <> FInitRecord[I].Value then
Memo1.Lines.Add(Format('Field %s was modified', [FPostRecord[I].FieldName]));
end;
end;
end;
Run Code Online (Sandbox Code Playgroud)
好吧,无论如何,这是抽象的想法.您可以TDataSet
像我一样对您进行子类化,并直接在TDataSet
组件内部实现此功能.