我遇到FireDAC Master-Detail关系的问题。
FireDAC有两种M / D关系模式:基于参数和基于范围的http://docwiki.embarcadero.com/RADStudio/Berlin/en/Master-Detail_Relationship_(FireDAC)
第一个使用每个查询的参数来检索每次滚动后所需的相应详细信息,第二个首先加载数据集中的所有数据,并设置定义主 - 细节关系的字段(过滤后的详细信息)主人的每一个滚动。)
您可以结合使用这两种方法,为您提供两者的优势(查询返回有限记录,同时减少与数据库的流量,离线模式......)。
除非细节为空,否则它的效果非常好。这就是原因(引自文档):
合并方法
要结合这两种方法,应用程序应同时使用参数和 基于范围的设置,并将fiDetails包含到FetchOptions.Cache中。然后 FireDAC最初使用基于范围的M / D. 如果数据集为空,那么 FireDAC使用基于参数的M / D.附加新查询记录 到内部记录存储。
此外,您可以使用TFDDataSet.OnMasterSetValues事件处理程序来覆盖M / D行为。
假设你有
主法案
+---------+------------+
| Bill_Id | Date |
+---------+------------+
| 1 | 01/01/2017 |
+---------+------------+
详细信息LINES
+---------+---------+------------+
| Bill_Id | Line_Id | Concept |
+---------+---------+------------+
| 1 | 1 | Television |
| 1 | 2 | Computer |
+---------+---------+------------+
Subdetail TAXES
+---------+---------+-----+--------+
| Bill_Id | Line_Id | Tax | Import |
+---------+---------+-----+--------+
| 1 | 1 | 14% | 74.25 |
| 1 | 1 | 7% | 36.12 |
+---------+---------+-----+--------+
我有3个带有参数的FDQuerys:
qryBills.SQL ='从BILLS中选择*,其中Bill_Id =:Id';
qryLines.SQL ='从LINES中选择*,其中Bill_Id =:Id';
qryTaxes.SQL ='从TAXES中选择*,其中Bill_Id =:Id';
Master-Detail关系由范围
定义qryLines.MasterFields =' Bill_Id';
qryTaxes.MasterFields =' Bill_Id; Line_Id';
如果所有细节都包含记录,那么一切都很好,但是当一个细节为空时(比如在我的例子中,对于第2行没有税),当我滚动到那个空细节时,它的查询是启动(如文档所述)复制非空细节的记录。
我的意思是:
问题在于,每次移动到第二行时,其子细节都是空的,因此重新启动qryTaxes查询,复制其整个内容。
拥有空的详细信息并不罕见,您知道一种方法可以防止其查询在发生时重新启动吗?我无法找到它。
谢谢。