マスターを適用してからディテールを適用します。
マスター レコードを削除する場合は、 BeforeApplyUpdatesイベントをオーバーライドして詳細レコードをカスケード削除します。
詳細を削除すると、BeforeApplyUpdates を再度オーバーライドする必要があります。マスター レコードが見つからない場合は、わざわざ削除を実行しないでください。
カスタム更新コマンドを使用して、詳細レコードの削除を「スキップ」できます。これを行う唯一の理由は、datasnap が SQL コマンド自体を生成し、影響を受ける行 = 0 のために失敗するのを防ぐことです。おそらく、次のようなものを使用します。
IF EXISTS (SELECT * FROM dbo.ParentTable WHERE ParentKey = @ParentKey)
BEGIN
DECLARE @rowcount INT
DELETE
FROM dbo.ChildTable
WHERE ChildKey = @ChildKey
SET @rowcount = @@ROWCOUNT
IF @rowcount <> 1
BEGIN
RAISERROR('Record not found.(%d)', 15, 1, @rowcount) WITH SETERROR
END
END
次に、BeforeUpdateRecord イベントでこのコマンドを呼び出します
case UpdateStatus of
ukDelete:
begin
sqlDeleteChild.Parameters.ParamByName('@ChildKey').Value := DeltaDS.FieldByName('ChildKey').OldValue;
sqlDeleteChild.Parameters.ParamByName('@ParentKey').Value := DeltaDS.FieldByName('ParentKey').OldValue;
sqlDeleteChild.Execute;
end;
...
end;
Applied := true;