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

时间:2017-03-13 18:30:04

标签: jasper-reports

我在尝试创建的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中运行报告。

2 个答案:

答案 0 :(得分:2)

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

struct Pixel
{
  unsigned int red;
  unsigned int green;
  unsigned int blue;
};
std::vector< std::vector<Pixel> > bitmap;

然后在SQL中将其用作字符串文字:

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

答案 1 :(得分:1)

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

我承认这是相当愚蠢的,但我只是尝试在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报告的人的建议不是让自己被某些事情在预览模式下工作所迷惑。 - 这可能只是&#34;预览限制&#34;。