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 23/01/2007, 13h28   #1
Futur Membre du Club
 
Inscription : juillet 2006
Messages : 20
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 20
Points : 17
Points : 17
Par défaut requete sql dynamique [JasperReport]

salut a tous,
j'ai crée un modele de rapport a l'aide de Ireport, je souhaite pouvoir l'utiliser dans mon programme JAVA pour imprimer des donnees provenantes d'une base des donnees, mais la requete SQL n'est pas toujours la meme, comment la modifier a partir de JAVA ?
j'ai deja une idee sur la resolution de ce probleme:

1.ouvrir le fichier .jrxml generé par Ireport.
2.parcourir le fichier et modifier la valeur de l'element <querystring> contenant la requete SQL a l'aide de l'api JDOM.

je sais qu'il existe une meilleure façon pour ça, tout en passant par les variables,parametres,.... mais je sais pas comment faire.

SVP si quelq'un peut m'aider et merci d'avance.
ersoufiane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 16h51   #2
Membre du Club
 
Inscription : octobre 2006
Messages : 48
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 48
Points : 47
Points : 47
Il y a plus simple :
passer un parametre !

tu crée un paramètres REQUETE_SQL et tu le mets à la place de ta requete SQL dans ton rapport et
après avec ton fichier Java tu passes en paramètre une String contenant ta requete SQL avec le nom REQUETE_SQL (ça se fait en passant par une HashTable).

Sachant ça regarde juste comment on passe un paramètre à un rapport depuis java si tu as besoin et remplace ta requete SQL dans ton report par $P{REQUETE_SQL} et ça devrait fonctionner

Bonne chance !
phyzalis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2007, 19h44   #3
Futur Membre du Club
 
Inscription : juillet 2006
Messages : 20
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 20
Points : 17
Points : 17
salut a tous,

merci phyzalis pour votre reponse, mais j'ai quand meme une erreur au niveau de la compilation

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
try{
            // - Chargement et compilation du rapport
            JasperDesign jasperDesign = JRXmlLoader.load("bon.jrxml");
            JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
            map.put("SQL","select date_bc,code_client,nom_client,code,montant from bc");
            JasperPrint jasperPrint = JasperManager.fillReport(jasperReport, map, Menu.con);
            JasperManager.printReportToPdfFile(jasperPrint, "res.pdf");
        }
        catch(Exception e){
                System.out.println(e.getMessage());
                }
l'erreur :
Code :
Error executing SQL statement for : gray_lanscape
t'a une idée sur ce type d'erreur ?
sinon tu peux bien m'expliquer la procedure a suivre ?
merci.
ersoufiane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 08h46   #4
Membre du Club
 
Inscription : octobre 2006
Messages : 48
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 48
Points : 47
Points : 47
Je ne connais pas ce type d'erreur ... j'ai travaillé qu'avec des datasource XML et là c'est clairement un problème SQL
peut-etre dois tu également définir tes paramètres de connection dans des paramètres ?

si tu veux une réponse plus rapidement, et que tu maitrise l'anglais, va sur
http://www.jasperforge.org
et sur le forum, ça repond très vite !
phyzalis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2007, 11h23   #5
Futur Membre du Club
 
Inscription : juillet 2006
Messages : 20
Détails du profil
Informations forums :
Inscription : juillet 2006
Messages : 20
Points : 17
Points : 17
salut a tous,

ca a enfin marché, j'ai seulement ajouté un point d'exclamation dans la declaration de la variable ($P!{SQL} au lieu de $P{SQL}).

merci.
ersoufiane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2007, 14h06   #6
Invité de passage
 
Inscription : janvier 2007
Messages : 3
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 3
Points : 2
Points : 2
Par défaut ajout Balises CODE

Il est également possible de paramétrer la requête directement à partir du code java :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// - Chargement et paramétrage du rapport
JasperDesign jasperDesign = JRXmlLoader.load("C:\\MyWorkspace\\MyReports\\MyReport1.jrxml");
 
JRDesignQuery query = new JRDesignQuery();
query.setText("SELECT * FROM TABLE_A WHERE COL_X > 10");
jasperDesign.setQuery(query);
 
// - compilation du rapport
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
 
// - Paramètres à envoyer au rapport
Map parameters = new HashMap();
parameters.put("Titre", "Titre");
 
// - Execution du rapport
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, connection);
 
// - Création du rapport au format PDF
JasperExportManager.exportReportToPdfFile(jasperPrint, "C:\\MyWorkspace\\MyReports\\MyReport1.pdf");
super_cros est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2007, 10h33   #7
Membre à l'essai
 
Inscription : octobre 2006
Messages : 32
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2006
Messages : 32
Points : 24
Points : 24
Salut,

Citation:
Envoyé par super_cros
Il est également possible de paramétrer la requête directement à partir du code java :

// - Chargement et paramétrage du rapport
JasperDesign jasperDesign = JRXmlLoader.load("C:\\MyWorkspace\\MyReports\\MyReport1.jrxml");

JRDesignQuery query = new JRDesignQuery();
query.setText("SELECT * FROM TABLE_A WHERE COL_X > 10");
jasperDesign.setQuery(query);

// - compilation du rapport
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);

// - Paramètres à envoyer au rapport
Map parameters = new HashMap();
parameters.put("Titre", "Titre");

// - Execution du rapport
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, connection);

// - Création du rapport au format PDF
JasperExportManager.exportReportToPdfFile(jasperPrint, "C:\\MyWorkspace\\MyReports\\MyReport1.pdf");
J'utilise le meme code que toi, mais ce qui m'embete le plus c'est qu'il faut recompiler le rapport à chaque appel.
Le but étant de gagner du temps, est il possible de modifier directement la requete grace à un autre parametre?

Par exemple:

Code :
1
2
3
4
5
6
7
Select * From vue1 v1, vue2
Where  
if($P{param1} == uneValeur){
une colone = $P{param2}
else{
une autre colone = $P{param2}
}
Florent Coulon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2007, 17h23   #8
Invité régulier
 
Inscription : août 2005
Messages : 10
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 10
Points : 9
Points : 9
Bonjour,

comme vous vous en doutez, j'ai un ch'ti soucis

j'ai un rapport qui va devoir être filtré selon différents critères que je ne peux connaitre au moment de la conception du rapport.
J'ai donc créé un paramètre ( $P{sql} ) qui sera fournit par java.
Par défaut, il n'y aura pas de filtres et la requête sera alors la suivante :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT 
	rfc.idRFC, 
	NULLIF( cc.name, "" ) as "changeCoordinator",
	rfc.idStatut, 
	NULLIF( st.nom, "" ) as "statutRFC",
	NULLIF( appli.nom, "" ) as "application",
	NULLIF( site.nom, "" ) as "site",
	NULLIF( outil.nom, "" ) as "outil",
....
FROM 
	XOAMP.xoops_ddc_rfc rfc
	LEFT OUTER JOIN
	XOAMP.xoops_users cc
	ON rfc.idCC = cc.uid
....
ORDER BY idRFC;
J'ai mis cette requête comme valeur par défaut du paramètre "sql" en prenant soin de remplacer les " par \" dans les NULLIF, par ` dans les alias et en faisant un new java.lang.String("...").

A la compilation du rapport, aucune erreur n'est levée. Par contre dès que je l'exécute, j'obtiens l'erreur suivante :
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
Erreur lors du remplissage de l’impression… Error executing SQL statement for : rapportRFCs_v1 
net.sf.jasperreports.engine.JRException: Error executing SQL statement for : rapportRFCs_v1      
at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createDatasource(JRJdbcQueryExecuter.java:141)      
at net.sf.jasperreports.engine.fill.JRFillDataset.createQueryDatasource(JRFillDataset.java:682)      
at net.sf.jasperreports.engine.fill.JRFillDataset.initDatasource(JRFillDataset.java:614)      
at net.sf.jasperreports.engine.fill.JRBaseFiller.setParameters(JRBaseFiller.java:892)      
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:716)      
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:669)      
at net.sf.jasperreports.engine.fill.JRFiller.fillReport(JRFiller.java:63)      
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:402)      
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:234)      
at it.businesslogic.ireport.IReportCompiler.run(IReportCompiler.java:942)      
at java.lang.Thread.run(Unknown Source)  
Caused by: java.sql.SQLException: You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version for the right syntax to use near ''SELECT rfc.idRFC, NULLIF( cc.name, "" ) as `changeCoordinator`, rfc.idStatut, N' at line 1      
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2926)      
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1571)      
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1666)      
at com.mysql.jdbc.Connection.execSQL(Connection.java:2978)      
at com.mysql.jdbc.Connection.execSQL(Connection.java:2902)      
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:933)      
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1027)      
at net.sf.jasperreports.engine.query.JRJdbcQueryExecuter.createDatasource(JRJdbcQueryExecuter.java:135)      
... 10 more  
L’impression n’est pas complétée. Essayez d’utiliser une EmptyDataSource...
Ce que je n'arrive pas à cerner, c'est pourquoi ma requête se retrouve précédée par 2 quote simple !

Toute suggestion sera la bienvenue et merci à ceux qui auront pris la peine d'arriver jusqu'ici
ganj est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 09h50   #9
Membre actif
 
Avatar de Vikisme
 
Homme François
Développeur Java
Inscription : avril 2007
Messages : 162
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 26
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Java

Informations forums :
Inscription : avril 2007
Messages : 162
Points : 179
Points : 179
Citation:
J'utilise le meme code que toi, mais ce qui m'embete le plus c'est qu'il faut recompiler le rapport à chaque appel.
Le but étant de gagner du temps, est il possible de modifier directement la requete grace à un autre parametre?
Tu peux faire un filtre sur la requête... Mais bon après je sais pas si ça fait gagné beaucoup de temps vu qu'il va recherché tous les éléments avant de filtrer.
__________________
Tout passe, tout casse
Le joint le cul lassent...


http://www.myspace.fr/geampa_raler
Vikisme est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 11h09   #10
Invité régulier
 
Inscription : août 2005
Messages : 10
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 10
Points : 9
Points : 9
Pensant que mon problème provient des quotes se trouvant dans la requête, j'ai créé une table à partir de ma requête et l'ais remplacé sous iReport par un "select * from temp;"

je rencontre la même erreur à savoir :
Code :
1
2
3
SQLException: You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version 
for the right syntax to use near ''select * from XOAMP.temp;'' at line 1
Je ne comprends toujours pas pourquoi il y a ces 2 quotes simples entourant mon code sql ! Je ne comprends pas non plus où peut être l'erreur sql dans cette requête aussi compliquée soit elle

voici le code extrait du jrxml :
Code :
1
2
<parameter name="sql" isForPrompting="false" class="java.lang.String"></parameter>
<queryString><![CDATA[$P{sql}]]></queryString>
ganj est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2007, 11h42   #11
Invité régulier
 
Inscription : août 2005
Messages : 10
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 10
Points : 9
Points : 9
oki,
va valoir que je lise plus attentivement la prochaine fois et pas que je fasse cela en diagonale

il fallait mettre $P!{sql}
ganj est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/02/2010, 15h31   #12
Invité de passage
 
ahmed sghir
Inscription : février 2010
Messages : 2
Détails du profil
Informations personnelles :
Nom : ahmed sghir

Informations forums :
Inscription : février 2010
Messages : 2
Points : 2
Points : 2
salu
j'utilise un rapport ireport , et je veu préciser une requete depuis ma classe java !j'ai essayer ce code :
String url = "jdbc:mysql://localhost/calender";
java.sql.Connection con = null;
JasperDesign jasperDesign= null;
JasperReport jasperReport= null;
try {
// - Connexion à la base
Driver monDriver = new com.mysql.jdbc.Driver();
DriverManager.registerDriver(monDriver);
try {
con = DriverManager.getConnection(url, "root", "mysql");
} catch (SQLException ex) {
Logger.getLogger(Connection.class.getName()).log(Level.SEVERE, null, ex);
}
// - Chargement et compilation du rapport

try {
jasperDesign = JRXmlLoader.load("C:\\Documents and Settings\\Administrateur\\Bureau\\classic.jrxml");
JRDesignQuery query = new JRDesignQuery();
query.setText("SELECT * FROM RDV WHERE id= 28");
jasperDesign.setQuery(query);
jasperReport = JasperCompileManager.compileReport(jasperDesign);
}
catch (JRException ex) {
Logger.getLogger(rapport.class.getName()).log(Level.SEVERE, null, ex);
}
try{


System.out.println("aaaaaaaaaaaaaaaaaaaaaaaaaa");
}
catch(Exception e){
e.toString();
}
// - Paramètres à envoyer au rapport
Map parameters = new HashMap();
parameters.put("Titre", "Titre");
// - Execution du rapport
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, con);//fillReport(jasperReport, parameters,connection);
// - Création du rapport au format PDF
JasperExportManager.exportReportToPdfFile(jasperPrint,"D:\\classic.pdf");
} catch (SQLException ex) {
Logger.getLogger(rapport.class.getName()).log(Level.SEVERE, null, ex);
} catch (JRException e) {
e.printStackTrace();
try {
con.close();
} catch (SQLException ex) {
Logger.getLogger(rapport.class.getName()).log(Level.SEVERE, null, ex);
}
}
mais lors de l'execution il m'affiche une erreur :

Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: net.sf.jasperreports.engine.design.JasperDesign.setQuery(Lnet/sf/jasperreports/engine/design/JRDesignQueryV
at calendar.rapport.button1ActionPerformed(rapport.java:112)
at calendar.rapport.access$000(rapport.java:43)
at calendar.rapport$1.actionPerformed(rapport.java:67)
at java.awt.Button.processActionEvent(Button.java:392)
at java.awt.Button.processEvent(Button.java:360)
at java.awt.Component.dispatchEventImpl(Component.java:4501)
at java.awt.Component.dispatchEvent(Component.java:4331)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

svp , si kelkun peu me dire ou est l'erreur , c urgent !
sg_ahmed 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 00h31.


 
 
 
 
Partenaires

Hébergement Web