我会先申请大师,然后再申请细节。
在您删除主记录的情况下,我将通过覆盖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;