IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
logo

FAQ Jasper/iReportConsultez toutes les FAQ

Nombre d'auteurs : 22, nombre de questions : 65, dernière mise à jour : 4 août 2014  Ajouter une question

 

Cette faq a été réalisée à partir des questions fréquemment posées sur les forums de www.developpez.com et de l'expérience personnelle des auteurs.
Nous tenons à souligner que cette faq ne garantit en aucun cas que les informations qu'elle propose sont correctes. Les auteurs font leur maximum, mais l'erreur est humaine. Cette faq ne prétend pas non plus être complète. Si vous trouvez une erreur, ou que vous souhaitez nous aider en devenant rédacteur, lisez ceci .
Sur ce, nous vous souhaitons une bonne lecture.
L'équipe Business Inteligence.

SommaireConcepts de JasperReports/iReportGestion des sources de données (7)
précédent sommaire suivant
 

Un subdataset est un concept à mi-chemin entre la source de données et le sous-rapport: ils permettent au programme de parcourir un certain nombre d'enregistrements (comme une datasource) mais ils permettent aussi l'utilisation de calculs et de paramètres (comme un sous-rapport).

Mis à jour le 14 septembre 2008 candre JauB

Aller dans : Options Classpath



Cliquer sur Ajouter JAR



et sélectionner votre JAR.

Mis à jour le 14 septembre 2008 JauB

Code java : Sélectionner tout
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// Exemple de génération de rapport JasperReports à partir d'une source CSV 
// (validé avec jasperreports-1.2.6.jar - LY 09/2006) 
  
// 
// Exemple de fichier CSV utilisé en entrée : 
// => ne pas oublier le caractère séparateur en fin de ligne ! 
// 
// 	animal;mange;couleur; 
// 	sanglier;glands;beige; 
// 	vache;herbe;blanche; 
// 	chat;souris;gris; 
// 
  
import java.io.*; 
  
// import de la classe "HashMap" pour l'envoi de paramètres à un rapport 
import java.util.HashMap; 
  
// import du moteur de la librairie JasperReports 
import net.sf.jasperreports.engine.*; 
import net.sf.jasperreports.engine.data.JRCsvDataSource; 
import net.sf.jasperreports.engine.design.JasperDesign; 
import net.sf.jasperreports.engine.design.JRDesignField; 
//import net.sf.jasperreports.engine.export.JRCsvExporter; 
//import net.sf.jasperreports.engine.export.JRPdfExporter; 
import net.sf.jasperreports.engine.xml.JRXmlLoader; 
  
public class generatepdffromcsv 
{ 
	public static void main(String[] args) 
	{ 
		HashMap params = new HashMap(); 
		//String[] nomCols = {"animal", "mange", "couleur"};	// <- si on n'utilise pas 'setUseFirstRowAsHeader' ** 
  
		try 
		{ 
  
			System.out.println("Et c'est parti..."); 
  
			// Passage de paramètres (facultatif) 
			//params.put("", ""); 
  
			// Chargement et compilation du rapport 
			System.out.print("+ chargement et compilation du rapport JRXML"); 
			JasperDesign jasperDesign = JRXmlLoader.load("essai11.jrxml"); 
			JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); 
			System.out.println(" : OK"); 
  
			// Déclaration de la source de données 
			System.out.print("+ déclaration de la source de données CSV"); 
			File sourceFile = new File("essai1.csv"); 
			JRCsvDataSource source = new JRCsvDataSource(sourceFile); 
			source.setFieldDelimiter(';'); 
			//source.setColumnNames(nomCols);	// <- si on n'utilise pas 'setUseFirstRowAsHeader' ** 
			source.setUseFirstRowAsHeader(true); 
			System.out.println(" : OK"); 
  
			// Export du rapport au format temporaire 'jasperPrint' 
			System.out.print("+ export du rapport au format intermédiaire 'jasperPrint'"); 
			JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, params, source); 
			//équivalent à JasperPrint jasperPrint = JasperFillManager.fillReport("essai1.jasper", params, source); 
			System.out.println(" : OK"); 
  
  
			// puis export du rapport au format cible 
			JasperExportManager exporter = new JasperExportManager(); 
  
			System.out.print("+ conversion au format cible PDF"); 
			exporter.exportReportToPdfFile(jasperPrint, "essai1.pdf"); 
			System.out.println(" : OK"); 
  
			System.out.print("+ conversion au format cible HTML"); 
			exporter.exportReportToHtmlFile(jasperPrint, "essai1.html"); 
			System.out.println(" : OK"); 
  
			System.out.print("+ conversion au format cible XML"); 
			exporter.exportReportToXmlFile(jasperPrint, "essai1.xml", false); 
			System.out.println(" : OK"); 
  
			System.out.println("That's all folks !"); 
		} 
		catch (Exception e) 
		{ 
			System.out.println(e.getMessage()); 
		} 
	} 
}
Et une variante, si vous ne voulez pas de caractère séparateur en fin de ligne, il suffit de rajouter :

Code java : Sélectionner tout
1
2
3
4
5
private static final String CTE_S_CRLF_UNIX = "\n";//retour à la ligne Unix 
private static final String CTE_S_CRLF_DOS = "\r\n";	//retour à la ligne Dos/Windows 
private static final String CTE_S_CRLF_MAC = "\r";	//retour à la ligne Mac 
  
source.setRecordDelimiter(sCRLF);

Mis à jour le 12 mai 2009 Peanut

Pour utiliser les Scriptlets, il faut tout d'abord, dans les propriétés du document mettre à scriptlet -> Utiliser le support de Scriptlet interne iReport.

Ensuite, pour ouvrir l'éditeur de scriptlet : modifier -> editeur de scriptlets.

L'éditeur va alors s'ouvrir, il ne reste plus qu'à écrire son scriptlet. On peut soit l'écrire dans Imports et declarations globale où là le scriptlet ne sera utilisé que lorsqu'il sera appeler ou soit utiliser les fonctions préexistantes telless que par exemple beforePageInit(), afterPageInit(), etc... qui sont des fonctions prévues pour s'exécuter à des moments bien précis lors de la génération du rapport.

Une fois votre scriptlet écrit, il ne faut pas oublier de cliquer sur enregistrer puis ensuite de compiler Créer -> compiler.

Cela aura pour effet de créer (s'il n'y a pas d'erreur) deux fichiers avec pour nom : nomFichierScriptlet.java et nomFichierScriptlet.class dans le repertoire du chemin d'instalaltion de iReport.

L'appel de la fonction se fait avec cette syntaxe :

Code java : Sélectionner tout
$P{REPORT_SCRIPTLET}.nomFonction()
Chemin de classe :

Pour que les scriptlets fonctionnent, il est nécessaire de rajouter l'archive tools.jar dans les chemins de classes. Cela peut-très bien être celui qui est intégré à iReport ou celui de JDK.

Exemple de chemin de classe : C:\Program Files\Java\jdk1.6.0_11\lib\tools.jar

Problème rencontré :

Si lorsque vous modifiez une fonction de votre scriptlet et que vous vous apercevez que les modifications ne sont pas prises en compte tant que vous ne relancez pas iReport, il peut s'agir du fait qu'il faut placer tout les fichiers dans le repertoire iReport.

Mis à jour le 14 novembre 2011 Alucard95

j'ai un bean (Client) complexe : de nombreuses informations unitaire (nom/prenom/age) mais également des listes d'informations (les adresses/les numéros de téléphones). Je dois sans attaquer ma base de donnée afficher le contenu du Bean dans Report afin de sortir une fiche cliente.

Exemple avec 3 classes :

Code java : Sélectionner tout
1
2
3
4
5
6
7
public Class client{ 
 private String nom; 
 private String prenom; 
 private String age; 
 private List<Telephone> listeDesTelephone; 
 private List<Adresses> listeDesAdresses; 
}
Code java : Sélectionner tout
1
2
3
4
public Class Telephone{ 
 private String numero; 
 private Boolean actif; 
}
Code java : Sélectionner tout
1
2
3
4
5
public Class Adresses{ 
 private String rue; 
 private String cp; 
 private String ville; 
}
Dans le Bean ou la classe qui génèrera l'appel à l'impression, Créez une HashMap et remplissez là des attributs nécessaires.

Code java : Sélectionner tout
1
2
map.put("nom", objetClient.getNom()); 
map.put("prenom", objetClient.getPrenom());
ajoutez y les listes :

Code java : Sélectionner tout
1
2
map.put("listeTelephone", objetClient.getListeTelephone()); 
map.put("listeAdresse", objetClient.getListeAdresse());
Appelez le report de cette manière :

Code java : Sélectionner tout
JasperPrint jasperPrint = JasperFillManager.fillReport(new FileInputStream(file), map);
La variable file doit être déclaré ainsi :

Code java : Sélectionner tout
File file = new File("chemin/de/mon/report.jasper");
Notez qu'aucune source de données n'a été passée en paramètre pour ce report.

Dans le Report principal créez la liste des Paramètres necessaires : nom / prenom / age / listeTelephone (de type Collection) / listeAdresse (Collection)

Dans la bande Title insérer un sous report en plus des champs qui afficherons le nom / prenom / age

Le wizard de création vous permet entre autre de spécifier la source de donnée du sous-rapport. Lui sélectionner l'option : utiliser l'expression de la source de donnée et y taper :

Code java : Sélectionner tout
new JRBeanCollectionDataSource($P{listeTelephone})
ça transforme votre liste en pseudo source de donnée qu'utilisera le sous rapport.

Créez dans le sous-report les entête de colonne dans sa bande title (par exemple et simplement "numero" et un autre "actif". Dans la partie détail, créez deux TextField nommés "numeroDeTelephone" (String) et un second "actif" (boolean).

N'Oubliez pas de créer les deux valeurs de Champs en renseignant ET le "nom du champs" ET la "description" par "numeroDeTelephone" et par "actif" ce qui permet au report de faire la liaison entre l'objet de la ligne X, sa propriété "numeroDeTelephone" et le champs du report "numeroDeTelephone"

Voilà, enregistrez vous, et exécutez, le sous rapport ferra une itération sur la liste des numéros. Avec un second sous rapport lié aux liste d'adresse vous complèterez le rapport final.

Dernier point : pensez à spécifier l'attribut flottant à tous les champs situés sous une entrée de sous-rapport afin d'éviter les chevauchement : Type de position : flottant

Mis à jour le 14 novembre 2011 besstiolle

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 :

Code java : Sélectionner tout
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 :

Code java : Sélectionner tout
new JRBeanCollectionDataSource((Collection)$F{telephones}))
- expression rapport secondaire :

Code java : Sélectionner tout
$P{path_complet_sub_report_telephones}
Et dans les propriétés du sous rapport des adresses :

- expression de source de données :

Code java : Sélectionner tout
new JRBeanCollectionDataSource((Collection)$F{adresses}))
- expression rapport secondaire :

Code java : Sélectionner tout
$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) :

Code java : Sélectionner tout
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 !

Mis à jour le 14 novembre 2011 mimi31110

Il faut que la requête ramène 2 valeurs : une valeur affichée et une autre qui va servir de critère dans ta clause where.

Exemple dans le cas où l'on souhaite afficher un ou plusieurs fournisseurs :

Etape 1 : Création du Paramètre :

  • Créer un paramètre nommé Fournisseur
  • Identifier ce paramètre comme une classe collection
  • Implanter comme valeur d'expression par défaut dans Fournisseur : P${Fournisseur}

Etape 2 : Dans la Requête :

  • Ecrire dans la requête principale :

Code sql : Sélectionner tout
...where $X{IN,id_fournisseur,Fournisseur

Il faut extraire tous les champs avant d'écrire cette syntaxe (qui est reconnue par JAVA mais pas par iReport).
Etape 3 : Dans l'input control :

  • Créer une requête telle que :

Code sql : Sélectionner tout
Select li_raison_sociale,id_fournisseur  From tbl_Fournisseur
  • Nommer le du même nom que le paramètre en question
  • Le définir en multi select query
  • Appeller la précédente requête
  • Insèrer li_raison_sociale comme Visible Query Column et id_fournisseur comme value column

Mis à jour le 14 novembre 2011 ALLODREN

Proposer une nouvelle réponse sur la FAQ

Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour ça


Réponse à la question

Liens sous la question
précédent sommaire suivant
 

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2021 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.