我需要在subReport中计算我正在计算的项目的总数。为此,我认为我需要将该变量的值添加到每个迭代的另一个变量中,或者用该值“递增”它。为每个组调用subReport,我得到该组的总数。我需要添加变量值,而不是数据库列/字段。
我从returnValue
收到一个整数subReport
,它本身就是子报告中的行数。我希望获得总计,因为从我的主SQL查询中为不同的结果(每个为GROUP)多次调用subReport
。我想将所有结果相加,但我得到null
值。我尝试将操作添加到subReport
作为新的returnValue
并选择Sum
作为操作,但这也产生了null
。
<variable name="itemCount" class="java.lang.Integer" resetType="None"/>
<variable name="grandCount"
class="java.lang.Integer"
incrementType="Group"
incrementGroup="ITEM_BUNDLE">
<variableExpression><![CDATA[$V{itemCount}]]></variableExpression>
</variable>
...
<returnValue subreportVariable="countItems" toVariable="itemCount"/>
答案 0 :(得分:7)
将属性calculation="Sum"
添加到variable name="grandCount"
或将grandCount
传递给子报告作为参数
<subreportParameter name="grandCount">
<subreportParameterExpression><![CDATA[$P{grandCount}]]></subreportParameterExpression>
</subreportParameter>
子报告中的声明变量 countItems ,其参数为 grantCount
的initialValue<variable name="countItems" .... >
<variableExpression><![CDATA[$P{itemCount} + $P{grandCount}]]></variableExpression>
<initialValueExpression><![CDATA[$P{grandCount}]]></initialValueExpression>
</variable>
并返回
<returnValue subreportVariable="countItems" toVariable="grandCount" calculation="Sum"/>
答案 1 :(得分:1)
只有当band(group)等于子报表所在的band(group)时,才可以尝试增加变量(我将其命名为totalSum)。为此,您需要在报告中使用一个字段来为您提供当前频段(组)。
<variable name="totalSum"
class="java.lang.Integer"
resetType="Report"
incrementType="Group"
incrementGroup="ITEM_BUNDLE"
calculation="Nothing">
<variableExpression>
<![CDATA[new Boolean($F{reportPart}.equals("The_band_with_the_subreport")).booleanValue() ? $V{returnValue} : $V{totalSum}]]>
</variableExpression>
<initialValueExpression>
<![CDATA[new Integer(0)]]>
</initialValueExpression>
</variable>
我不确定这是否有效,我没有测试它的上下文。但您也可以使用三个变量尝试第二个解决方案。例如,您将子报表返回的值(例如 returnValue )保留在变量中,并使用另外两个变量来保存总和 - 一个直到调用子报表(假设为 partialSum) )和第二个存储returnValue和partialSum之间的总和。我们称之为totalSum。然后你会有这样的东西为totalSum:
<variable name="totalSum"
class="java.lang.Integer"
resetType="Report"
incrementType="Group"
incrementGroup="ITEM_BUNDLE"
calculation="Nothing">
<variableExpression>
<![CDATA[$V{returnValue} + $V{partialSum}]]>
</variableExpression>
<initialValueExpression>
<![CDATA[new Integer(0)]]>
</initialValueExpression>
</variable>
对于partialSum,你会有这样的事情:
<variable name="partialSum"
class="java.lang.Integer"
resetType="Report"
calculation="Sum"
incrementType="None">
<variableExpression>
<![CDATA[new Boolean($F{reportPart}.equals("The_band_with_the_subreport")).booleanValue() ? $V{returnValue} : new Integer(0)]]>
</variableExpression>
<initialValueExpression>
<![CDATA[new Integer(0)]]>
</initialValueExpression>
</variable>
我希望这会有所帮助。在您想要使用的报告上直接从iRport进行所有这些设置会更容易。
答案 2 :(得分:0)
我不确定如何在JRXML中编写它,因为我使用iReport。 在iReport中,我创建了一个新的变量,类类型为“Integer”,计算类型为“System” 计算类型在这里很重要。
在变量表达式中,您需要类似$ V {grandCount} = $ V {grandCount} + $ V {itemCount}
的内容注意:JasperReports逐个波段渲染,因此您无法在子报告波段之前的波段中使用grandCount变量。
希望我不要太晚