如何创建具有多个1-M关系的报告?

时间:2010-12-02 16:11:11

标签: crystal-reports

我需要创建一个报告,为每个主行显示两组子(细节)行。在数据库术语中,您可以将其视为与表'B'具有1:M关系的表'A'以及与表'C'的1:M关系。因此,对于表'A'中的每一行,我想显示来自'B'(最好在一个部分中)的子行列表和来自'C'的子行列表(最好在另一部分中)。如果可能的话,我也希望避免使用子报告。我怎样才能做到最好?

感谢。

3 个答案:

答案 0 :(得分:2)

这正是Crystal的目的:)

  1. 制作一个空格.rpt并像往常一样连接到您的数据源。
  2. 转到报告 - >群组专家,然后选择您的分组字段(又名索引字段)。
  3. 现在,您将在设计视图中看到组标题部分。这是你的“大师行”。 详细信息部分将是您的“子行”。
  4. 在下面的示例图片中,此文件按{Client}分组。对于客户“ZZZZ”,有2条记录,所以有2个细节部分,而所有其他客户只有1个细节部分。

    alt text

    修改

    根据您的回复,这是怎么回事:

    1. 在您的数据源中(或者使用某种类型的中介,如MS Access),按如下方式启动SQL。
    2. 创建一个子查询,连接TblA的主键和TblB的外键。添加包含常量的第三列,例如“TBLB”
    3. 创建一个子查询,连接TblA的主键和TblC的外键。添加包含不同常量的第三列,例如“TBLC”
    4. 将这两个查询联合在一起。这将是你的水晶报告的“索引表”。
    5. 在Crystal中,您可以拥有多个分组级别。因此,首先按常量列分组,然后按TblA主键分组,再按外键分组。
    6. 这样,首先显示来自TblB的所有结果,然后显示TblC。表格B& C甚至不必具有相同的字段定义。

答案 1 :(得分:2)

我认为我理解你的问题,即对于表A中的给定行,您希望详细信息部分显示表B中的所有连接行,然后显示表C中的所有连接行(对于任意数量的行)在B或C中,包括零)。我只知道两个解决方案,这两个解决方案都不是直截了当的。

首先,正如您所猜测的那样,不喜欢的子报表选项。 第二个涉及数据库中的一些额外工作;具体而言,创建一个视图,将表B和表C中的条目组合到一个表中,然后可以在主报表中将其用作要报告的可链接对象,并且可以根据需要对表A进行分组。这有多简单取决于B和C的结构有多相似。如果它们实际上是相同的,那么视图可能包含一些简单的内容,如

SELECT 'B' AS DetailType, Field1, Field2, FieldLinkedToTableA
FROM TableB
UNION ALL
SELECT 'C' AS DetailType, Field1, Field2, FieldLinkedToTableA
FROM TAbleC 

但是,这两个选项都不能很好地扩展到包含大量结果的报表(除非您的服务器支持索引视图)。

答案 2 :(得分:0)

您可以使用或创建用于分组的列,然后在表A列上分组,然后在表B列上分组,然后分组C.(Crystal的组与t-sql“group by”不同。在Crystal中,它更多的是排序而不是分组。)