Как я могу прирастить переменную со значением другой переменной в 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"/>
Ответы
Ответ 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 в полосе до диапазона подрегистра.
Надежда им не слишком поздно