On veut afficher une liste de personnes qui ont chacune une liste de téléphones et une liste d'adresses :
on passe par une collection :
JasperPrint jp = JasperFillManager.fillReport (getTemplateRepositoryPath () + JASPER_FILE, params, new JRBeanCollectionDataSource (personnes))
|
avec params, la hashMap des paramètres, et Personnes, une ArrayList<HashMap<String, Object>> !
par exemple, un élément (HashMap) de personnes contient :
- "nom", nom(String)
- "prenom", prenom(String)
- "age", age(int)
-
"telephones", liste des numéros de téléphones de la personne (ArrayList<HashMap<String, Object>>)
-
"adresses", liste des adresses de la personne (ArrayList<HashMap<String, Object>>)
Ainsi, dans les Champs sous iReport, dans le rapport principal (ou rapport père), vous avez :
- nom
- prenom
- age
- telephones
- adresses
La partie détail est composée des champs nom, prénom, age et de 2 sous rapports, un pour les téléphones, et un pour les adresses !
Pour passer les valeurs aux sous rapports (ou rapport secondaires) et ainsi qu'il répètent tout seul les lignes selon la quantité de données présentes, il faut renseigner, dans le rapport père :
dans les propriétés du sous rapport des téléphones
- expression de source de données :
new JRBeanCollectionDataSource ((Collection)$F{ telephones} ))
|
- expression rapport secondaire :
$P{ path_complet_sub_report_telephones}
|
Et dans les propriétés du sous rapport des adresses :
- expression de source de données :
new JRBeanCollectionDataSource ((Collection)$F{ adresses} ))
|
- expression rapport secondaire :
$P{ path_complet_sub_report_adresses}
|
les chemin des sous-rapports doivent obligatoirement être complet, dans l'application, on le passe en paramètre depuis java (ce qui rend votre code plus portable) :
params.put (" path_subReport " , getTemplateRepositoryPath () + SUB_JASPER_FILE);
|
Donc, autant de fois qu'il y a de sous rapport... SUB_JASPER_FILE étant une chaine de caractère constante contenant le nom du sous rapport.
Les rapports secondaires contiennent donc des champs qui ont des noms identiques aux clés des HashMap, comme par exemple pour les téléphones :
- domicile
- portable_prive
- portable_pro
- ...
Au final, les personnes se répètent autant de fois qu'il en existe, et pour chaque personnes, les téléphones et adresses se répètent également selon les text-fields que vous avez créés !
|