0

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

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

可能的解决方案是

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

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

谢谢你的帮助

4

1 回答 1

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}
于 2012-09-13T12:06:37.420 回答