为MyDAC定义自定义POST方法

时间:2011-12-10 10:33:44

标签: mysql delphi mydac

我有三个表objects,(主键object_IDflags(主键flag_ID)和object_flags({{1}之间的交叉表和objects以及一些额外的信息)。

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

flags

在应用程序(用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它应该刷新而不是发布?

编辑:显然,问题是什么并不完全清楚。无法使用标准UpdateSQL,DeleteSQL和InsertSQL,因为有时在编辑一行(不删除它或插入一行)之后,必须执行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); INSERT

2 个答案:

答案 0 :(得分:0)

简短的回答是,用你的答案here来解释:

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

每个 TCustomDADataSet (例如TMyQuery)后代都可以使用 SQLInsert SQLUpdate SQLDelete <来设置更新SQL语句/ em> properties。

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

答案 1 :(得分:0)

似乎最简单的方法是使用BeforePost事件,并使用多个字段的OldValueNewValue属性确定要执行的操作。