【问题标题】:JasperReports: A dynamic table name using a variable? [duplicate]JasperReports:使用变量的动态表名? [复制]
【发布时间】:2017-03-13 18:30:04
【问题描述】:

我尝试创建的 JasperServer 报告存在以下问题: 我有几个数据库表,使用这样的名称和日期命名:

TABLE_NAME_YYYYMMDD

我希望能够从普通日期输入控件中选择(并从中选择)与用户提交的日期相对应的表。

我尝试创建一个变量(称为 TABLE_NAME),它使用 Java 表达式来解析日期,例如:

"MY_TABLE_" + new SimpleDateFormat("yyyyMMdd").format($P{RUN_DATE})

当我在报告中打印变量的值时,它看起来是正确的。但后来我尝试在 SQL 查询中使用该变量名,例如:

SELECT column1,column2.. from $V{TABLE_NAME}

但是当我尝试在 Jaspersoft Studio 中运行报告时,我得到了这个异常:

net.sf.jasperreports.engine.JRException: net.sf.jasperreports.engine.JRException: Error executing SQL statement for: my_report_x.
at com.jaspersoft.studio.editor.preview.view.control.ReportControler.fillReport(ReportControler.java:511)
at com.jaspersoft.studio.editor.preview.view.control.ReportControler.access$20(ReportControler.java:486)

所以它似乎不起作用。

我了解到可以在参数中指定整个表名的情况,您应该使用:

$P!{tableName}

首先我尝试使用那个 '!'变量名如下:

..from $V!{TABLE_NAME}

但我遇到了同样的异常。

然后我尝试创建一个新参数,其中未选中“Is For Prompting”,并且作为默认值表达式,我放置了与变量中使用的相同的表达式:

"MY_TABLE_" + new SimpleDateFormat("yyyyMMdd").format($P{RUN_DATE})

但当我尝试在 Jaspersoft Studio 中运行报告时,我仍然遇到同样的错误。

有人知道有没有办法解决这个问题? - 最好是不需要几天才能实施的方法,因为我没有那个时间。

我正在使用 Jaspersoft Studio 6.1.1.final 并在 JasperServer 5.5.0 中运行报告。

【问题讨论】:

    标签: jasper-reports


    【解决方案1】:

    您应该能够通过将整个 FROM 表达式包装在参数中来使其工作,例如

    <parameter name="pTableName" class="java.lang.String">
        <defaultValueExpression><![CDATA["from MY_TABLE_" + new SimpleDateFormat("yyyyMMdd").format($P{RUN_DATE})]]></defaultValueExpression>
    </parameter>
    

    然后在你的 SQL 中使用它作为字符串文字:

    SELECT column1,column2
    $P!{pTableName}
    WHERE 1 = 1
    

    【讨论】:

    • 我试过了,但恐怕我仍然得到“执行 SQL 语句时出错..”。
    • 虽然,我的 From 语句确实有点复杂,因为我使用“,”连接多个表。我尝试将所有这些表都放在表达式中,所以使用 $P!{TABLE_NAME} 之后的下一件事是 Where 语句,但它不起作用。
    • 好的,这可能是一个愚蠢的问题,但是您是否确认如果您只是硬编码表名就可以工作?
    • 是的,我试过了,效果很好。但正如我解释的那样,我想做的事情有点复杂。
    • 我假设了很多,但它总是值得检查。我认为如果没有我们看到您的“更复杂”如何工作的示例代码,很难就此提出建议。另外,您是否也在 Studio 内置的 SQL 编辑器中运行它以查看是否收到更好的错误消息?
    【解决方案2】:

    我刚刚发现我做错了什么。

    我承认这很愚蠢,但我只尝试在 Jaspersoft Studio 的预览模式下运行报告。那是我收到 SQL 错误的时候。

    但我假设预览模式不支持关于从哪个表读取的动态决定,因为当我忽略预览错误并将报告发布到 JasperServer 时,我实际上可以在那里运行它!

    我最终使用了 $P!{TABLE_NAME} 参数,其中的值是我之前尝试过的:

    "MY_TABLE_" + new SimpleDateFormat("yyyyMMdd").format($P{RUN_DATE})
    

    如果你想看的话,我可以在这里尽可能多地打印我的 SQL(这意味着我必须替换名称,因为这是一份工作报告):

        select c.column1,c.column2, h.column3 from $P!{TABLE_NAME} h, TABLE2 i, TABLE3 p, TABLE4 ca, TABLE5 c 
    where h.P_ID = p.P_ID and h.A_ID = ca.A_ID and ca.C_ID = c.C_ID and ca.SOME_VALUE = 1 and ca.OTHER_VALUE = 1
    and i.I_ID=h.I_ID  
    and i.OTHER_ID=1
    and h.VALUE_X > 0
    order by c.VALUE_Y
    

    因此,我对创建 Jasper 报告的其他人的建议是不要让自己被某些东西在预览模式下不起作用的事实所迷惑。 - 这可能只是“预览限制”。

    【讨论】:

      猜你喜欢
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 2012-06-18
      • 2011-02-23
      • 2018-05-06
      • 2012-12-11
      • 1970-01-01
      相关资源
      最近更新 更多