Mysql 为MyDAC定义自定义POST方法

Mysql 为MyDAC定义自定义POST方法,mysql,delphi,mydac,Mysql,Delphi,Mydac,我有三个表objects,(主键object\u ID)flags(主键flag\u ID)和object\u flags(在objects和flags之间加上一些额外信息的交叉选项卡) 我有一个返回所有标志的查询,如果给定对象有某个标志,则返回1或0: SELECT f.*, of.*, of.objectID IS NOT NULL AS object_has_flag, FROM flags f LEFT JOIN object_flags of ON (f.f

我有三个表
objects
,(主键
object\u ID
flags
(主键
flag\u ID
)和
object\u flags
(在
objects
flags
之间加上一些额外信息的交叉选项卡)

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

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中的相关行上执行更新
  • 如果对象_has_标志为false,但现在为true,则应执行插入
  • 如果object_has_flag为true,但现在为false,则应删除该行
这似乎不可能在一个查询中完成

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


编辑:显然,问题出在哪里还不完全清楚。无法使用标准的UpdateSQL、DeleteSQL和InsertSQL,因为有时在编辑一行(不删除它或插入一行)后,必须执行
插入
删除

简而言之,您的答案是:

  • 查阅“使用MyDAC数据集组件更新数据”(从MyDAC 5.80开始)的文档
每个TCustomDADataSet(如TMyQuery)子体都能够使用SQLInsert、SQLUpdate和SQLDelete属性设置updatesql语句


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

简而言之,您的答案是:

  • 查阅“使用MyDAC数据集组件更新数据”(从MyDAC 5.80开始)的文档
每个TCustomDADataSet(如TMyQuery)子体都能够使用SQLInsert、SQLUpdate和SQLDelete属性设置updatesql语句


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

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

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

在前一个问题中,您没有提到您使用的现成组件是否是MyDAC。是这样吗?@menjaraz(抱歉耽搁):这是你之前的问题,你没有提到你使用的现成组件是不是MyDAC。是这样吗?@menjaraz(很抱歉耽搁了):这是真的。但是,一些内置的健全性检查会带来麻烦。例如,在记录已经存在的情况下使用REPLACE时,服务器将返回2行受影响的数据。内置健全性检查将引发异常,因为只编辑了一行。True。但是,一些内置的健全性检查会带来麻烦。例如,在记录已经存在的情况下使用REPLACE时,服务器将返回2行受影响的数据。内置的健全性检查将引发异常,因为只编辑了一行。