如何在JasperReports中使用另一个变量的值增加变量?

时间:2009-09-29 21:10:27

标签: jasper-reports

我需要在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"/>

3 个答案:

答案 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变量。

希望我不要太晚