Crystal reports 使用子报表在Crystal Reports中消除节

Crystal reports 使用子报表在Crystal Reports中消除节,crystal-reports,subreport,suppress,Crystal Reports,Subreport,Suppress,我正在尝试基于此sql查询在crystal reports 11中创建一个报告 挑选* 来自表OM、表OL、表C 其中OM.ORDER=OL.ORDER 和OM.COMPANY=C.COMPANY 并存在选择* 来自表OSD,表OSDD 其中OSD.ORDER=OL.ORDER 而OSD.LINE=OL.LINE 和OSD.REVISION=OL.REVISION 和OSD.DIM=OSDD.DIM 和OSDD.SHAPE=OL.SHAPE 我认为最好的开始方式是使用前两个表创建主报表,使用查询

我正在尝试基于此sql查询在crystal reports 11中创建一个报告

挑选* 来自表OM、表OL、表C 其中OM.ORDER=OL.ORDER 和OM.COMPANY=C.COMPANY 并存在选择* 来自表OSD,表OSDD 其中OSD.ORDER=OL.ORDER 而OSD.LINE=OL.LINE 和OSD.REVISION=OL.REVISION 和OSD.DIM=OSDD.DIM 和OSDD.SHAPE=OL.SHAPE


我认为最好的开始方式是使用前两个表创建主报表,使用查询的EXISTS部分创建子报表,并链接回主报表。“我的详细信息”部分包含主报表和子报表中的数据。对于子报表返回值的位置,我得到了正确的结果,但是如果子报表为空,我希望能够抑制主报表的详细信息部分,但是我找不到在任何选择公式中引用子报表的方法。如果有更好的方法来模拟此查询,我愿意接受建议。

如果您不想看到子报表为空的任何数据,则没有理由使用子报表。你把报告复杂化了


如果仍要执行此操作,则“抑制”属性允许使用表达式。您可能需要使用globalvar变量,根据子报表设置变量,但我怀疑它是否会在显示行之前设置。

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

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中找到匹配项的行。然后,您可以使用许多选项来抑制不希望看到的行,例如按照rexem的建议,在section expert中使用he抑制公式


希望这能有所帮助。

我怀疑我让它变得比需要的更困难,但我假设根据子报告可以很容易地抑制它。全局变量的想法很有希望,但我决定按照你的第一个建议进行简化。既然这样做有效,那就进行一次投票并给出一个公认的答案如何