Delphi,在where条件中具有DetailFields的Master-Detail(不在select-part中)

时间:2018-08-31 11:00:07

标签: delphi master-detail devart tdataset

我正在使用主从连接显示明细表中分配的列的列表。另外,我想显示第二个未分配明细列的网格

示例 主表t_human:idHU,nameHU(例如John,Oscar等)
详细信息表t_property:idPO,namePO(例如男性,女性,金发,胡须,蓝眼睛...)
联接表t_hu_po:idHU,idPO
->约翰-男性,金色头发
->奥斯卡-男性,蓝眼睛,胡须

当我选择一个主表行时,我想显示已分配的属性以及未分配的属性。分配的属性的主细节工作正常。 但是对于未分配的属性无效。

Detail-SQL: select p.idPO, p.namePO from t_property p where not exists (select * from t_hu_po hp where hp.idHU = :idHU and hp.idPO = p.idPO)

Master-SQL: select idHU, nameHU from human

当我尝试在delphi组件(Devart,SDAC,TMSQuery)中选择detailfield时,仅向我显示p.idPO和p.namePO的字段。语句中的:idHU参数配置为组件中查询的参数。当我在数据集(TMSQuery)的DetailFields属性中手动键入idHU时,激活查询时,我会从delphi中获得无效的列名称'idHU'..

有没有人比使用数据更改事件和手动设置详细信息参数并刷新详细信息查询更好的解决方案。 我的想法是,主从细节将做同样的事情,但只会在后台执行,因此我不必编写代码。

谢谢
斯蒂芬

1 个答案:

答案 0 :(得分:0)

请尝试使用where not exists来代替where p.idPO not in (Select idPO from t_hu_po where idHU=:idHu)

通过使子查询仅返回针对所选idHu存在的所有idPO,您的查询现在将查找不在该列表中的属性。