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

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

je reçois un entier returnValuesubReport, qui est lui-même le nombre de lignes dans le sous-rapport. Je veux obtenez le total général, puisque cela subReport est appelé plusieurs fois pour les différents résultats (chacun pour un groupe) de ma requête SQL principale. Je veux ajouter tous les résultats, mais je suis un null valeur. J'ai essayé d'ajouter une opération à l' subReportreturnValue et en choisissant Sum comme l'opération, mais cela a également donné un 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
demandé sur Alex K 2009-09-30 01:10:26

3 réponses

Ajouter un attribut calculation="Sum"variable name="grandCount"

ou pass grandCount sous-rapport en tant que paramètre

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

dans le sous-rapport déclarer variable countItems avec initialValue de 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
répondu cetnar 2009-11-17 10:00:45

vous pourriez essayer d'incrémenter votre variable (Je l'ai appelée totalSum) seulement quand la bande (groupe) est égale à celle sur laquelle le sous-rapport est. Pour cela, vous auriez besoin d'un champ dans le rapport pour vous donner la bande courante (groupe).

<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 si cela fonctionne, je n'ai pas le contexte pour le tester. Mais vous pouvez aussi essayer un deuxième solution - avec trois variables. Par exemple, vous conservez la valeur retournée du sous-rapport (disons returnValue) dans une variable et vous utilisez deux autres variables pour maintenir la somme-une jusqu'à ce que le sous-rapport soit appelé (disons partialSum) et la seconde pour stocker la somme entre la valeur de retour et le total Partiel. Appelons ça le totalSum. Alors vous auriez quelque chose comme ça 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 ceci:

<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 faire tous ces paramètres de iRport directement sur le rapport que vous souhaitez utiliser.

1
répondu Jenny Smith 2009-11-17 13:37:16

Je ne suis pas exactement shure comment l'écrire dans JRXML depuis que 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 variable, vous aurez besoin de quelque chose comme $V{grandCount} = $V{grandCount} + $V{itemCount}

REMARQUE: JasperReports rendu de la bande par bande, de sorte que vous ne serez pas en mesure d'utiliser le grandCount variable dans un groupe avant de le sous-état bande.

j'Espère je ne suis pas trop en retard

0
répondu medopal 2009-11-12 13:08:41