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

Несколько запросов в одном яшмовом документе

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

Но я определенно не уверен, что это хороший способ сделать это.

Так есть ли другой способ запустить несколько запросов данных в одном документе jasper?

4b9b3361

Ответ 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, поэтому вы можете легко запускать запрос несколько раз с разными параметрами.