使用子报表抑制Crystal Reports中的部分

时间:2009-08-07 20:29:43

标签: crystal-reports subreport suppress

我正在尝试在基于此SQL查询的水晶报表11中创建报表

SELECT *
FROM(表)OM,(表)OL,(表)C
在哪里OM.ORDER = OL.ORDER
和OM.COMPANY = C.COMPANY
AND(EXISTS(SELECT *
FROM(表)OSD,(表)OSDD
            在哪里OSD.ORDER = OL.ORDER
和OSD.LINE = OL.LINE
和OSD.REVISION = OL.REVISION
和OSD.DIM = OSDD.DIM
AND OSDD.SHAPE = OL.SHAPE))

我认为最好的方法是使用前两个表创建主报表,并使用查询的“EXISTS”部分创建子报表并链接回主报表。

我的详细信息部分包含主报告和子报告中的数据。我得到了子报表返回值的正确结果,但是如果子报表为null,我希望能够抑制主报表的详细信息部分,但是我找不到在任何一个子报表中引用子报表的方法选择公式。

如果有更好的方法可以模仿这个查询,我愿意接受建议。

2 个答案:

答案 0 :(得分:1)

如果您不希望看到子报表为空的任何数据,则没有理由使用子报表。你的报告过于复杂。

如果您仍想执行此操作,则Suppress属性允许使用表达式。您可能必须使用globalvar变量,根据子报表设置变量,但我怀疑它会在显示的行之前设置。

答案 1 :(得分:0)

我不确定您使用的是哪种类型的数据库,但我相信您可能会使用以下内容:

select * --you probably should narrow this down instead of using a *
from (table) OM
inner join (table) OL on OM.ORDER = OL.ORDER
inner join (table) C on OM.COMPANY = C.COMPANY
inner join (table) OSD on OSD.ORDER = OL.ORDER 
    and OSD.LINE = OL.LINE 
    and OSD.REVISION = OL.REVISION
    and OSD.DIM = OSDD.DIM
inner join (table) OSDD on OSDD.SHAPE = OL.SHAPE

这是我的头脑并没有经过测试,但我们的想法是它会显示OM,OL,C,OSD和OSDD中找到匹配项的所有记录。因为你没有在OSD或OSDD上使用左连接,所以你不应该有任何空行。

但是你可以随时将它们改为左外连接,如:

select * --you probably should narrow this down instead of using a *
from (table) OM
inner join (table) OL on OM.ORDER = OL.ORDER
inner join (table) C on OM.COMPANY = C.COMPANY
left outer join (table) OSD on OSD.ORDER = OL.ORDER 
    and OSD.LINE = OL.LINE 
    and OSD.REVISION = OL.REVISION
    and OSD.DIM = OSDD.DIM
left outer join (table) OSDD on OSDD.SHAPE = OL.SHAPE

这将为您提供OM,OL和C中的所有行以及仅发现匹配的OSD和OSDD中的行。然后你有很多选项来抑制你不希望看到的行,例如在专家一节中使用he suppress公式作为rexem建议。

希望这有帮助。