Précédent   Forum des professionnels en informatique > 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 Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/03/2007, 17h08   #1
Invité de passage
 
Inscription : mars 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 24
Points : 4
Points : 4
Par défaut [iReport]Paramètres dynamiques à passer

Bonjour,

Je découvre l'outil iReport ainsi que la lib JasperReport.
Je souhaite générer dans mon pdf une liste de puces, le contenu de chaque puce est envoyé par paramètre, chaque puce a son champ dynamique.
Le problème est que le nombre de puces est dynamique, je ne sais donc pas à l'avance combien de paramètres/champ dynamique j'aurais besoin.

J'ai pensé au début de mettre toutes les puces dans un seul champ dynamique, mais je fais face à des problèmes d'indentation et j'ai également des sous-puces à gérer. Donc la solution d'une puce par champ me semble la plus apte à gérer la hiérarchie de puces ainsi que son indentation.

Merci d'avance à ceux qui tenteront de m'aider.
guymage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2007, 11h37   #2
Membre du Club
 
Inscription : juillet 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 57
Points : 57
Points : 57
Regarde l'utilisation des sous rapports :
http://www.jasperforge.org/images/st...iewlet_swf.htm
Lawmoon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2007, 14h47   #3
Invité de passage
 
Inscription : mars 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 24
Points : 4
Points : 4
Oui, je me suis dirigé sur cette voie là.

Mais je fais maitenant face à des petits soucis au niveau de la compilation, j'aimerais envoyer des parametres à chaque sous-rapport puis assembler le tout.

J'ai pour l'instant ceci:
Code :
1
2
3
4
5
6
7
8
9
10
 
String templateXML = "rapportPrincipal.jrxml";
String fichierJasper = "rapportPrincipal.jasper";
JasperCompileManager.compileReportToFile(templateXML, fichierJasper);
 
Map param = new HashMap();
param.put("VAR1","une valeur";
 
JasperPrint jp = JasperFillManager.fillReport(fichierJasper,param,new net.sf.jasperreports.engine.JREmptyDaraSource());
JasperExportManager.exportReportToPdfFile(jp,"rapport.pcf");
Il faudrait que je le fasse pour chaque sous-rapport en partant du plus bas puis effectuer la derniere ligne pour assembler le tout, ou quelquechose dans le genre.
guymage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2007, 15h35   #4
Membre du Club
 
Inscription : juillet 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 57
Points : 57
Points : 57
Quelle est ta source de données? Requete sql, bean ou xml?
Tu parles là de plusieurs sous-rapports, mais d'aprés ton premier post, pour moi tu n'auras besoin que d'autant de sous rapport que tu as de niveau d'imbrication dans ta liste. Les itérations se font d'elle même en placant le rapport dans la band Detail et en passant le parametre à itérer à ton sous-rapport.
Tu n'as donc pas à créer autant de parametre/sous rapport que tu as de puces.

Regarde bien les exemples sur le site de ireport, de ce que j'ai compris, ce que tu souhaites faire est assez simple... Ou donne plus de précisions en indiquant quelles sont exactement tes erreurs et là où tu galeres
Lawmoon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2007, 15h47   #5
Invité de passage
 
Inscription : mars 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 24
Points : 4
Points : 4
Je vais essayer d'être plus clair :p

Au niveau des données, comme je dois faire du traitement sur le texte avant de l'ajouter, je pense faire passer le texte par paramètre à chaque rapport/sous-rapport.

Pour mon problème de puces, j'ai donc pensé à faire un sous-rapport par puce, chaque sous-rapport aurait une zone sous-rapport, on obtiendrai en quelque sorte une liste chainée. Après il reste le problème des paramètres à passer à chaque sous-rapport: le texte à afficher pour la puce et le path de l'éventuel sous-rapport.
Comme je ne sais pas à l'avance le nb puces et que j'appelle à chaque puce le même sous-rapport, se pose le problème des paramètres, chaque sous-rapport aura les même noms de variables, il faut donc que je les précise à chaque sous-rapport.

Merci de te soucier de mon problème et n'hésite à ma demander d'autres précision.


Edit: Utiliser un data source bean java plutot que des parametres pourrait être une solution
guymage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/03/2007, 17h18   #6
Membre du Club
 
Inscription : juillet 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 57
Points : 57
Points : 57
Pour être sûr d'avoir compris, en schematisant, tu attends un resultat du genre :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
° Puce1
  |_ souspuce11
      |_ soussouspuce111
      |_ soussouspuce112
  |_ souspuce12
      |_soussouspuce121
  |_ souspuce13
° Puce2
  |_ souspuce21
  |_ souspuce22
      |_soussouspuce221
      |_soussouspuce222
° Puce3
c'est ça?

Et si oui, tu as raison... En créant les beans adéquats, tu t'en sortiras facilement : cf JRBeanDataSource .
Tu crées un bean qui va contenir une liste de bean "Puce". A chaque bean "Puce", tu peux associer une liste de bean "Souspuce", etc etc...
Au niveau de ireport, il suffit de passer la bonne liste comme parametre des sous-rapports.
Quand tu dis "Comme je ne sais pas à l'avance le nb puces", tu veux dire que tu ne connais pas le nombre de puces d'un même niveau (ça c'est pas un soucis) ou que tu ne connais pas le nombre de niveau de "sous puce" (ça c'est un peu plus problématique, quoique...)?


La suite, lundi... Bon WE
Lawmoon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2007, 10h16   #7
Invité de passage
 
Inscription : mars 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 24
Points : 4
Points : 4
Salut, me revoilà

Donc oui, le schéma que tu proposes est comme je souhaite le faire.Sauf que je connais le nb de niveau de sous-puces qui est de 2 comme le décrit le schéma ci-dessous:

- puce 1
---- sous-puce 1
- puce 2
- puce 3
---- sous-puce 1
---- sous-puce 2

Lister les puces, ce n'est pas un problème, mais je ne sais pas quand il y a ou non des sous-puces, enfin je ne vois pas trop comment le représenter au niveau bean vu que l'itération est automatique.

Mais au fait question idiote, ireport gère les puces ? je ne l'ai pas trouvé et j'utilise un caractère spécifique pour faire moi même les puces...
guymage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2007, 15h45   #8
Membre du Club
 
Inscription : juillet 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 57
Points : 57
Points : 57
Citation:
Envoyé par guymage
Salut, me revoilà

Donc oui, le schéma que tu proposes est comme je souhaite le faire.Sauf que je connais le nb de niveau de sous-puces qui est de 2 comme le décrit le schéma ci-dessous:

- puce 1
---- sous-puce 1
- puce 2
- puce 3
---- sous-puce 1
---- sous-puce 2

Lister les puces, ce n'est pas un problème, mais je ne sais pas quand il y a ou non des sous-puces, enfin je ne vois pas trop comment le représenter au niveau bean vu que l'itération est automatique.
Au niveau java, tu crées un bean spécifique pour la génération du rapport où tu utilises un bean déjà créé?
Si tu créés un bean spécifique, c'est comme je l'ai expliqué plus haut, tu associes à chaque puce ta liste de sous-puce...
Au niveau ireport, tu dois créer un sous-rapport pour lister tes puces et dans ce sous rapport un nouveau sous-rapport qui listera les sous-puces associees aux puces. Au "sous-sous-rapport", tu n'as juste qu'à passer comme datasource la liste de sous-puce.


Citation:
Mais au fait question idiote, ireport gère les puces ? je ne l'ai pas trouvé et j'utilise un caractère spécifique pour faire moi même les puces...
Tu parles juste du caractère? Je ne crois pas, mais à vérifier... Perso, j'utilisais un carré noir pour faire un semblant de puce...
Lawmoon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/03/2007, 17h46   #9
Invité de passage
 
Inscription : mars 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 24
Points : 4
Points : 4
Ok, je vois le topo.

Par contre as-tu un exemple concret pour passer le bean à un sous-rapport ?

Déjà je galère dans ireport pour créer une connexion à mon bean et afficher seulement le 1er niveau de puce.

POur tster, mon bean a globalement cette forme:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 
public class Puce implements JRDataSource{
  private ArrayList array;
  private int index;
 
Puce()
{
   index = 0;
  array = new ArrayList();
  array.add("puce 1");
  array.add("puce 2");
}
 
public boolean next()
{
  //si plus petit que la taille de l'array
  index++;
}
 
public Object getFieldValue(JRField arg0)
{
  return array.get(index);
}
 
}
En espérant que l'implémentation soit bonne, maintenant je galère pour créer une connexion dans ireport, je ne sais s'il faut prendre "javabeans set data source" ou "custom JRDataSource" vu qu'aucun des 2 ne fonctionnent, enfin le test de connexion me renvoie une erreur
guymage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2007, 11h14   #10
Membre du Club
 
Inscription : juillet 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 57
Points : 57
Points : 57
Je n'ai plus mes projets jasper/ireport sous la main, je vais essayer de les recuperer...

Sinon avec mes souvenirs, voici comment je procederais :

- Les objets sont plus simples :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
public class Puce {
 
   private String libelle;
   private ArrayList listSousPuce;
 
   //Constructeur & setter/getter qui vont bien 
 
}
 
public class SousPuce {
 
   private String libelle;
 
   //Constructeur & setter/getter qui vont bien 
 
}
- Ensuite, il faut utiliser l'objet JRBeanCollectionDataSource. Le code pour passer tes beans à jasper ressemblerait grosso modo à ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
public class generateRapport() {
 
  List puces = //Création ou récupération de ta liste de Puce.
  Map parameters = new HashMap();
  JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(puces);
  JasperDesign jasperDesign = JRXmlLoader.load("monjrxml.jrxml");
  JasperReport jasperReport =  JasperCompileManager.compileReport(jasperDesign);
  JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, ds);
 
[...]
}
- Dans ireport, la datasource sera donc "ds". N'ayant pas ireport sous les yeux, je seche un peu pr la suite mais peut-être tu sais déjà t'en sortir avec ça... Fais une recherche sur JRBeanCollectionDataSource, tu devrais trouver des exemples... Et j'essaie de retrouver mes sources...

Bon courage!
Lawmoon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2007, 10h08   #11
Invité de passage
 
Inscription : mars 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 24
Points : 4
Points : 4
Merci pour toutes ces précisions, j'ai réussi à intégrer mon bean

Je te recontacterais peut-être si d'autres soucis, maintenant j'essaye de passer mon bean puce a unsous-rapport.

Edit:
Décidement, je galère, passer mon datasource au master report me pose aucun soucis, par contre je n'arrive pas à le transmettre au sous-rapport...
Dans les parametres du sous-rapport, je précise "use data source expression" mais je ne sais pas quoi passer comme expression.

Edit2:
Et quand j'ai 3 puces par exmeple, il me recopie 3 fois la page entière avec le libellé de la puce
guymage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2007, 11h31   #12
Membre du Club
 
Inscription : juillet 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 57
Points : 57
Points : 57
Ce que tu dois passer à ton sous-rapport c'est simplement la liste de sous-puce.
Il faut déclarer ta liste et ensuite la passer comme datasource du sous-rapport en indiquant un truc du genre : new JRBeanCollectionDataSource($F(listSousPuce);
Lawmoon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2007, 11h53   #13
Invité de passage
 
Inscription : mars 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 24
Points : 4
Points : 4
Heu, je ne te suis plus trop.

je récapitule ce que j'ai fait:
- j'ai crée un bean puce (pour l'instant je test seulement un niveau, normalement le suivant sera sur le même schéma).

- Dans mon java qui génère le fichier:
Code :
1
2
3
4
5
6
7
8
9
 
...
ArrayList al = new ArrayList();
al.add(new Puce("puce 1"));
al.add(new Puce("puce 1"));
al.add(new Puce("puce 1"));
JRBeanCollectionDataSource jrb = new JRBeanCollectionDataSource(al);
JasperPrint jp = JasperFillManager.fillReport(fichierJasper,maHashMap,jrb);
...
Mon datasource est alors envoyé au rapport
- J'ai pour l'instant comme résultat 3 fois la bande où se trouve le field(donc 3 fois une image et d'autres textes dans cette bande) avec à chaque fois la bonne valeur ds le field (puce 1, puce 2, ...).

- Il faudrait déjà que le field récupère la liste des beans et l'itére plutôt que ce soit la bande entière, ce serait peut-être là mon problème. Car ensuite je pourrais faire de même pour un sous-rapport.

Merci en tout cas pour ton attention.
guymage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2007, 14h59   #14
Membre du Club
 
Inscription : juillet 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 57
Points : 57
Points : 57
Ah je pensais que la liste de puce, c'était ok

C'est normal ce qui arrive ! Les elements de la band Detail (je suppose que c'est dans celle là) vont être itérés autant de fois qu'il y a d'occurence d'objets passés comme datasource, ce qui inclut tous les élements "statiques" contenus dans la band.
Déjà à ce niveau là, il faut passer par un sous-rapport pour n'itérer que ta liste de puces. Et comme datasource de ce sous-rapport tu lui passes ta datasource principale, en utilisant le parametre "MASTER_DATASOURCE" ou "DATASOURCE_REPORT" , un truc dans le genre (selon les versions d'ireport).
Lawmoon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2007, 16h02   #15
Invité de passage
 
Inscription : mars 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 24
Points : 4
Points : 4
On progresse, mais à petits pas :p

la connexion au sous-rapport fonctionne, les éléments de band détails ne repétent plus. Par contre si on reprend le code que j'avais mis au dessus (puce 1, puce 2, puce 3), je n'ai seulement que "puce 2" qui apparait.

Dans le sous-rapport, j'ai créé un texte-field avec comme valeur $F{libelle} (libelle est la variable dans le bean )
guymage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2007, 17h05   #16
Membre du Club
 
Inscription : juillet 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 57
Points : 57
Points : 57
Peut-être un probleme de taille...
Dans ton sous rapport, met à 0 la taille de toutes les Band mise à part la Band "Detail" , que tu réduis en hauteur quasiment à la hauteur du champs libelle pour voir...
Lawmoon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2007, 18h39   #17
Invité de passage
 
Inscription : mars 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 24
Points : 4
Points : 4
1) En effet, il y avait ce problème, même si la 1ère puce n'apparait toujours pas.

2) et pour la sous-puce, comment je passe seulement la liste des beans pour les sous-puces à mon sous-sous-rapport ? dans mon bean puce, j'ai lelibellé et une liste de sous-puce.

Promis dans bientôt je ne t'ennuie plus.
guymage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2007, 10h09   #18
Membre du Club
 
Inscription : juillet 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 57
Points : 57
Points : 57
Tu vas plus pouvoir bcp m'ennuyer, je suis bientôt en vacances

1)

2) Comme je l'ai dit un peu plus haut. Il faut créer une variable pour ta liste de sous-puce (comme tu as créé pour le libellé des puces) et ensuite la passer comme datasource du sous-rapport en indiquant un truc du genre (à vérifier pcq je ne me souviens plus trés bien) : new JRBeanCollectionDataSource($F(listSousPuce);
Lawmoon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2007, 16h58   #19
Invité de passage
 
Inscription : mars 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 24
Points : 4
Points : 4
Ok, merci je testerai ça ce soir.
J'ai d'autres priorités pour valider ce produit, je vais plutôt créer un autre sujet.
guymage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2007, 17h53   #20
Invité de passage
 
Inscription : mars 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 24
Points : 4
Points : 4
Bon, j'ai testé et ça ne fonctionne pas. Je comprends le principe mais je prends une exception à la compilation du sous-rapport dans ireport.

Mon code dans la connexion au sous-sous-rapport:

Code :
new JRBeanCollectionDataSource($F(listSP)
l'erreur:

Code :
The constructor JRBeanCollectionDataSource(String) is undefined
Il prend mon field comme un String, et non la liste des sous-puces
guymage est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h02.


 
 
 
 
Partenaires

Hébergement Web