当我有多个表时如何使用明细节

问题描述 投票:0回答:1

我最近不得不接手使用CR 2013创建报表,但是我得到的介绍有点晦涩难懂,因此我有时会遇到一些问题。

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

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

这很好,直到我应该附加一个子报表,该子报表仅在包含任何记录时才显示。在我的第一次尝试中,如果子报表主要对象的ID字段为Null,则将子报表附加到报表页脚中并禁止显示该部分。

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

我通过从主记录中删除表并抑制其内部的子报告来解决此问题。

但是有一种解决方案,只为特定表的记录打印明细部分?甚至有理由这样做吗?我之所以问是因为我想确保自己理解以后的概念。

谢谢你。

crystal-reports crystal-reports-2013
1个回答
0
投票

我知道第二张表的引入引起了细节的重复,因为它使Crystal产生了两张表的笛卡尔积。

为了方便起见,我们这样调用两个表:TableA,TableB。

[仅使用TableA时,请认为Crystal可以这样做:

select * from TableA

然后您介绍TableB,然后Crystal会做到这一点(只是一种心理模型,我并不是说它确实做到了):

select * from TableA, TableB

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

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

例如:TableA = {1,2}; TableB = {X,Y};结果= {1X,1Y,2X,2Y}

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

  1. 让您的主报表仅了解TableA,而子报表仅了解TableB。
  2. 创建一个额外的组(代理,最里面)。它应该在TableA中按唯一值分组(Id值会很大)。然后,将字段从详细信息部分移到新的组页脚部分,并取消显示详细信息部分。

还有另一种方法:在两个表之间创建链接,但是可能取决于数据,所以我不能声称它会起作用。这将导致Crystal做类似的事情:

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

它可能会删除重复项。

© www.soinside.com 2019 - 2024. All rights reserved.