50 votes

Plusieurs requêtes dans un seul document jasper

Jusqu'à présent, j'ai toujours été gêné par une chose avec jasper-reports.
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, lui passer les paramètres nécessaires et ainsi de suite.

Mais je ne suis absolument pas convaincu que c'est la bonne façon de faire.

Existe-t-il un autre moyen de lancer plusieurs requêtes de données dans un seul document Jasper ?

0 votes

Comment ? J'ai cherché mais je ne comprends vraiment pas.

2 votes

Je ne vois pas comment le fait de passer une requête en paramètre résout le problème. Vous êtes toujours limité à une requête par rapport.

2 votes

@Alex K. Si j'ai bien compris la question, Manuel demande comment mettre plusieurs requêtes dans un seul rapport. Pour l'instant, cela ne peut se faire qu'en utilisant des sous-ensembles de données.

70voto

GenericJon Points 3033

Il est possible d'utiliser l'exécution de plusieurs requêtes à partir d'un seul rapport en utilisant un fichier de type subDataset et datasetRun . Ce comportement revient à avoir un ou plusieurs sous-rapports intégrés dans un seul fichier de rapport.

Définissez un subDataset 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-datasets peuvent avoir des paramètres, des champs, des variables et des groupes, tout comme un rapport. Chaque sous-ensemble de données peut avoir sa propre requête, et le rapport peut avoir autant de sous-ensembles de données que vous le souhaitez.

Pour utiliser un sous-dataset, vous devez définir un fichier 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étail.

Ce code définit une liste qui utilise notre sous-dataset :

<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 site jr:listContents est analogue à un élément de bande de détail. Vous pouvez y placer presque tous les autres éléments.

  • Le site datasetRun est semblable à un élément de sous-rapport. Il peut avoir un dataSourceExpression ou connectionExpression à l'intérieur, ce qui changera l'origine 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 subDataset peut être utilisé par plusieurs datasetRuns, ce qui vous permet d'exécuter facilement une requête plusieurs fois avec des paramètres différents.

0 votes

Tu sauves ma nuit (y)

3 votes

" Ce comportement revient à avoir un ou plusieurs sous-rapports intégrés dans un seul fichier de rapport. ". Eh bien, c'est presque comme avoir des sous-rapports. Parce que les sous-rapports peuvent renvoyer des valeurs dans les variables du rapport principal, et les sous-ensembles de données ne le peuvent pas.

1 votes

@Gustavo : sous-ensembles de données (c.-à-d. tableaux, tableaux croisés, listes, ...) peut les valeurs de retour dans les variables principales du rapport. Il existe un bouton "Valeurs de retour" dans les propriétés des listes/tableaux/tableaux croisés (onglet "Dataset").

0voto

Il est préférable de faire appel à un rapport secondaire ou de créer une procédure pour obtenir les données finales avec la sélection.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X