FireDAC主 - 明细节关系出现意外行为

时间:2017-12-14 13:54:39

标签: delphi master-detail delphi-10.1-berlin firedac

我遇到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行没有税),当我滚动到那个空细节时,它的查询是启动(如文档所述)复制非空细节的记录。

我的意思是:

  1. 我打开了Bill_Id#1
  2. 的三个数据集
  3. 一切看起来都不错,我看到了主记录,第1行和第2行
  4. 我移到第二行,它看起来仍然很好,税收显示为空。
  5. 当我回到第一行时,现在我看到两次税后两次。
  6. 如果我再次进入第二行,并返回第一行,现在我将看到它的两次税收的三倍。
  7. ...
  8. 问题在于,每次移动到第二行时,其子细节都是空的,因此重新启动qryTaxes查询,复制其整个内容。

    拥有空的详细信息并不罕见,您知道一种方法可以防止其查询在发生时重新启动吗?我无法找到它。

    谢谢。

0 个答案:

没有答案