2

我有三个表objects,(主键object_IDflags(主键flag_ID)和(与一些额外信息object_flags之间的交叉表)。objectsflags

我有一个返回所有标志的查询,如果给定对象具有某个标志,则返回一个或零:

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 为假但现在为真,则应执行 INSERT
  • 如果 object_has_flag 为真,但现在为假,则应删除该行

似乎这不能在一个查询中完成https://stackoverflow.com/questions/7927114/conditional-replace-or-delete-in-one-query

我使用 MyDAC 的 TMyQuery 作为数据集。我已经编写了单独的代码来执行必要的查询以保存对行的更改,但是如何将其耦合到数据集?我应该使用什么事件处理程序,以及如何告诉 TMyQuery 它应该刷新而不是发布?

编辑:显然,尚不完全清楚问题所在。不能使用标准的 UpdateSQL、DeleteSQL 和 InsertSQL,因为有时在编辑一行之后(不删除它或插入一行),必须执行INSERTor DELETE

4

2 回答 2

0

简短的回答是,在这里解释你的答案:

  • 查找“使用 MyDAC 数据集组件更新数据”的文档(从 MyDAC 5.80 开始)。

每个TCustomDADataSet(例如 TMyQuery)后代都可以使用SQLInsertSQLUpdateSQLDelete属性设置更新 SQL 语句。

TMyUpdateSQL也是一个很有前途的自定义更新操作组件。

于 2011-12-15T12:46:16.253 回答
0

似乎最简单的方法是使用事件,并使用几个字段的和属性BeforePost确定必须做什么。OldValueNewValue

于 2012-02-18T14:25:25.453 回答