Précédent   Forum du club des développeurs et IT Pro > Logiciels > Solutions d'entreprise > Business Intelligence > Jasper > iReport
iReport Forum d'entraide sur iReport
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 04/12/2012, 10h21   #1
Grobim
Invité de passage
 
Homme
Développeur Java
Inscription : décembre 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Java
Secteur : Santé

Informations forums :
Inscription : décembre 2012
Messages : 9
Points : 2
Points : 2
Par défaut Subreport renvoie null : parfois oui, parfois non

Bonjour à tous,

Voici mon problème :
Mon projet est un template dans lequel je dois afficher une liste avec deux colonnes (numéro, nom)

Cette liste me vient d'une source xml (une liste de bordereaux, contenant une liste de pages, contenant la liste à afficher).

J'ai donc un subreport "bouclant" sur mes pages contenant un page break, ce dernier contenant un subreport bouclant sur la liste à afficher.

Hors dans mon "master report" je dois afficher le numéro de la page à laquelle je suis (un champ numpage du noeud page) dans le footer. J'ai donc du faire retourner cette valeur par le subreport.

J'ai ainsi créé une variable "numPage" dans chacun de mes reports. Je mets comme expression, à celle côté subreport, le fameux $F{numpage} et je fais un retour de valeur depuis mon subreport dans ses propriétés, allant d'une variable à l'autre.

Jusqu'ici tout va bien.

Maintenant je lance la preview, et j'ai alors eu une surprise : ma variable est à null pour toutes mes pages (référence au noeud page) exceptée la dernière qui prend la valeur de la dernière page de chaque bordereaux.

Avez-vous une idée à me soumettre comme jouer avec les "reset type" ou "evaluation time" par exemple ? j'ai essayé de tatonner mais sans grande réussite.

Merci d'avance
Grobim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 15h13   #2
Grobim
Invité de passage
 
Homme
Développeur Java
Inscription : décembre 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Java
Secteur : Santé

Informations forums :
Inscription : décembre 2012
Messages : 9
Points : 2
Points : 2
J'ai posté un message sur SOV, voici le lien, c'est en anglais mais mon problème est plus détaillé (dans un anglais douteux, je dois avouer ^^)
http://stackoverflow.com/questions/1...-the-last-page
Grobim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/12/2012, 23h52   #3
cmako
Membre éclairé
 
Homme
Inscription : mars 2007
Messages : 485
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Luxembourg

Informations forums :
Inscription : mars 2007
Messages : 485
Points : 337
Points : 337
A vrai dire, j'ai du mal à comprendre ce que tu veux obtenir et ce que tu fais...
Est ce que tu fournir des éléments du genre le document final souhaité, l'xml et les templates?
cmako est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/12/2012, 09h27   #4
Grobim
Invité de passage
 
Homme
Développeur Java
Inscription : décembre 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Java
Secteur : Santé

Informations forums :
Inscription : décembre 2012
Messages : 9
Points : 2
Points : 2
Voici ci-joint l'origine (un fichier .odt) que je dois "reproduire", la source (un fichier .xml), et les 3 fichiers jrxml, créés avec iReport.

On peut voir dans le footer de mon master report, en bas, un variable $V{numPage}.

C'est cette valeur que j'ai à null, sauf pour la dernière itération de mes noeuds "page".

Les variables visibles en rouge sont temporaires et ne sont utilisées que pour les tests.
Fichiers attachés
Type de fichier : rar dosip-fourniture-bordereaux.rar (15,8 Ko, 2 affichages)
Type de fichier : xml dosip-fourniture-bordereaux.xml (30,7 Ko, 1 affichages)
Type de fichier : odt dosip-fourniture-bordereaux.odt (33,8 Ko, 4 affichages)
Grobim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 22h55   #5
cmako
Membre éclairé
 
Homme
Inscription : mars 2007
Messages : 485
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Luxembourg

Informations forums :
Inscription : mars 2007
Messages : 485
Points : 337
Points : 337
Le "null" est normal.
Tu as 3 templates. On va les appeler rapports 1, 2 et 3.
Le rapport principal 1 qui appel le sous-rapport 2 qui appelle le sous-rapport 3.
Lorsque le premier saut de page arrive il se passe dans le premier sous-rapport (2) et pas dans le rapport principal(1). Le rapport 2 n'a pas fini de s'exécuter et donc il n'a pas eu le temps de retourner la valeur de la variable au rapport (1)
Si tu veux afficher la valeur de la variable avant que l'itération du rapport 2 ne se termine, utilise non pas un String mais un StringBuffer, car l'effet est immédiat.
cmako est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/12/2012, 09h15   #6
Grobim
Invité de passage
 
Homme
Développeur Java
Inscription : décembre 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Java
Secteur : Santé

Informations forums :
Inscription : décembre 2012
Messages : 9
Points : 2
Points : 2
Bonjour, merci pour l'information.

J'ai donc essayé de passer les types des variables en java.lang.StringBuffer, le résultat a été le même. (j'ai au cas où changé l'expression de la variable côté subreport à : new java.lang.StringBuffer($F{numpage}))

J'ai alors essayé de changer le type du field en StringBuffer (donc remettre l'expression "normalement"). Et toujours rien, mon "null" qui fait plaisir.

Quand tu dis que l'effet est immédiat, sous-entends-tu que ça a marché chez toi ?

Merci encore de prendre du temps à m'aider sur ce problème.
Grobim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 09h50   #7
Grobim
Invité de passage
 
Homme
Développeur Java
Inscription : décembre 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Java
Secteur : Santé

Informations forums :
Inscription : décembre 2012
Messages : 9
Points : 2
Points : 2
Bon j'ai trouvé un moyen de contourner le problème :
Mettre simplement mon page footer dans le subreport et non dans le master report ...

Et ça marche !

Merci quand même d'avoir passé un moment sur mon problème
Grobim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/12/2012, 10h49   #8
cmako
Membre éclairé
 
Homme
Inscription : mars 2007
Messages : 485
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Luxembourg

Informations forums :
Inscription : mars 2007
Messages : 485
Points : 337
Points : 337
Citation:
Envoyé par Grobim Voir le message
Bon j'ai trouvé un moyen de contourner le problème :
Mettre simplement mon page footer dans le subreport et non dans le master report ...
Si tu fais ça tu risques d'avoir un footer de la dernière page "flottant".

Lorsque tu utilise un StringBuffer, il ne faut plus passer les valeurs, il faut juste passer la référence, comme en Java.
Le problème de String est qu'il est final (non modifiable) à chaque fois que fais une opération avec un String ça crée un autre String.
Ce n'est pas le cas avec un StringBuffer, si tu passes la référence tu peux faire un "append" dessus et ca modifiera l'objet.

Il faut faire comme ça:
Dans le rapport 1 tu déclare un paramètre de type StringBuffer que tu passes au sous-rapport (2)
Dans ton sous-rapport tu fais un .append(""), l'objet aura changé et sera visible depuis le rapport 1
cmako est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/01/2013, 10h52   #9
Grobim
Invité de passage
 
Homme
Développeur Java
Inscription : décembre 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Java
Secteur : Santé

Informations forums :
Inscription : décembre 2012
Messages : 9
Points : 2
Points : 2
Bonjour, je réouvre le thread car j'aimerais me pencher plus en détail sur cette solution (désolé pour le temps de réponse, je suis resté sur ma "rustine" le temps d'avance dans mon travail.

Je ne comprends pas la 2ème étape que tu me décris :

Citation:
Dans ton sous-rapport tu fais un .append(""), l'objet aura changé et sera visible depuis le rapport 1
Je le fais où le .append ? et sur quel objet ?

Ce que j'ai fais : j'ai passé mon paramètre (type StringBuffer) de mon main report à mon subreport, j'ai alors mis "$P{numPage2}.append($F{numpage2})" dans les champs "Default Value Expression" et "Description". Mais ça ne fonctionne pas, je dois mal m'y prendre.

EDIT : J'ai oublié d'ajouter ce que j'obtiens : null à chaque fois
Grobim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 09h30   #10
cmako
Membre éclairé
 
Homme
Inscription : mars 2007
Messages : 485
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Luxembourg

Informations forums :
Inscription : mars 2007
Messages : 485
Points : 337
Points : 337
Lorsque tu crée un paramètre de type StringBuffer, la valeur par défaut doit être : new StringBuffer()

ensuite tu passes le paramètre à ton sous rapport
Dans ton sous-rapport tu fais $P{sb}.append("num de page")
cmako est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/01/2013, 10h20   #11
Grobim
Invité de passage
 
Homme
Développeur Java
Inscription : décembre 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Java
Secteur : Santé

Informations forums :
Inscription : décembre 2012
Messages : 9
Points : 2
Points : 2
Je me demande vraiment ce que je rate, désolé de demander encore un détail ... je le mets où le $P{sb}.append("num de page") ?

Désolé de demander encore plus de précisions, je me sens un peu débile Oo
Grobim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2013, 00h03   #12
cmako
Membre éclairé
 
Homme
Inscription : mars 2007
Messages : 485
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Luxembourg

Informations forums :
Inscription : mars 2007
Messages : 485
Points : 337
Points : 337
Pas de problème, mais pour bien répondre j'ai besoin de savoir si tu connais bien java et comment fonctionne la classe StringBuffer?
cmako est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/01/2013, 12h33   #13
Grobim
Invité de passage
 
Homme
Développeur Java
Inscription : décembre 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Java
Secteur : Santé

Informations forums :
Inscription : décembre 2012
Messages : 9
Points : 2
Points : 2
Oui je comprends bien, c'est une classe dérivée d'Object, du coup on passe les données par références et non pas par copies comme pour les String qui sont des pseudo-primitifs.

J'ai de bonnes notions de java, mais malheureusement pas les même sur iReport ^^

Ma question est vraiment sur l'emplacement où j'appelle ma méthode, et non sur le "comment ça marche"
Grobim est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2013, 09h38   #14
cmako
Membre éclairé
 
Homme
Inscription : mars 2007
Messages : 485
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Luxembourg

Informations forums :
Inscription : mars 2007
Messages : 485
Points : 337
Points : 337
C'est bien que tu connais cette classe java. Parce que j'ai effectivement donné uniquement le début de piste.

Pour faire un append tu peux le faire dans le sous-rapport à l'intérieur de la bande detail dans un textfield. Dans un premier temps, pour les tests, tu peux la mettre quelque part au milieu et visible, par la suite il faudra la rendre invisible.

Je pense que tu comprends que le fais de faire un append, ca fait une concaténation et tu vas obtenir une chaine du genre"123456789101112..."
donc il faudrait après aussi penser à faire appeler une méthode comme delete (avec les bons arguments et en testant la chaine vide) ou bien par exemple insérer les numéros par 3 caractères et dans le rapport principal n'afficher que les 3 derniers, enfin tout reste possible.
cmako est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/01/2013, 15h57   #15
Grobim
Invité de passage
 
Homme
Développeur Java
Inscription : décembre 2012
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Java
Secteur : Santé

Informations forums :
Inscription : décembre 2012
Messages : 9
Points : 2
Points : 2
ça fonctionne parfaitement ! Merci beaucoup !

J'ai trouvé la méthode
Code :
$P{numPage}.replace(0, $P{numPage}.length(), $F{numpage})
. Plutôt pratique dans mon cas

Merci beaucoup cmako tu m'as été d'une grande aide !
Grobim est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 03h25.


 
 
 
 
Partenaires

Hébergement Web