Ответ 1
Можно использовать выполнение нескольких запросов из одного отчета с помощью subDataset
и datasetRun
. Поведение похоже на то, что один или несколько подчиненных записей встроены в один файл отчета.
Определите subDataset следующим образом:
<subDataset name="dataset1">
<parameter name="someParam" class="java.lang.String"/>
<queryString><![CDATA[SELECT column1, column2 FROM table1 WHERE column1=$P!{someParam}]]></queryString>
<field name="column1" class="java.lang.String"/>
<field name="column2" class="java.lang.String"/>
</subDataset>
Субданные могут иметь параметры, поля, переменные и группы, как и отчет. Каждый поднабор может иметь собственный запрос, и в отчете может быть столько подданных, сколько хотите.
Чтобы использовать поднабор, вам необходимо определить datasetRun
. Это можно сделать только в определенных элементах: диаграммах, кросс-таблицах, таблицах и списках. Мы будем использовать список, поскольку он ведет себя точно так же, как и другая подробная группа.
Этот код определяет список, который использует наш поднабор:
<componentElement>
<reportElement x="0" y="0" width="100" height="40"/>
<jr:list 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="dataset1">
<datasetParameter name="someParam"><datasetParameterExpression><![CDATA["some value for column 1"]]></datasetParameterExpression></datasetParameter>
</datasetRun>
<jr:listContents height="40">
<textField>
<reportElement x="0" y="0" width="100" height="20"/>
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[$F{column1}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="0" y="20" width="100" height="20"/>
<textElement/>
<textFieldExpression class="java.lang.String"><![CDATA[$F{column2}]]></textFieldExpression>
</textField>
</jr:listContents>
</jr:list>
</componentElement>
Некоторые примечания:
-
Элемент
jr:listContents
аналогичен элементу элемента детали. Вы можете разместить практически любые другие элементы внутри. -
Элемент
datasetRun
очень похож на элемент подрепортажа. Он может иметь внутриdataSourceExpression
илиconnectionExpression
, который будет меняться там, откуда поступают данные. Если ни один из них не присутствует, используется источник данных отчета. -
Такой же subDataset может использоваться многими datasetRuns, поэтому вы можете легко запускать запрос несколько раз с разными параметрами.