如何在Delphi中从TClientDataset获取新字段值?
您好,我对Delphi中的TClientDataset有问题。我想获得一个包含更改数据的数据集 这是我的密码:如何在Delphi中从TClientDataset获取新字段值?,delphi,delphi-xe6,tclientdataset,delta,tgrid,Delphi,Delphi Xe6,Tclientdataset,Delta,Tgrid,您好,我对Delphi中的TClientDataset有问题。我想获得一个包含更改数据的数据集 这是我的密码: procedure TForm2.btnUpdateClick(Sender: TObject); var I: Integer; counter : Integer; //for testing value : String; begin if not Self.DatasetArtikel.Active then begin ShowM
procedure TForm2.btnUpdateClick(Sender: TObject);
var
I: Integer;
counter : Integer; //for testing
value : String;
begin
if not Self.DatasetArtikel.Active then
begin
ShowMessage('Nicht aktiv');
Exit;
end;
if Self.DatasetArtikel.ChangeCount = 0 then
begin
ShowMessage('Delta is empty');
Exit;
end;
counter := DatasetArtikel.ChangeCount;
//DatasetArtikelUpdate.ClearFields;
//DatasetArtikelUpdate.CreateDataSet;
DatasetArtikel.Data := Self.DatasetArtikel.Delta; //here i want to transfer the changed data
Release;
//for I := 0 to DatasetArtikelUpdate.Fields.Count -1 do
// if not DatasetArtikelUpdate.Fields[I].IsNull then
// value := DatasetArtikelUpdate.Fields[I].NewValue;
value := DatasetArtikel.Fields[2].OldValue;
value := DatasetArtikel.Fields[2].Value;
value := DatasetArtikel.Fields[2].NewValue; //here i want the new data
end;
例如:第3列是文本blueblue,我将其更改为redred。计数器告诉我1已更改,这是正确的,但值告诉我字符串为蓝色…但我希望数据红色:((字段上没有存储NewValue/OldValue信息。 三角洲将包含 1行用于删除的行 1行用于新插入的行 2行用于修改的行 对于每一行,您都可以请求增量.UpdateStatus,它可以被usUnmodified、usModified、usInserted或usDeleted 每个未修改的记录后面都有一个经过修改的记录 您将查看这两个记录以获得新旧值
procedure TTestForm.RunInfoClick(Sender: TObject);
type
TMyFieldInfo = Record
FieldName: String;
Size: Integer;
DataType: TFieldType;
FieldKind: TFieldKind;
end;
var
I: Integer;
sl: TStringList;
old: String;
FA: Array of TMyFieldInfo;
F: TField;
// get fielddefs after openening and a a definition for a calculated field
// called Status to refect UpdateStatus
Procedure GetFields;
var
I: Integer;
begin
SetLength(FA, delta.FieldCount + 1);
for I := 0 to delta.FieldCount - 1 do
begin
FA[I].FieldName := delta.Fields[I].FieldName;
FA[I].DataType := delta.Fields[I].DataType;
FA[I].Size := delta.Fields[I].Size;
FA[I].FieldKind := fkdata;
end;
FA[High(FA)].FieldName := 'Status';
FA[High(FA)].DataType := ftString;
FA[High(FA)].Size := 10;
FA[High(FA)].FieldKind := fkcalculated;
delta.Close;
end;
// apply our fields to be able to display a calculated field
Procedure SetFields;
var
I: Integer;
begin
delta.Fields.Clear;
for I := Low(FA) to High(FA) do
begin
F := DefaultFieldClasses[FA[I].DataType].Create(delta);
With F do
begin
FieldName := FA[I].FieldName;
FieldKind := FA[I].FieldKind;
Size := FA[I].Size;
DataSet := delta;
end;
end;
delta.Open;
end;
Procedure LogSL;
begin
if sl.Count > 1 then
Memo1.Lines.Add(sl.Text);
sl.Clear;
end;
begin
Memo1.Lines.Clear;
sl := TStringList.Create;
try
delta.Close;
delta.Fields.Clear;
delta.Data := ClientDataSet1.delta;
GetFields;
SetFields;
while not delta.Eof do
begin
if delta.UpdateStatus <> usModified then
begin
LogSL;
end;
if delta.UpdateStatus = usUnmodified then
sl.Add('Unmodified:')
else if delta.UpdateStatus = usInserted then
begin
sl.Add('Insert:');
end
else if delta.UpdateStatus = usDeleted then
begin
sl.Add('Deleted:');
end
else if delta.UpdateStatus = usModified then
begin
sl[0] := ('Modified:');
end;
for I := 0 to delta.FieldCount - 2 do // ignore our calculated field
begin
if delta.UpdateStatus = usModified then
begin
if (sl.Values[delta.Fields[I].FieldName] <> delta.Fields[I].AsString) and not delta.Fields[I].IsNull then
begin // we had changes
sl[I + 1] := sl[I + 1] + ' OldValue: ' + delta.Fields[I].AsString;
end
else
begin // we did not have changes take stored OldValue
sl[I + 1] := sl[I + 1] + ' OldValue: ' + sl.Values[delta.Fields[I].FieldName];
end
end
else // delta.UpdateStatus = usModified
sl.Add(delta.Fields[I].FieldName + '=' + delta.Fields[I].AsString + old);
end;
delta.Next;
end;
LogSL;
finally
sl.Free;
end;
end;
procedure TTestForm.deltaCalcFields(DataSet: TDataSet);
begin
with TClientDataSet(DataSet) do
begin
case UpdateStatus of
usUnmodified:
FieldByName('Status').AsString := 'Unmod';
usModified:
FieldByName('Status').AsString := 'Modi';
usInserted:
FieldByName('Status').AsString := 'Ins';
usDeleted:
FieldByName('Status').AsString := 'Del';
end;
end;
end;
过程TTestForm.RunInfoClick(发送方:TObject);
类型
TMyFieldInfo=记录
字段名:字符串;
大小:整数;
数据类型:TFieldType;
野外种类:TFieldKind;
结束;
变量
I:整数;
sl:TStringList;
旧:字符串;
FA:TMyFieldInfo的数组;
F:特菲尔德;
//打开后获取fielddefs和计算字段的定义
//调用状态以引用UpdateStatus
程序字段;
变量
I:整数;
开始
设置长度(FA,delta.FieldCount+1);
对于I:=0到delta.FieldCount-1 do
开始
FA[I].FieldName:=delta.Fields[I].FieldName;
FA[I]。数据类型:=delta.Fields[I]。数据类型;
FA[I]。大小:=delta.Fields[I]。大小;
FA[I].FieldKind:=fkdata;
结束;
FA[高(FA)]。字段名:='状态';
FA[高(FA)]。数据类型:=ftString;
FA[高(FA)]。尺寸:=10;
FA[高(FA)]。FieldKind:=fkcalculated;
三角洲关闭;
结束;
//应用我们的字段以显示计算字段
程序设置字段;
变量
I:整数;
开始
delta.Fields.Clear;
对于I:=低(FA)到高(FA)do
开始
F:=DefaultFieldClasses[FA[I].数据类型].Create(增量);
用F do
开始
字段名:=FA[I]。字段名;
FieldKind:=FA[I].FieldKind;
尺寸:=FA[I]。尺寸;
数据集:=增量;
结束;
结束;
三角洲开放;
结束;
程序LogSL;
开始
如果sl.计数>1,则
备忘录1.行。添加(sl.Text);
sl.清晰;
结束;
开始
备忘录1.线条清晰;
sl:=TStringList.Create;
尝试
三角洲关闭;
delta.Fields.Clear;
delta.Data:=ClientDataSet1.delta;
格特菲尔德;
设定场;
而不是delta.Eof
开始
如果修改了delta.UpdateStatus,则
开始
LogSL;
结束;
如果delta.UpdateStatus=usUnmodified,则
sl.Add('未修改:')
否则,如果delta.UpdateStatus=usInserted,则
开始
sl.Add('插入:');
结束
否则,如果delta.UpdateStatus=usDeleted,则
开始
sl.Add('Deleted:');
结束
否则,如果delta.UpdateStatus=usModified,则
开始
sl[0]:=('Modified:');
结束;
对于I:=0到delta.FieldCount-2,请忽略计算字段
开始
如果delta.UpdateStatus=usModified,则
开始
如果(sl.Values[delta.Fields[I].FieldName]delta.Fields[I].AsString)而不是delta.Fields[I].IsNull,则
开始//我们有变化
sl[I+1]:=sl[I+1]+'OldValue:'+delta.Fields[I].AsString;
结束
其他的
开始//我们没有对存储的旧值进行更改
sl[I+1]:=sl[I+1]+'OldValue:'+sl.Values[delta.Fields[I].FieldName];
结束
结束
else//delta.UpdateStatus=usModified
sl.Add(delta.Fields[I].FieldName+'='+delta.Fields[I].AsString+old);
结束;
delta.Next;
结束;
LogSL;
最后
sl.免费;
结束;
结束;
过程TTestForm.DeltaCalFields(数据集:TDataSet);
开始
使用TClientDataSet(数据集)do
开始
案例更新状态
usUnmodified:
FieldByName('Status')。关联字符串:='UNMD';
美国修改:
FieldByName('Status')。关联字符串:='Modi';
usInserted:
FieldByName('Status')。关联字符串:='Ins';
删除:
FieldByName('Status')。关联字符串:='Del';
结束;
结束;
结束;
您不能只使用原始数据集(而不是增量)来获取新值吗?如果没有,请参阅TPacketDataSet.InitAltRecBuffers