【问题标题】:"Rolling up" groups in Jaspersoft iReportJaspersoft iReport 中的“汇总”组
【发布时间】:2012-06-05 13:12:03
【问题描述】:

我的损益报告目前分为三个级别: 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

【问题讨论】:

  • 发布您的 SQL(或它的简化版本)。使用参数应该可以得到你需要的。
  • 谢谢!我发布了我的代码的简化版本。

标签: sql jasper-reports ireport


【解决方案1】:

您拥有正确的 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 保留在报告中。但是这个基本的想法应该可以满足您的需要。

【讨论】:

  • 这很好用。非常感谢你的帮助!我没有考虑定义另一个参数,所以我可以使用 $P!以这种方式。我可以看到自己经常使用它。
  • 非常有趣。我以前从来没有这样做过。一个非常有创意的解决方案。
  • Matthew,我将它部署到 JasperServer 并为设施和包类型值设置级联输入控件。它适用于 iReport 但不适用于 JasperServer。没有任何输入控件是强制性的,在 JasperServer 中我未选中“始终提示”。当报表第一次打开时,它会像它应该的那样卷起组,但是从输入控件中,如果我只选择一个药房而不选择任何其他输入控件,它会显示其他输入控件的所有元素,比如_select_sql 参数被忽略。关于我能做些什么来解决这个问题的任何想法?再次感谢您。
  • 是级联输入控制列表的内容有问题吗?还是与报告的内容? (或两者兼而有之?)我会首先打印标题带中所有参数的内容,以确定问题从哪里开始。
  • 感谢您的提示!当我第一次打开报告时,它产生了空值,但提交空输入控件会产生空列表。我正在使用集合变量。我编辑了我的参数来处理空值和空列表,现在它工作得很好。我将针对我专门为这个问题创建的问题发布更详细的解释。
【解决方案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})

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

【讨论】:

  • 药房、客户和包装类型都是 java.util.collection 类型的变量,在查询的 where 子句中,我使用 $X 设置参数,例如 $X{IN, PHARMACIES, pharmacy}。所以你的回答让我意识到,当我使用药房/客户/包装类型的默认值时,它会返回每个值的每个值。我不希望每个都有不同的值,我想要组聚合。我只需要弄清楚如何告诉 iReport。
  • 看起来我们可以指定更多数据(使用 $X{... 来获取给定客户的每种包装类型,或仅一种类型或多种类型),但似乎没有我们可以在 JRXML 模板中动态操作分组级别的数量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多