更新 (ClientDataSet.ApplyUpdates) を指定された順序で適用する必要があります: - 最初に削除 - 2 番目に変更 - 3 番目に挿入
それらは実行された順に適用されます。
更新 (ClientDataSet.ApplyUpdates) を指定された順序で適用する必要があります: - 最初に削除 - 2 番目に変更 - 3 番目に挿入
それらは実行された順に適用されます。
これを実現する方法については、KTDataComponents を参照してください。
それに加えて、プロバイダー側の OnUpdateData イベントハンドラーで特定のインデックスに切り替えることで、必要な更新順序を形成することがあります。デルタ処理を壊さないようにするために利用しなければならないトリックがいくつかありますが、それはかなり実行可能です
procedure TLogResolver.LogUpdateRecord(Tree: TUpdateTree);
var
I: Integer;
CurVal: Variant;
fld: TField;
SaveRecNo: Integer;
OldIndexName: WideString;
OldIndexFieldNames: WideString;
begin
if(TClientDataSet(Tree.Delta).IndexName<>'')or(TClientDataSet(Tree.Delta).IndexFieldNames<>'') then begin
OldIndexName:=TClientDataSet(Tree.Delta).IndexName;
OldIndexFieldNames:=TClientDataSet(Tree.Delta).IndexFieldNames;
SaveRecNo:=Tree.Delta.RecNo;
Tree.Delta.Edit; // vavan
for I := 0 to Tree.Delta.FieldCount - 1 do begin
fld:=Tree.Delta.Fields[I];
{ Blobs, Bytes and VarBytes are not included in result packet }
if {(fld.IsBlob) or} (fld.DataType in [ftBytes, ftVarBytes]) then // vavan allowed blobs
continue;
CurVal := fld.NewValue;
if not VarIsClear(CurVal) then begin
fld.Value:=CurVal; { TODO -ovavan -cSIC! : edit delta }
end;
end;
Tree.Delta.Post; // vavan
TClientDataSet(Tree.Delta).IndexName:=''; { TODO -ovavan -cSIC! : reset delta index to get correct original recno in order not to break reconcilation mechanism }
end;
try
Tree.ErrorDS.IndexFieldNames:='ERROR_RECORDNO';
// Tree.InitErrorPacket(nil, rrApply);
TreeInitErrorPacket(Tree,nil, rrApply);
for I := 0 to TVPacketDataSet(Tree.Delta).NewValueFields.Count - 1 do
begin
fld:=TVPacketDataSet(Tree.Delta).NewValueFields[i];
{ Blobs, Bytes and VarBytes are not included in result packet }
if {(Tree.Delta.Fields[I].IsBlob) or} // vavan allowed blobs
(fld.DataType in [ftBytes, ftVarBytes]) then
continue;
CurVal := fld.NewValue;
if not VarIsClear(CurVal) then begin { TODO 2 -ovavan -ccheck! : get rid of this check since we only process modified fields? }
Tree.ErrorDS.Fields[6+fld.Index].Value := CurVal; { TODO -ovavan -ccheck : ErrorDS fieldd structure is identical to delta but with extra 6 leading fields }
end;
end;
Tree.ErrorDS.Post;
finally
if(OldIndexName<>'')then begin
TClientDataSet(Tree.Delta).IndexName:=OldIndexName;
Tree.Delta.RecNo:=SaveRecNo;
end else
if(OldIndexFieldNames<>'')then begin
TClientDataSet(Tree.Delta).IndexFieldNames:=OldIndexFieldNames;
Tree.Delta.RecNo:=SaveRecNo;
end;
end;
end;