web-dev-qa-db-fra.com

Plusieurs requêtes dans un seul document jasper

Jusqu'à présent, j'ai toujours été contraint par une chose avec les rapports Jasper.
Je ne peux écrire qu'une seule requête de données dans chaque document.
Lorsque j'ai besoin d'écrire une autre requête, je dois créer un sous-rapport, transmettre ses paramètres nécessaires et ainsi de suite.

Mais je ne suis certainement pas convaincu que c'est la bonne façon de procéder.

Existe-t-il donc une autre façon de lancer plusieurs requêtes de données dans un seul document jasper?

47
Manuel Leduc

Il est possible d'utiliser plusieurs requêtes à partir d'un seul rapport en utilisant un subDataset et datasetRun. Le comportement est comme avoir un ou plusieurs sous-rapports incorporés dans un seul fichier de rapport.

Définissez un sous-ensemble de données comme ceci:

<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>

Les sous-jeux de données peuvent avoir des paramètres, des champs, des variables et des groupes comme un rapport. Chaque sous-jeu de données peut avoir sa propre requête et le rapport peut avoir autant de sous-jeux de données que vous le souhaitez.

Pour utiliser un sous-ensemble de données, vous devez définir un datasetRun. Cela ne peut se faire qu'à l'intérieur d'éléments particuliers: graphiques, tableaux croisés, tableaux et listes. Nous utiliserons une liste car elle se comporte presque exactement comme une autre bande de détails.

Ce code définit une liste qui utilise notre sous-ensemble de données:

<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>

Quelques notes:

  • Le jr:listContents L'élément est analogue à un élément de bande de détail. Vous pouvez placer presque tous les autres éléments à l'intérieur.

  • L'élément datasetRun ressemble beaucoup à un élément de sous-rapport. Il peut avoir un dataSourceExpression ou connectionExpression à l'intérieur, qui changera la provenance des données. Si aucun de ces éléments n'est présent, la source de données du rapport est utilisée.

  • Le même sous-ensemble de données peut être utilisé par de nombreux ensembles de données, de sorte que vous pouvez facilement exécuter une requête plusieurs fois avec différents paramètres.

67
GenericJon