Jasper reports JasperReports:使用变量的动态表名?

Jasper reports JasperReports:使用变量的动态表名?,jasper-reports,Jasper Reports,我试图创建的JasperServer报告存在以下问题: 我有几个db表,使用如下名称和日期命名: TABLE_NAME_YYYYMMDD 我希望能够选择(并从中选择)与用户从普通日期输入控件提交的日期相对应的表 我尝试创建一个变量(称为TABLE_NAME),它使用Java表达式解析日期,如: "MY_TABLE_" + new SimpleDateFormat("yyyyMMdd").format($P{RUN_DATE}) 当我在报告中打印变量的值时,它看起来是正确的。但后来我尝试在SQ

我试图创建的JasperServer报告存在以下问题: 我有几个db表,使用如下名称和日期命名:

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中运行报告。

您应该能够通过将整个FROM表达式包装在参数中来实现这一点,例如

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

您应该能够通过在参数中包装整个FROM表达式来实现这一点,例如

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

我刚刚发现我做错了什么

我承认这很愚蠢,但我只是尝试在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报告的人的建议是,不要让自己被某些东西在预览模式下无法工作的事实所愚弄-这可能只是“预览限制”。

我刚刚发现我做错了什么

我承认这很愚蠢,但我只是尝试在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报告的人的建议是,不要让自己被某些东西在预览模式下无法工作的事实所愚弄-这可能只是“预览限制”。

我试过了,但我担心仍然会遇到“执行SQL语句时出错…”。不过,我的From语句确实有点复杂,因为我使用“,”连接了多个表。我尝试将所有这些表都放在表达式中,以便在使用$P之后的下一件事!{TABLE_NAME}是Where语句,但它不起作用。好吧,这可能是个愚蠢的问题,但是你确认了吗?如果你只是硬编码表名,它就起作用了吗?是的,我试过了,而且有效。但正如我所解释的,我想做的有点复杂。我假设了很多,但总是值得检查的。我认为如果我们没有看到关于“更复杂”的工作原理的示例代码,就很难对此给出建议。另外,您是否也在Studio内置的SQL编辑器中运行它,以查看是否得到更好的错误消息?我尝试过,但恐怕仍然得到“执行SQL语句时出错…”。不过,我的From语句确实有点复杂,因为我使用“,”连接了多个表。我尝试将所有这些表都放在表达式中,以便在使用$P之后的下一件事!{TABLE_NAME}是Where语句,但它不起作用。好吧,这可能是个愚蠢的问题,但是你确认了吗?如果你只是硬编码表名,它就起作用了吗?是的,我试过了,而且有效。但正如我所解释的,我想做的有点复杂。我假设了很多,但总是值得检查的。我认为如果我们没有看到关于“更复杂”的工作原理的示例代码,就很难对此给出建议。另外,您是否也在Studio内置的SQL编辑器中运行它,以查看是否得到更好的错误消息?