JRXML中的动态查询字符串

Lan*_*lot 0 report dynamic jasper-reports query-string

我正在尝试构建一个足够聪明的报告,根据某种输入参数略微修改其sql查询.

例如,如果该特殊修改参数值为"1",则会在select中添加一个字段,并将group by子句添加到查询中.

我查看了java表达式,但jrxml的queryString标记似乎不支持它们.还尝试创建一个包含java表达式的变量,并在queryString标记中使用该变量...这也不起作用!

现在我想可能有一个存储过程与所有逻辑,只是让jrxml使用修改输入参数调用该存储过程,但我正在处理的项目似乎没有很多存储proc,所以在我走这条路之前,我想看看是否还有其他解决方案.

谢谢你的帮助.


谢谢你们的帮助,非常感谢你们.然而,我找到了另一种方法,并将其发布以供参考:这里

小智 8

JasperDesign实际上允许您修改jrxml文档的部分内容.因此,假设您有一个"报告"软件包,您可以手动或通过iReport等工具存储您的报告.只要您的查询在标记中定义,<queryString>以下内容将允许您动态更改查询:

try {
    String fileName = getClass().getClassLoader().getResource("com/foo/myproject/reports/TestReport.jrxml").getFile();
    File theFile = new File(fileName);
    JasperDesign jasperDesign = JRXmlLoader.load(theFile);

    //Build a new query
    String theQuery = "SLECT * FROM myTable WHERE ...";

    // update the data query
    JRDesignQuery newQuery = new JRDesignQuery();
    newQuery.setText(theQuery);
    jasperDesign.setQuery(newQuery);

    JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
    Connection conn = MyDatabaseClass.getConnection();
    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, conn);
    JasperViewer.viewReport(jasperPrint);
} catch (Exception ex) {
    String connectMsg = "Could not create the report " + ex.getMessage() + " " + ex.getLocalizedMessage();
    System.out.println(connectMsg);
}
Run Code Online (Sandbox Code Playgroud)

通过这样的方法,您可以创建一个包含新查询的类的成员变量,并使用所需的任何用户约束来构建它.然后在查看时只需修改设计.

-Jeff