0

我最近不得不接手使用 CR 2013 创建报告,但我得到的介绍有点乏味,所以我不时遇到一些问题。

最近我不得不第一次使用详细信息部分,因为我能够以某种方式仅通过分组和子报表来处理以前的报表。

现在,我正在做的是创建一个报告,在表格中列出每个人的某些个人资产。首先,我按组织分组,然后按人员分组,然后将包含资产的字段放入详细信息中。

这工作得很好,直到我应该附加一个只有在它包含任何记录时才应该显示的子报告。在我的第一次尝试中,我在报表页脚中附加了子报表,如果子报表的主要对象的 ID 字段为空,则取消该部分。

但这导致详细信息部分中的所有个人资产都被复制,我猜是因为它重新打印了原始表和子报告表中所有记录的详细信息。

我通过从主记录中删除表并在其内部隐藏子报表来解决这个问题。

但是有没有解决方案只打印特定表记录的详细信息部分?甚至有理由这样做吗?我之所以问,是因为我想确保我理解这些概念。

先感谢您。

4

1 回答 1

0

我理解第二张表的引入导致细节的重复,因为它导致水晶制作了两张表的笛卡尔积。

让我们这样称呼这两个表是为了方便:TableA,TableB。

当您仅使用 TableA 时,认为 Crystal 会这样做:

select * from TableA

然后你介绍 TableB,Crystal 会这样做(只是一个心智模型,我并不是说它真的会这样做):

select * from TableA, TableB

如果您了解 SQL,您会注意到发生了什么:两个表中所有元素的组合。

然后,详细信息部分将考虑此组合的每个结果。

例如:表 A = {1,2};表 B = {X,Y}; 结果 = {1X,1Y,2X,2Y}

一般来说,有两种方法可以避免这种情况。我不知道哪一个适用,因为我不知道你案件的所有细节。

  1. 让您的主报表只知道 TableA,而子报表只知道 TableB。
  2. 创建一个额外的组(代理,最里面)。它应该按 TableA 中的唯一值分组(Id 值会很棒)。然后将字段从详细信息部分移动到这个新的组页脚部分并禁止详细信息部分。

还有另一种方法:在两个表之间创建一个链接,但这取决于数据,所以我不能声称它会起作用。这将导致 Crystal 执行以下操作:

select * from TableA, TableB where TableA.Id = Table.ReferenceToA

它可能会删除重复。

于 2020-05-19T11:54:21.260 回答