Подтвердить что ты не робот

Как я могу прирастить переменную со значением другой переменной в JasperReports?

Мне нужно сделать общее количество элементов, которые я рассчитываю в субрейтинге. Чтобы сделать это, я думаю, мне нужно добавить значение этой переменной к другой переменной для каждой итерации или "увеличить" ее на это значение. SubReport вызывается для каждой группы, и я получаю итоговое значение для этой группы. Мне нужно добавить значения переменных, а не столбцы/поля базы данных.

Я получаю целое число returnValue из subReport, которое само является подсчетом строк в под-отчете. Я хочу получить общее количество, так как subReport вызывается несколько раз для разных результатов (каждый для группы) из моего основного SQL-запроса. Я хочу добавить все результаты, но я получаю значение 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"/>

4b9b3361

Ответ 1

Добавить атрибут calculation="Sum" в variable name="grandCount"

или передать grandCount для представления в качестве параметра

<subreportParameter name="grandCount">
<subreportParameterExpression><![CDATA[$P{grandCount}]]></subreportParameterExpression>
</subreportParameter>

в subreport объявляет переменные countItems с initialValue параметра grantCount

<variable name="countItems" .... >
   <variableExpression><![CDATA[$P{itemCount} + $P{grandCount}]]></variableExpression>
   <initialValueExpression><![CDATA[$P{grandCount}]]></initialValueExpression>
</variable>

и верните

<returnValue subreportVariable="countItems" toVariable="grandCount" calculation="Sum"/>

Ответ 2

Вы можете попытаться увеличить свою переменную (я назвал ее 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 непосредственно в отчете, который вы хотите использовать.

Ответ 3

Я не совсем понимаю, как записать его в JRXML, так как я использую iReport. В iReport я создаю новую переменную с типом класса "Целое число" и тип расчета "Система", Здесь очень важен тип расчета.

В выражении переменной вам понадобится нечто вроде $V {grandCount} = $V {grandCount} + $V {itemCount}

ПРИМЕЧАНИЕ. JasperReports отображает диапазон по диапазону, поэтому вы не сможете использовать переменную grandCount в полосе до диапазона подрегистра.

Надежда им не слишком поздно