Как вернуть значение из источника данных таблицы в основной отчет в iReport?

У меня есть таблица в моем iReport, которая, естественно, имеет свой набор данных, и у меня есть переменная, которая определена и инициализирована в наборе данных таблицы, и возвращает значение (которое определенно находится в пределах таблицы, а не за ее пределами), которое я хочу использовать в моем основной отчет, содержащий таблицу.

Как я могу сделать это или какие-либо альтернативы?


person yayayokoho3    schedule 01.05.2012    source источник


Ответы (6)


Правильный способ (отчет jasper v.5 / v.6) для возврата значений из компонента, использующего subDataset, - это использовать переменные, определять переменные как в основном отчете, так и в subDataset.

Пример (вернуть количество записей таблицы в основной отчет)

  1. В основном отчете укажите переменную

    <variable name="TABLE_COUNT" class="java.lang.Integer" resetType="None">
       <initialValueExpression><![CDATA[0]]></initialValueExpression>
    </variable>
    
  2. В subdataset определите переменную (в примере будет использоваться встроенная переменная $V{REPORT_COUNT}).

  3. В datasetRun укажите, какая subDataset переменная (fromVariable) должна быть возвращена к какой основной переменной отчета (toVariable)

    <datasetRun subDataset="tableData" uuid="fa5df3de-f4c5-4bfc-8274-bd064e8b81e6">
       <connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
       <returnValue fromVariable="REPORT_COUNT" toVariable="TABLE_COUNT"/>
    </datasetRun>
    

Затем переменную TABLE_COUNT можно использовать в основном отчете, просто не забудьте установить правильный Время оценки

Показать значение (в основном отчете)

<textField evaluationTime="Report">
    <reportElement x="0" y="0" width="100" height="20" uuid="d67ddb3e-b0cc-4fae-9e05-f40eb0f7e059"/>
    <textFieldExpression><![CDATA[$V{TABLE_COUNT}]]></textFieldExpression>
</textField>
person Petter Friberg    schedule 20.01.2016
comment
Очень хороший ответ :) - person Igor Vuković; 28.09.2016

Если вы хотите получить данные из табличного набора данных, вы действительно можете это сделать. Я нашел подвох, чтобы добиться этого.

  1. Создайте ПЕРЕМЕННУЮ variableMapName типа java.util.Map в основном отчете и инициализируйте ее выражением new java.util.HashMap()

  2. Создайте ПАРАМЕТР parameterMapName типа java.util.Map в наборе данных таблицы

  3. Свяжите набор данных PARAMETER с переменной из основного отчета, используя «Изменить источник данных таблицы -> Параметры -> Добавить -> $ P {parameterMapName} = $ V {variableMapName}» (щелкните правой кнопкой мыши по таблице в основном шаблоне отчета )

  4. Создайте переменную putResult типа java.lang.String в источнике данных таблицы. Выражение для этой переменной будет выглядеть так

$P{parameterMapName}.put("KEY", $F{fieldYouWantReturn}) + $P{parameterMapName}.put("KEY2", $F{otherFieldYouWantReturn})

Теперь у вас есть возможность использовать данные из табличного источника данных в основном отчете с помощью $V{variableMapName}.get("KEY")

Это действительно грязный прием, но иногда у вас нет другого способа что-то сделать. Спасибо!

person Andrey Frunt    schedule 19.12.2013
comment
Пробовал это решение и не сработало. Не видно, как putResult будет отправлять данные после того, как таблица была сгенерирована, методу печати, который был выполнен до создания таблицы. - person Jorge Cornejo Bellido; 19.03.2015
comment
Спасибо, мой жареный, мне просто нужно использовать toString () в моем наборе данных, чтобы получить доступ к нему в моем отчете, таким образом я могу суммировать все свои результаты из набора данных, это действительно очень полезный совет - person Higor Tavares; 26.02.2021

Звучит разумно ... но я не уверен, возможно ли это. Это может быть полезный запрос на улучшение.

Альтернативой является использование подотчета. Все, что возможно в таблице, возможно во вложенном отчете. В подотчетах есть возвращаемые значения, что позволит вам вернуть нужную информацию.

person mdahlman    schedule 02.05.2012
comment
Спасибо mdahlman за ответ. Как вы процитировали, «это может быть полезным запросом на улучшение» для команды разработчиков iReport IDE. И, конечно же, подотчет может возвращать значения в свой основной отчет; но я хотел бы, есть ли способ вернуть значения из таблицы в ее главный отчет? пожалуйста, если у кого-то есть какие-нибудь идеи по поводу того, что я просил? - person yayayokoho3; 03.05.2012

Вы не сможете вернуть переменную из набора данных таблицы в основной отчет, тогда как возможно наоборот. Альтернатива может быть предложена Мдалманом. Вместо этого используйте подотчет.

person Gopinagh.R    schedule 03.05.2012

Теперь вы можете вернуть значение из набора данных таблицы в основной отчет.

На jasper studio 6.0.1,I найдено свойство с именем набор данных таблицы, для которого установлены возвращаемые значения. Но, войдя в набор, я обнаружил, что форма «настроить возвращаемые значения» неверна, jasper studio ошибается с «от переменной к переменной», stuio меняет две переменные. "from variable" - локальная переменная таблицы, "to value" - основная переменная отчета. Вы должны указать ее в исходном коде и удалить "incrementerFactoryClass=""".

Я тестирую, все в порядке. Возвращаемое значение печатается в основном отчете.

далее - часть моего файла jrxml.

<jr:table xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd">
					<datasetRun subDataset="workscore" uuid="307278bc-db98-4de2-9b50-dea5dc69b496">
						<connectionExpression><![CDATA[$P{REPORT_CONNECTION}]]></connectionExpression>
						<returnValue fromVariable="returnscore" toVariable="workscore"/>
					</datasetRun>

person gpanzl    schedule 05.06.2015

Для Типа Карты возможно, что любой тип, возвращающий значение из набора таблиц в основной отчет, невозможен.

Хотя можно использовать подотчет, так как есть варианты для возврата значений. Если возможно, попробуйте использовать подотчеты вместо таблицы.

person Dark Army    schedule 29.07.2015