|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Développeur Java Inscription : décembre 2012 Messages : 9 ![]() |
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 |
|
|
00
|
|
|
#2 |
|
Invité de passage
![]() Développeur Java Inscription : décembre 2012 Messages : 9 ![]() |
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 |
|
|
00
|
|
|
#3 |
|
Membre éclairé
![]() Inscription : mars 2007 Messages : 485 ![]() |
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? |
|
|
10
|
|
|
#4 |
|
Invité de passage
![]() Développeur Java Inscription : décembre 2012 Messages : 9 ![]() |
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. |
|
|
00
|
|
|
#5 |
|
Membre éclairé
![]() Inscription : mars 2007 Messages : 485 ![]() |
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. |
|
|
10
|
|
|
#6 |
|
Invité de passage
![]() Développeur Java Inscription : décembre 2012 Messages : 9 ![]() |
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. |
|
|
00
|
|
|
#7 |
|
Invité de passage
![]() Développeur Java Inscription : décembre 2012 Messages : 9 ![]() |
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 |
|
|
00
|
|
|
#8 | |
|
Membre éclairé
![]() Inscription : mars 2007 Messages : 485 ![]() |
Citation:
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 |
|
|
|
10
|
|
|
#9 | |
|
Invité de passage
![]() Développeur Java Inscription : décembre 2012 Messages : 9 ![]() |
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:
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 |
|
|
|
00
|
|
|
#10 |
|
Membre éclairé
![]() Inscription : mars 2007 Messages : 485 ![]() |
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") |
|
|
10
|
|
|
#11 |
|
Invité de passage
![]() Développeur Java Inscription : décembre 2012 Messages : 9 ![]() |
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 |
|
|
00
|
|
|
#12 |
|
Membre éclairé
![]() Inscription : mars 2007 Messages : 485 ![]() |
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?
|
|
|
10
|
|
|
#13 |
|
Invité de passage
![]() Développeur Java Inscription : décembre 2012 Messages : 9 ![]() |
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" |
|
|
00
|
|
|
#14 |
|
Membre éclairé
![]() Inscription : mars 2007 Messages : 485 ![]() |
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. |
|
|
10
|
|
|
#15 |
|
Invité de passage
![]() Développeur Java Inscription : décembre 2012 Messages : 9 ![]() |
ça fonctionne parfaitement ! Merci beaucoup !
J'ai trouvé la méthode Code :
$P{numPage}.replace(0, $P{numPage}.length(), $F{numpage}) Merci beaucoup cmako tu m'as été d'une grande aide ! |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com