0

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

SELECT *
    FROM (table) OM, (table) OL, (table) C
    WHERE OM.ORDER = OL.ORDER
    AND OM.COMPANY = C.COMPANY
    AND (EXISTS (SELECT *
            FROM (table) OSD, (table) OSDD
            WHERE OSD.ORDER = OL.ORDER
            AND OSD.LINE = OL.LINE
            AND OSD.REVISION = OL.REVISION
            AND OSD.DIM = OSDD.DIM
            AND OSDD.SHAPE = OL.SHAPE))

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

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

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

4

2 回答 2

1

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

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

于 2009-08-07T20:36:59.323 回答
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 的找到匹配项的行。然后,您有许多选项可以抑制您不希望看到的行,例如按照 rexem 的建议在部分专家中使用他抑制公式。

希望这可以帮助。

于 2009-08-07T22:01:37.263 回答