Я бы применил мастера, а затем детали.
В случае, когда вы удаляете основную запись, я бы каскадно удалил подробные записи , переопределив событие 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;