我有三个表objects
,(primary keyobject_ID
)flags
(primary keyflag_ID
)和object_flags
(在objects
和flags
之间有一些额外信息的交叉表)。
我有一个返回所有标志的查询,如果给定对象有某个标志,则返回一个或零:
SELECT
f.*,
of.*,
of.objectID IS NOT NULL AS object_has_flag,
FROM
flags f
LEFT JOIN object_flags of
ON (f.flag_ID = of.flag_ID) AND (of.object_ID = :objectID);
在应用程序(用Delphi编写)中,所有行都加载到一个组件中。用户可以通过单击表中的复选框来指定标志,修改数据。
假设编辑了一行。根据object_has_flag的值,必须执行以下操作:
如果object_has_flag为true且仍然为true,则应在objects_flags中的相关行上进行更新。
如果object_has_flag为false但现在为true,则应执行INSERT
如果object_has_flag为true,但现在为false,则应删除该行
这似乎不能在一个查询https://stackoverflow.com/questions/7927114/conditional-replace-or-delete-in-one-query中完成。
我使用MyDAC的TMyQuery作为数据集。我已经编写了单独的代码来执行必要的查询以保存对行的更改,但是如何将其与数据集结合起来呢?我应该使用什么事件处理程序,如何告诉TMyQuery应该刷新而不是post?
编辑:显然,目前还不完全清楚问题出在哪里。不能使用标准的UpdateSQL、DeleteSQL和InsertSQL,因为有时在编辑行(不删除行或插入行)之后,必须执行
INSERT
或DELETE
操作。 最佳答案
简单的回答是,用你的答案来解释:
查阅文档“使用MyDAC数据集组件更新数据”(从MyDAC 5.80开始)。
每个TCustomDADataSet(如TMyQuery)子体都可以使用SQLInsert、SQL update和SQLDelete属性设置update SQL语句。
TMyUpdateSQL也是一个很有前途的自定义更新操作组件。