2013-10-22 44 views
0

在我的报告中目前有2个子报表,我们称它们为AB
A列出了现金头寸,而B列出了股票。
我从基于web的Java环境运行此报告,JasperReports的报告从sql数据库读取。子报表订单排序

我想将一个参数传递给JR报告,告诉它按照什么顺序排列子报表,在这种情况下用于例如(B第一,然后A或反之亦然)。

有没有办法做到这一点?

回答

1

您应该发送一个布尔类型的参数。同时生成报告。在该参数的基础上,您应该定义子报表的路径。 这里是subrepor path.e.g.的jrxml代码。

对于第一子报表:

<subreport> 
      <reportElement uuid="8dba7f58-0466-4504-9d51-7484786450d2" positionType="Float" x="0" y="16" width="315" height="16"/>    
      <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listOfObject})]]></dataSourceExpression> 
      <subreportExpression><![CDATA[$P{swap} == true ? "/path/to/first/subreport" : /path/to/second/subreport]]></subreportExpression> 
     </subreport> 

而对于第二子报表:

<subreport> 
     <reportElement uuid="8dba7f58-0466-4504-9d51-7484786450d2" positionType="Float" x="0" y="16" width="315" height="16"/>    
     <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{listOfObject})]]></dataSourceExpression> 
     <subreportExpression><![CDATA[$P{swap} == true ? "/path/to/second/subreport" : /path/to/first/subreport]]></subreportExpression> 
    </subreport> 

而在其他case.I反之亦然没有测试。请看一看。

享受。

+0

谢谢你的帮助。 – Sil

+0

现在要从这个例子走向现实 - 有一个X数量的子报表(假设我有10个 - 现金,股票,期货等),所以来自数据库的参数不仅是订单的子报告,但也显示哪些。 - 因此数据可能是B,D,A(运行报告2,然后是4,然后是1 ..除外)。有没有办法做到这一点? – Sil

+1

如果您有超过2个子报表,并且您想根据您的选择管理它们,那么您应该使用动态碧玉。 – user1791574

0

您可以使用更复杂的subreportExpression和“打印时的表达式”。 在第一组报表打印时,在第二

$P{NUM_OF_SUBS} <= 2 ? true : false 

$P{NUM_OF_SUBS} <= 1 ? true : false 

等等 以及在第一报表类似subreportExpression:

$P{SUBS}.split(",")[1] == "A" 
    ? "repo:subA.jrxml" 
    : $P{SUBS}.split(",")[1] == "B" 
     ? "repo:subB.jrxml" 
     : $P{SUBS}.split(",")[1] == "C" 
     ? "repo:subC.jrxml" 
     : "repo:subD.jrxml" 

和第二:

$P{SUBS}.split(",")[2] == "A" 
    ? "repo:subA.jrxml" 
    : $P{SUBS}.split(",")[2] == "B" 
     ? "repo:subB.jrxml" 
     : $P{SUBS}.split(",")[2] == "C" 
     ? "repo:subC.jrxml" 
     : "repo:subD.jrxml" 

etc ...

+0

谢谢。我清楚地看到这指向只有一个子报表循环访问数组,并且每次都执行检查并调用子报表(尽可能多地存储数组中的值)是可能的吗? – Sil

+0

如果将subReport元素置于详细信息中它会渲染从数据源读取的每一行,并且你可以使用字段而不是参数来确定显示哪个子报表。 –

+0

是的。但它不会遍历数组。 – Sil