【发布时间】:2011-12-10 10:33:44
【问题描述】:
我有三个表objects、(主键object_ID)flags(主键flag_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 为真且仍然为真,则应在 objects_flags 中的相关行上进行更新。
- 如果 object_has_flag 为 false 但现在为 true,则应执行 INSERT
- 如果 object_has_flag 为真,但现在为假,则应删除该行
这似乎不能在一个查询https://stackoverflow.com/questions/7927114/conditional-replace-or-delete-in-one-query 中完成。
我使用 MyDAC 的 TMyQuery 作为数据集。我已经编写了单独的代码来执行必要的查询以保存对行的更改,但是如何将其耦合到数据集?我应该使用什么事件处理程序,以及如何告诉 TMyQuery 它应该刷新而不是发布?
编辑:显然,问题所在并不完全清楚。不能使用标准的 UpdateSQL、DeleteSQL 和 InsertSQL,因为有时在编辑一行(不删除或插入一行)之后,必须执行 INSERT 或 DELETE。
【问题讨论】:
-
在您之前的问题中,您没有提到您使用的现成组件是否是 MyDAC。是这样吗?
-
@menjaraz(抱歉耽搁了):是