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 12/02/2007, 17h30   #1
kij
Membre habitué
 
Inscription : avril 2005
Messages : 360
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2005
Messages : 360
Points : 120
Points : 120
Envoyer un message via MSN à kij
Par défaut [subreport] Invalid Stream Header

Bonjour,

Je découvre Ireport depuis peu, et j'avoue que j'ai du mal en ce qui concerne les sous rapport.
Voici comment j'ai procédé :
- J'ai créé un rapport nommé "files.jrxml" qui constitue mon futur sous rapport
- J'ai créé un rapport général "general.jrxml" qui inclu le sous rapport.

J'ai vu que le pb d'Ireport c'est qu'il n'inclut pas vraiment le sous rapport directement avec un chemin, mais avec une référence via un identifiant à lui. Donc j'ai remplacé le code xml du rapport général par ceci :

Code :
1
2
3
4
5
6
7
8
9
10
 
<subreport  isUsingCache="true">
					<reportElement
						x="1"
						y="27"
						width="534"
						height="30"/>
					<subreportExpression class="java.lang.String"><![CDATA[new String("C:\\Documents and Settings\\n_vi\\Bureau\\jasper report\\modifications\\files.jrxml")]]></subreportExpression>
 
				</subreport>
En précisant donc là ou se trouve mon sous rapport.

Le hic, donc, c'est que j'ai l'erreur suivante lorsque j'exécute mon programme java chargée de récupérer les infos et les distribuer dans le rapport général :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
net.sf.jasperreports.engine.JRException: Error loading object from file : C:\Program Files\eclipse\workspace\jasperTest\config\files.jrxml
	at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:92)
	at net.sf.jasperreports.engine.util.JRLoader.loadObjectFromLocation(JRLoader.java:257)
	at net.sf.jasperreports.engine.fill.JRFillSubreport.evaluate(JRFillSubreport.java:303)
	at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:274)
	at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:400)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:1273)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:614)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:209)
	at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:109)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:751)
	at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:679)
	at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:89)
	at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:601)
	at test.TestJasper.main(TestJasper.java:76)
Caused by: java.io.StreamCorruptedException: invalid stream header
	at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:737)
	at java.io.ObjectInputStream.<init>(ObjectInputStream.java:253)
	at net.sf.jasperreports.engine.util.JRLoader.loadObject(JRLoader.java:87)
	... 13 more
Voilà, je voulais donc savoir si certains d'entre vous savait d'où viens mon erreur.

Je vous remercie pour votre soutien


EDIT :
Un peu plus d'info, voici mon main java :
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
26
27
28
public static void main(String[] args) {
		try
		{

			JasperReport jasperReport = JasperCompileManager.compileReport("config/general.jrxml");      

			Map parameters = new HashMap();
			parameters.put("ReportTitle", "FORMATTING REPORT DOCDB EXCHANGE IN XML");
			parameters.put("DataFile", "DOCDB_XML_Formatting_Completeness.txt");
			parameters.put("DateProduced", "20070203");
			parameters.put("VolumeId", "EPDDEEP2007020806001001");

			JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, new JRTableModelDataSource(new CustomTableModel()));
			JasperExportManager.exportReportToPdfFile(jasperPrint, "test.pdf");

		}
		catch (JRException e)
		{
			e.printStackTrace();
			System.exit(1);
		}
		catch (Exception e)
		{
			e.printStackTrace();
			System.exit(1);
		}
}
L'erreur intervient sur la ligne en gras du code java.
kij est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2007, 08h34   #2
Membre du Club
 
Inscription : octobre 2006
Messages : 48
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 48
Points : 47
Points : 47
En fait je crois que tu peux pas passer directement ton subreport en absolutepath

ce que j'ai fait c'est que j'ai mis l'emplacement du subreport en parametre dans mon masterreport et puis j'ai passé en paramètres son adresse url et la pas de souci (tu peux utiliser la méthode toUrl() de la classe File je pense)

j'espere que ça pourra t'aider
phyzalis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2007, 13h39   #3
kij
Membre habitué
 
Inscription : avril 2005
Messages : 360
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2005
Messages : 360
Points : 120
Points : 120
Envoyer un message via MSN à kij
Ok, j'ai mis ce problème de coté pour le moment, je ferais comme tu dis lorsque j'aurais le temps et je te tiendrais au courant.

Merci pour tout
kij est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2007, 13h54   #4
kij
Membre habitué
 
Inscription : avril 2005
Messages : 360
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2005
Messages : 360
Points : 120
Points : 120
Envoyer un message via MSN à kij
Re,

En fait j'ai fait comme tu as dit (et c'est vrai qu'entre temps j'étais tombé sur des articles qui parlait de faire la même chose), mais cela ne change rien.
J'ai peut etre mal fait, mais je ne pense pas.
Voici les modifs que j'ai apporté :

Dans mon main java, l'ajout des paramètres :
Code :
1
2
3
 
parameters.put("REPORT_FOLDER", "config");
parameters.put("REPORT_FILE","files.jrxml");
Et dans mon rapport général :
Code :
1
2
3
4
5
6
7
 
// --- Ajout des paramètres
<parameter name="REPORT_FOLDER" isForPrompting="false" class="java.lang.String"/>
<parameter name="REPORT_FILE" isForPrompting="false" class="java.lang.String"/>
 
// Appel au sous rapport.
<subreportExpression  class="java.lang.String"><![CDATA[$P{REPORT_FOLDER} + System.getProperty("file.separator") + $P{REPORT_FILE}]]></subreportExpression>
kij est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2007, 14h52   #5
Membre du Club
 
Inscription : octobre 2006
Messages : 48
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 48
Points : 47
Points : 47
je crois que tu dois donner l'URL absolue et non pas relative.
Mais je t'avoue que moi-même j'étais un peu perdu. Je travaille en client serveur donc avec mon serveur apache pas de souci pour passer une url mais là je sais pas trop. Il doit y avoir une solution mais c'est sur je n'ai jamais réussi à le faire avec une url relative.

Si tu ne travaille pas avec un serveur ça doit pourtant bien être possible de passer ton adresse absolue de ton subreport sinon je vois pas comment tu peux faire.

Un endroit où tu trouvera peut-etre qqun pour t'aider mais c'est en anglais :
ici
il y a bcp de passage et des vrais professionnels de Jasper
phyzalis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2007, 15h19   #6
kij
Membre habitué
 
Inscription : avril 2005
Messages : 360
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2005
Messages : 360
Points : 120
Points : 120
Envoyer un message via MSN à kij
Relatif ou Absolu ne change rien.

Je vais aller poser la question sur sourceForge

Merci de ton aide!
kij est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2007, 16h06   #7
Membre du Club
 
Inscription : juillet 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 57
Points : 57
Points : 57
Tout d'abord, il me semble que tes sous-rapports doivent être précompilés pour que ton master puisse y acceder. Dans mes souvenirs, je renseignais toujours les .jasper pour les sous-rapports et non les .jrxml.

Sinon, le chemin des sous-rapports est relatif à celui du master.
Dans mon master, j'utilisais un parametre du genre SUBREPORT_DIR qui s'initialise automatiquement avec le répertoire conteneur du master. Et je concatenais avec le chemin et le nom de mon sous-rapport.
Par exemple, si le master et les sous-rapports sont dans le même répertoire, je renseignais juste : SUBREPORT_DIR +"/monsubreport1.jasper"
Lawmoon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2007, 17h59   #8
kij
Membre habitué
 
Inscription : avril 2005
Messages : 360
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2005
Messages : 360
Points : 120
Points : 120
Envoyer un message via MSN à kij
Ok, c'est donc pour ca les .jasper

Comment fait-on dans ce cas pour précompiler le sous rapport ? (et donc avoir le .jasper qui correspond)

(Je pose la question de suite car je ne pourrais regarder ca que demain, donc si d'ici là on peut me répondre c'est toujours mieux :p)

Merci encore pour ces infos.
kij est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2007, 08h54   #9
Membre du Club
 
Inscription : octobre 2006
Messages : 48
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 48
Points : 47
Points : 47
tu compile ton sous-rapport depuis iReport et il te genere les .jasper dans le dossier que tu lui indique (par defaut celui de iReport)
phyzalis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2007, 09h41   #10
kij
Membre habitué
 
Inscription : avril 2005
Messages : 360
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2005
Messages : 360
Points : 120
Points : 120
Envoyer un message via MSN à kij
Re bonjour,

Alors, j'ai effectué les changements, compilé le sous rapport. Ca semble fonctionner correctement si ce n'est que je n'ai aucune donnée dans mon sous rapport.
Le main java rempli les données du sous rapport noramelement (et du rapport principal), mais là rien ne se passe dans le sous rapport, les zones dynamiques sont vides.
Je me pose donc la question de savoir si le fait de compiler le sous rapport et de le donner comme ca n'empeche pas de le remplir avec des données ?

Si oui, dans ce cas, comment faudrait il que je fasse pour que mon main java remplisse les données dans le sous rapport, le compile, puis s'occupe du rapport principal ?


PS : pour l'instant dans mon main je ne fais que la chose suivante :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
 
			Map parameters = new HashMap();
			parameters.put("ReportTitle", "FORMATTING REPORT DOCDB EXCHANGE IN XML");
			parameters.put("DataFile", "DOCDB_XML_Formatting_Completeness.txt");
			parameters.put("DateProduced", "20070203");
			parameters.put("VolumeId", "EPDDEEP2007020806001001");
			parameters.put("REPORT_FOLDER", "config");
			parameters.put("REPORT_FILE","files.jasper");
 
			JasperReport jasperReport = JasperCompileManager.compileReport("config/general.jrxml");  
			JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, new JRTableModelDataSource(new CustomTableModel()));
			JasperExportManager.exportReportToPdfFile(jasperPrint, "test.pdf");
J'imagine qu'il faut remplir de la même facon la sous rapport en premier, puis générer le .jasper non ? Ceci afin de pouvoir faire le rapport général par la suite. Mais dans ce cas là, comment génère-t-on le .jasper après avoir rempli le sous rapport de données ?

(Beaucoup de questions je sais ^^ en tout merci pour tout)
kij est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2007, 10h20   #11
Membre du Club
 
Inscription : octobre 2006
Messages : 48
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 48
Points : 47
Points : 47
Les paramètres que tu passes dans ta HashTable sont ceux que tu veux dans ton subreport ? pour ma part j'utilise la même datasource pour mon mainreport et mon subreport et je n'ai pas de souci avec le fait de travailler avec des .jasper (d'ailleurs comme j'avais des prob de compatibilité de librairie mon mainreport est également directement un .jasper)
phyzalis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2007, 10h55   #12
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 kij
Re bonjour,

Alors, j'ai effectué les changements, compilé le sous rapport. Ca semble fonctionner correctement si ce n'est que je n'ai aucune donnée dans mon sous rapport.
Le main java rempli les données du sous rapport noramelement (et du rapport principal), mais là rien ne se passe dans le sous rapport, les zones dynamiques sont vides.
Je me pose donc la question de savoir si le fait de compiler le sous rapport et de le donner comme ca n'empeche pas de le remplir avec des données ?

Si oui, dans ce cas, comment faudrait il que je fasse pour que mon main java remplisse les données dans le sous rapport, le compile, puis s'occupe du rapport principal ?
Non ! Si tu regardes bien ton code, tu te rendras compte que la methode fillReport utilise toujours en parametre le rapport compilé. Tu fais bien un compileReport de ton master juste avant ! Donc pas de soucis pour ça.
Ensuite il faut savoir qu'un rapport ou un sous-rapport a toujours besoin d'avoir une datasource (même vide!) pour pouvoir s'afficher.


Citation:
Envoyé par kij
J'imagine qu'il faut remplir de la même facon la sous rapport en premier, puis générer le .jasper non ? Ceci afin de pouvoir faire le rapport général par la suite. Mais dans ce cas là, comment génère-t-on le .jasper après avoir rempli le sous rapport de données ?

(Beaucoup de questions je sais ^^ en tout merci pour tout)
Ton point d'entrée est toujours ton master report. C'est à lui de fournir la bonne datasource à tes sous-rapports. Dans IReport, quand tu configures ton sous-rapport il y a un onglet Datasource il me semble, c'est là qu'il faut la parametrer.


Enfin, comme le souligne phyzalis, quand tu auras tes rapports définitifs, il vaut mieux utiliser les .jasper directement, ça évite au moins l'étape inutile de la recompilation du .jrxml à chaque fois !
Lawmoon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2007, 10h56   #13
kij
Membre habitué
 
Inscription : avril 2005
Messages : 360
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2005
Messages : 360
Points : 120
Points : 120
Envoyer un message via MSN à kij
Edit : pas vu ton précédent message ^^

Donc je dois mal renseigner ma datasource si je te suis bien.

Voici ce que j'ai fais :
Dans mon rapport principal, j'ai créé un groupe nommé "sub1". J'ai tout laissé par défaut dans les options du groupe.
Ensuite dans la section 'sub1Header' j'ai insérer un sous-rapport.
Ce sous rapport pointe sur mon sous rapport. Dans les propriétés de ce sous rapport (double clic dessus), dans l'onglet 'Subrepot'->connection data source, j'ai mis l'option "utiliser la connexion courante", avec l'expression : $P{REPORT_CONNECTION}

Dans l'onglet 'Subreport(other)', j'ai mis l'expression suivante :
Code :
$P{REPORT_FOLDER} + System.getProperty("file.separator") + $P{REPORT_FILE}
pour le subreport expression afin qu'il retrouve mon fichier .jasper de mon sous rapport.
Pour ce qui est des paramètres, j'ai mis ceux du rapport maitre.

A ce stade, j'ai une question : le rapport maitre à 3 Field (ceux qui doivent apparaitre dans le sous rapport). Ces trois fields sont également déclarés, et utilisés dans le sous rapport. Mais dois-je faire queque chose de spécial pour les passer du rapport maitre au sous rapport ?

Voilà, sinon dans le sous rapport, seules les sections 'title', 'columnHeader' et 'detail' sont utilisées pour faire apparaitre un tableau 2D de mes données, avec trois colonne pour afficher les 3 fields différents.


EDIT : voici la tête de mon rapport principal :
principal

Et mon sous rapport :
sous rapport

Une question pour toi lawmoon : Pour utiliser directement le .jasper dans le code java, quel est la ligne de code exact ? A la place de :
Code :
JasperReport jasperReport = JasperCompileManager.compileReport("config/general.jrxml");
je veux dire.
kij est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2007, 11h47   #14
kij
Membre habitué
 
Inscription : avril 2005
Messages : 360
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2005
Messages : 360
Points : 120
Points : 120
Envoyer un message via MSN à kij
Voici ce que j'ai pour l'instant :


Les données ne s'affichent donc pas.

Et voilà ce que j'avais avec tout dans le même rapport (et le résultat que je voudrais donc) :
kij est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2007, 12h09   #15
kij
Membre habitué
 
Inscription : avril 2005
Messages : 360
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2005
Messages : 360
Points : 120
Points : 120
Envoyer un message via MSN à kij
J'ai affiché mon début de tableau dans la partie columnHeader du sous rapport pour voir les éventuelles valeur des Fields 'File', 'ReadInExtraction' et 'ProcessedInFormatting', et voilà ce que ca donne :


Ce qui montre bien que mes données ne sont pas passées de mon rapport principal à mon sous rapport.
La question est pourquoi désormais ?

(Je commence à désespérer de l'utilisation de ireport )
kij est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2007, 12h14   #16
Membre du Club
 
Inscription : octobre 2006
Messages : 48
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 48
Points : 47
Points : 47
Citation:
Une question pour toi lawmoon : Pour utiliser directement le .jasper dans le code java, quel est la ligne de code exact ? A la place de :
Code :
JasperReport jasperReport = JasperCompileManager.compileReport("config/general.jrxml");
je veux dire.
je crois pouvoir répondre à ça

JasperReport jasperReport = (JasperReport)JRLoader.loadObject("config/general.jasper");

Par contre pour tes null ...

Moi aussi au début j'ai vraiment haïe iReport ...
phyzalis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2007, 14h01   #17
kij
Membre habitué
 
Inscription : avril 2005
Messages : 360
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2005
Messages : 360
Points : 120
Points : 120
Envoyer un message via MSN à kij
Fort bien merci pour ta réponse

Je vais continuer à chercher pourquoi ca ne me prends pas mes trucs.
kij est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2007, 14h41   #18
Membre du Club
 
Inscription : juillet 2006
Messages : 57
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 57
Points : 57
Points : 57
Merci phyzalis

Pour le reste, ça me devient compliqué, j'ai pas Ireport sous la main, je ne me souviens pas de tout... Mais on va perséverer

Tu travailles avec quelle version de jasper/IReport? Les données que tu veux affichées viennent d'où, xml, bdd ou bean?

Déjà, j'ai maté rapidement ton master report et je mettrais le sous rapport dans la partie detail, il doit être soit dans détail, soit dans un group il me semble.

Allez, courage
Lawmoon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2007, 14h56   #19
kij
Membre habitué
 
Inscription : avril 2005
Messages : 360
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2005
Messages : 360
Points : 120
Points : 120
Envoyer un message via MSN à kij
J'utilise une version 1.3.0 de ireport que je lance depuis éclipse.

Pour ce qui est du sous rapport, je me suis peut etre trompé de screen mais normalement il est déjà dans un group (sub1), mais plutot que d'être dans la partie 'detail' je l'ai mis dans le 'header' du groupe en question.

Pourquoi ? Parce que si je le met dans le 'detail', le sous rapport est recopié plein de fois (autant de fois qu'il y a d'entrée dans le tableau du sous rapport normalement).

Les données utilisées sont en fait un model de table. Donc en gros un bean on va dire, grosso modo.



EDIT : j'ai mis le sous rapport dans la partie detail dans le rapport principal.
J'ai noté un changement : avant mon rapport faisait 3 pages dont les deux dernieres pages étaient vides.
Désormais il n'en fait plus qu'une (ce qui est mieux).
Donc je vais garder le sous rapport dans la partie 'detail'. Thanks.

Reste toujours ces fichues données :s
kij est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2007, 17h10   #20
kij
Membre habitué
 
Inscription : avril 2005
Messages : 360
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : avril 2005
Messages : 360
Points : 120
Points : 120
Envoyer un message via MSN à kij
Hem.. comment dire, mon problème est résolu.
Après avoir pesté sur ireport, je me suis apercu qu'en faisant des modifs sur mon java pour faire des tests auparavant... j'avais laissé une ligne de code qui mettais ma datasource à vide.
C'est donc pour cette raison que rien ne s'affichait depuis le temps.

Bref, on dit merci qui ?

Merci à vous deux !
kij est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h09.


 
 
 
 
Partenaires

Hébergement Web