JRXML中的动态查询字符串

时间:2009-03-16 23:10:25

标签: dynamic jasper-reports query-string report

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

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

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

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

感谢您的帮助。


谢谢你们的帮助,非常感谢你们。但是我发现了另一种方法,并将其发布以供参考:here

3 个答案:

答案 0 :(得分: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);
}

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

-Jeff

答案 1 :(得分:1)

JasperDesign帮助我解决了在Jrxml文件上构建动态查询的问题。

要构建动态SQL,我使用Squiggle(Google代码)动态构建SQL。 谢谢杰夫

答案 2 :(得分:0)

我已经使用存储过程来完成它,这些存储过程对于这些类型的东西都很好。否则,您可以切换到Java。只需从数据库中获取数据,然后根据用户提供的参数对其进行过滤,对其进行分组,并将其作为一组bean发送到Jasper报告中,该报告将进行渲染。