java - 如何操作 jrxml 模板中指定的 SQL

标签 java jasper-reports ireport

问题:报告模板由管理员用户创建,他们仅决定在何处显示哪些数据,因为数据过滤器由业务用户指定。用更简单的 SQL 术语来说,查询由管理员用户指定,业务用户指定 WHERE 子句。

Jasper 允许用户在 SQL 查询中指定参数,例如 $P{city}。我尝试使用 link 中指定的方法动态检索查询.

可能的解决方案是

  1. 在 JRXML 中使用 WHERE 子句参数并在创建报告时替换它们 - 这将节省 SQL 解析,但我不想指导管理员用户处理这种复杂性。解析并不是一个大问题。
  2. 使用我的自定义 jdbc 查询执行器和工厂,创建它只是为了允许我在 jasper 触发 SQL 查询之前使用扩展点。我将完全依赖 vanilla Jasper JDBC 数据源,但只会在执行前修改查询。 JRAbstractQueryExecuter 简化了查询,并在触发查询之前替换了 jasper 相关标记 - 这将非常脏,并且将迫使我特定于实现。
  3. 执行与我的应用程序代码库中的 JRAbstractQueryExecuter 中相同的替换,解析 SQL 查询,修改它并按照 link 中的指定再次设置它。

您能建议一个更好的方法吗?我有一种感觉,这绝对可以以更干净的方式完成。

感谢您的帮助

最佳答案

您可以创建一个输入控件来确定所需的 WHERE 子句并使用参数来保存该 WHERE 子句的内容。默认值表达式类似于:

 $P{theParameter} == "value_1" ?
     (" AND CONDITION_1 IN ('A', 'B', 'C') AND CONDITION_2 = 'Yes' "
     ) : " AND CONDITION_3 = 'Other' AND CONDITION_4 = 'No' "

然后在 WHERE 子句中您可以像这样引用它:

 WHERE
      .... = .....
      AND .... = ....
      AND .... = ....
      $P!{theParameter}

如果 WHERE 子句中的约束列相同,则可以使用 $P!从字面上引入参数值,并在查询中引用它:

 WHERE
      .... = .....
      AND .... = ....
      AND .... = ....
      AND thisValue = $P!{theParameter}

关于java - 如何操作 jrxml 模板中指定的 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12389174/

相关文章:

jasper-reports - 如何在JasperReport中插入分页符

java - javac无法识别的命令

java - 在java中搜索列表中对象的最快方法

java - 引发错误时会发生什么?

java - 将 RTF 文件转换为 DOC

java - 使用 iReport 5 的空白子报表

java - 在 JasperReport/iReport 中包含长静态文本的最佳方法是什么?

java - 无法加载以下字体

java - 什么是NullPointerException,我该如何解决?

java - Jasper 报告 JAVA Swing