web-dev-qa-db-fra.com

Comment puis-je incrémenter une variable avec la valeur d'une autre variable dans JasperReports?

Je dois faire un total des éléments que je compte dans un sous-rapport. Pour ce faire, je pense avoir besoin d'ajouter la valeur de cette variable à une autre variable à chaque itération, ou de "l'incrémenter" de cette valeur. Le sous-rapport est appelé pour chaque groupe et je reçois un total pour ce groupe. J'ai besoin d'ajouter les valeurs des variables, plutôt que les colonnes/champs de la base de données.

Je reçois un entier returnValue de la subReport, qui est lui-même le nombre de lignes du sous-rapport. Je souhaite obtenir le total général, car cette variable subReport est appelée plusieurs fois pour les différents résultats (chacun pour un GROUPE) à partir de ma requête SQL principale. Je veux additionner tous les résultats, mais je reçois une valeur null. J'ai essayé d'ajouter une opération à la subReport en tant que nouvelle returnValue et de choisir Sum en tant qu'opération, mais cela a également généré une null.


   <variable name="itemCount" class="Java.lang.Integer" resetType="None"/>
   <variable name="grandCount" 
      class="Java.lang.Integer" 
      incrementType="Group" 
      incrementGroup="ITEM_BUNDLE">
      <variableExpression><![CDATA[$V{itemCount}]]></variableExpression>
   </variable>


... <returnValue subreportVariable="countItems" toVariable="itemCount"/>
17
sventechie

Ajouter l'attribut calculation="Sum" à variable name="grandCount"

ou passez grandCount au sous-rapport en tant que paramètre

<subreportParameter name="grandCount">
<subreportParameterExpression><![CDATA[$P{grandCount}]]></subreportParameterExpression>
</subreportParameter>

dans le sous-rapport, déclarer la variable countItems avec la valeur initialeValue du paramètre grantCount

<variable name="countItems" .... >
   <variableExpression><![CDATA[$P{itemCount} + $P{grandCount}]]></variableExpression>
   <initialValueExpression><![CDATA[$P{grandCount}]]></initialValueExpression>
</variable>

et retour

<returnValue subreportVariable="countItems" toVariable="grandCount" calculation="Sum"/>
7
cetnar

Vous pouvez essayer d’incrémenter votre variable (je l’ai nommée totalSum) uniquement lorsque le groupe (groupe) est égal à celui sur lequel le sous-rapport est. Pour cela, vous aurez besoin d'un champ dans le rapport pour vous donner le groupe actuel.

<variable name="totalSum" 
         class="Java.lang.Integer" 
         resetType="Report" 
         incrementType="Group" 
         incrementGroup="ITEM_BUNDLE"
         calculation="Nothing">
 <variableExpression>
 <![CDATA[new Boolean($F{reportPart}.equals("The_band_with_the_subreport")).booleanValue() ? $V{returnValue} : $V{totalSum}]]>
 </variableExpression>
 <initialValueExpression>
           <![CDATA[new Integer(0)]]>
 </initialValueExpression>
</variable>

Je ne suis pas sûr que cela fonctionne, je n'ai pas le contexte pour le tester. Mais vous pouvez aussi essayer une deuxième solution - avec trois variables. Par exemple, vous conservez la valeur renvoyée par le sous-rapport (disons returnValue) dans une variable et vous utilisez deux autres variables pour contenir la somme - une jusqu'à ce que le sous-rapport soit appelé (disons partialSum) et le second pour stocker la somme entre returnValue et partialSum. Appelons cela totalSum. Alors vous auriez quelque chose comme ceci pour totalSum:

<variable name="totalSum" 
         class="Java.lang.Integer" 
         resetType="Report" 
         incrementType="Group" 
         incrementGroup="ITEM_BUNDLE"
         calculation="Nothing">
   <variableExpression>
        <![CDATA[$V{returnValue} +  $V{partialSum}]]>
   </variableExpression>
   <initialValueExpression>
           <![CDATA[new Integer(0)]]>
   </initialValueExpression>
</variable>

Pour partialSum, vous aurez quelque chose comme ça:

<variable name="partialSum" 
         class="Java.lang.Integer"
         resetType="Report"
         calculation="Sum"
         incrementType="None">
    <variableExpression>
        <![CDATA[new Boolean($F{reportPart}.equals("The_band_with_the_subreport")).booleanValue() ? $V{returnValue} : new Integer(0)]]>
    </variableExpression>
    <initialValueExpression>
         <![CDATA[new Integer(0)]]>
    </initialValueExpression>
  </variable>

J'espère que cela aide un peu. Il serait plus facile de définir tous ces paramètres depuis iRport directement sur le rapport que vous souhaitez utiliser.

1
Jenny Smith

Je ne sais pas exactement comment l'écrire dans JRXML puisque j'utilise iReport. Dans iReport, je crée une nouvelle variable, avec le type de classe "Entier" et le type de calcul "Système". Le type de calcul est important ici.

Dans l'expression de la variable, vous aurez besoin de quelque chose comme $ V {grandCount} = $ V {grandCount} + $ V {itemCount}

REMARQUE: JasperReports effectue le rendu bande par bande, vous ne pourrez donc pas utiliser la variable grandCount dans une bande précédant la bande de sous-rapport.

J'espère que je ne suis pas trop tard

0
medopal