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

时间:2012-09-12 13:21:47

标签: java jasper-reports ireport

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

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

可能的解决方案可以是

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

    请你建议一个更好的方法吗?我有一种感觉,这绝对可以更清洁地完成。

    感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您可以创建一个输入控件来确定所需的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}