阅读了关于TDataSetProvider.OnUpdateData事件说明的Delphi文件之后:
。
我正在寻找关于如何为更改OnUpdateData的数据的示例代码。我已尽力寻找解决办法。这是我能做到的:
示例1
procedure TDBNextDocNo.DSPUpdateData(Sender: TObject; DataSet: TCustomClientDataSet);
begin
DataSet.First;
while not DataSet.EOF do begin
if DataSet.UpdateStatus = usUnmodified then begin
TPacketDataSet(Dataset).InitAltRecBuffers(True);
if DataSet.UpdateStatus in [usInserted, usModified] then begin
Dataset.Edit;
DataSet.FindField('MyField').AsString := 'zzz';
Dataset.Post;
end;
end;
end;
DataSet.Next;
end;问题(例如1):不幸的是,我一直收到一些字段值丢失的错误。在执行了一些调试之后,我发现有一些需要的字段具有空值。
示例2:
procedure TDBNextDocNo.DSPUpdateData(Sender: TObject; DataSet: TCustomClientDataSet);
begin
DataSet.First;
while not DataSet.EOF do begin
if DataSet.UpdateStatus = usUnmodified then begin
TPacketDataSet(Dataset).InitAltRecBuffers(True);
if DataSet.UpdateStatus in [usInserted, usModified] then
DataSet.FindField('MyField').NewValue:= 'zzz';
end;
DataSet.Next;
end;
end;例如,问题2:通过这样编写,我们不需要调用DataSet.Edit & DataSet.Post。但是,设置为TField.NewValue的“zzz”值没有保存到数据库中。
我有一些特殊的原因,这个更新必须在OnUpdateData中执行,而不是在BeforeUpdateRecord/AfterUpdateRecord中执行。
请指点。非常感谢。
发布于 2011-06-30 17:05:55
不是
如果DataSet.UpdateStatus = usUnmodified,则开始
和
如果DataSet.UpdateStatus in usInserted,usModified则
相互排斥?你可能有一个错误的结局--或者没有其他的结局。
发布于 2011-06-30 18:25:34
好吧,让我们从头开始。
在delta中,修改被记录下来(根据我的经验):
已删除和插入的记录存储仅与相应的status在UpdateStatus
如何进行Delta修改
用于插入/删除记录的
将StatusFilter设置为usInserted和/或usDeleted。改变他们。你的任务完成了。
用于修改记录的
将SetStatusFiler设置为usUnModified,将usModified设置为在Delta中查看两条记录。执行一个While not DSDelta.Eof do,并对每个UpdateStatus = usUnModified进行测试。如果是,则继续在下一条记录中进行修改(与您测试的记录对应的UpdateStatus = usModified )。否则,您将使用UpdateStatus = usUnModified查找下一条记录。
编辑:你说得对。如果不包括标记为必需的所有字段,则无法更改被修改记录的增量上的字段。
你的密码是:
procedure TDBNextDocNo.DSPUpdateData(Sender: TObject; DataSet: TCustomClientDataSet);
begin
DataSet.First;
while not DataSet.EOF do begin
if DataSet.UpdateStatus = usUnmodified then begin
TPacketDataSet(Dataset).InitAltRecBuffers(True);
if DataSet.UpdateStatus in [usInserted, usModified] then begin
Dataset.Edit;
DataSet.FindField('MyField').AsString := 'zzz';
If Dataset.UpdateStatus in [usModified] then
begin
for i = 0 to Dataset.FieldCount - 1 do
begin
If Dataset.Fields[i].Name <> 'MyField' then
begin
If Dataset.Fields[i].Required then
Dataset.Fields[i].Value := Dataset.Fields[i].OldValue;
end;
end;
end;
Dataset.Post;
end;
end;
end;
DataSet.Next;
end;https://stackoverflow.com/questions/6532671
复制相似问题