Jaspersoft iReport中的“滚动”组

时间:2012-06-05 13:12:04

标签: sql jasper-reports ireport

我有一份盈亏报告,目前有三个级别的分组: 1.药房 2.客户 3.包装类型

我已设置报告以提示用户提供药房,客户和包装类型的值。细节带显示收入和保证金等指标。选择药房,客户或包装类型的默认值将返回组中的所有值。

我想知道 - 有没有办法,如果用户为参数选择“使用默认值”,告诉iReport汇总分组?现在,如果我选择药房和客户但是使用默认的包装类型,我仍然会为每种包装类型获得一个细节带。我怎样才能告诉iReport总结所有包装类型?或者,如果没有指定客户,请对给定药房的所有客户求和?或者我可以在查询中执行此操作吗?我有一个Oracle数据库,正在使用iReport Professional 4.5.1。

谢谢, 莉莎

编辑添加代码:

 SELECT
      FAC.FILL_MONTH AS FILL_MO,
      FAC.PHAR_CODE AS PHAR_CODE,
      FAC.FAC_ID AS FAC_ID,
      FAC.PACKTYPE_CODE AS PACKTYPE,
      SUM(FAC.TOT_RXCOUNT_NUM) AS RX_COUNT,
      SUM(FAC.TOT_REVENUE_AMT) AS REVENUE,
      SUM(FAC.TOT_COGS_AMT) AS COGS,
      SUM(FAC.TOT_MARGIN_AMT) AS MARGIN
 FROM
      MySchema.Table FAC
 WHERE
      FAC.FILL_MONTH BETWEEN $P{startdate} AND $P{enddate}
      AND $X{IN, FAC.PHAR_CODE, pharmacy}
      AND $X{IN, FAC.FAC_ID, facility}
      AND $X{IN, FAC.PACKTYPE_CODE, packtype}
 GROUP BY
      FAC.PHAR_CODE,
      FAC.FAC_ID,
      FAC.PACKTYPE_CODE,
      FAC.FILL_MONTH
 ORDER BY
      PHAR_CODE ASC,
      FAC_ID ASC,
      PACKTYPE ASC,
      FILL_MO ASC

2 个答案:

答案 0 :(得分:3)

您可以正确使用SQL来获取所需的原始数据。但是,在用户未指定PACKTYPE的特殊情况下,您需要修改它以强制PACKTYPE(和其他字段)进行不同的分组。

创建新参数$P{PACKTYPE_SELECT_SQL}。其默认值直接基于现有参数$P{packtype}的值。 (这意味着$P{packtype}必须首先出现在.jrxml中。)将$P{PACKTYPE_SELECT_SQL}的默认值设置为:

$P{packtype}==null ? " 'All Package Types' " : " FAC.PACKTYPE_CODE "

然后像这样修改SQL查询(只修改一行,其余的只是上下文):

SELECT
     FAC.FILL_MONTH AS FILL_MO,
     FAC.PHAR_CODE AS PHAR_CODE,
     FAC.FAC_ID AS FAC_ID,
     $P!{PACKTYPE_SELECT_SQL} AS PACKTYPE,
...
WHERE
     FAC.FILL_MONTH BETWEEN $P{startdate} AND $P{enddate}
     AND $X{IN, FAC.PHAR_CODE, pharmacy}
     AND $X{IN, FAC.FAC_ID, facility}
     AND $X{IN, FAC.PACKTYPE_CODE, packtype}

如果$P{packtype}不为null,则生成的SQL将与之前完全一样。但是在$P{packtype}为空的情况下,您现在将获得一个硬编码的字符串来代替PACKTYPE_CODE。

据推测,您的报告正在PACKTYPE进行分组。因此,您应该能够保持报告中的布局和分组不变。

您可以想象添加布尔输入控件之类的变体,以明确让用户选择是否将PACKTYPE保留在报表中。但是这个基本想法应该能满足你的需求。

答案 1 :(得分:2)

我会尝试在查询中执行此操作。如果没有查看您的查询,很难给出细节,但我可以提供一些我的代码作为示例。在此特定的jasper报告中,我将根据用户指定的PGM_NAME和USER_NAME显示值。但是,指定这些参数是可选的。如果未指定参数,则默认为所有PGM_NAME和/或USER_NAME报告。在我的ireport查询中,WHERE子句包含以下行:

WHERE   ($P{PGM_NAME} IS NULL OR job.pgm_name = $P{PGM_NAME})
AND     ($P{USER_NAME} IS NULL OR details.username = $P{USER_NAME})

这就像一个魅力。我希望这有助于您确定如何调整自己的查询。如果您对此有所帮助,请在您的问题中发布查询。