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

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

iReport Discussion :

requete sql dynamique [JasperReport]


Sujet :

iReport

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 22
    Points : 24
    Points
    24
    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.

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 48
    Points : 54
    Points
    54
    Par défaut
    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 !

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 22
    Points : 24
    Points
    24
    Par défaut
    salut a tous,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 48
    Points : 54
    Points
    54
    Par défaut
    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 !

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2006
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 22
    Points : 24
    Points
    24
    Par défaut
    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.

  6. #6
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 3
    Points : 8
    Points
    8
    Par défaut ajout Balises CODE
    Il est également possible de paramétrer la requête directement à partir du code java :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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");

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2006
    Messages : 32
    Points : 33
    Points
    33
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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}
    }

  8. #8
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  9. #9
    Membre actif Avatar de Vikisme
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2007
    Messages
    172
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2007
    Messages : 172
    Points : 228
    Points
    228
    Par défaut
    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.

  10. #10
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <parameter name="sql" isForPrompting="false" class="java.lang.String"></parameter>
    <queryString><![CDATA[$P{sql}]]></queryString>

  11. #11
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    oki,
    va valoir que je lise plus attentivement la prochaine fois et pas que je fasse cela en diagonale

    il fallait mettre $P!{sql}

  12. #12
    Candidat au Club
    Inscrit en
    Février 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 3
    Points : 4
    Points
    4
    Par défaut
    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 !

  13. #13
    Nouveau Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut ca marche a merveil
    ca marche tres bien, il faut juste ajouter le context exp:
    File fileToRead = new File(config.getServletContext().getRealPath("/")+"report_dossier\\"+FileName+".pdf");



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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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");

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] requete SQL dynamique
    Par rems033 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 20/01/2009, 18h09
  2. Réponses: 2
    Dernier message: 11/08/2008, 08h16
  3. Réponses: 1
    Dernier message: 09/07/2008, 21h07
  4. requete SQL dynamique avec checkbox
    Par Mickael Scofild dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 29/08/2007, 15h00
  5. Réponses: 3
    Dernier message: 20/03/2007, 13h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo