2009-03-16 15 views
1

J'essaye de construire un rapport qui serait assez intelligent pour modifier légèrement sa requête sql basée sur un paramètre d'entrée quelconque. Par exemple, si cette valeur de paramètre de modification spéciale est "1", elle ajoute un champ dans la sélection et ajoute une clause group by à la requête.Querystring dynamique dans JRXML

J'ai examiné les expressions java, mais elles ne semblent pas être prises en charge dans la balise queryString du jrxml. Également essayé de faire une variable contenant l'expression java et utiliser cette variable dans la balise queryString ... Cela n'a pas fonctionné non plus! En ce moment je pense à peut-être avoir une procédure stockée avec toute cette logique et j'ai simplement le jrxml appelant cette procédure stockée avec le paramètre d'entrée de modification, mais le projet sur lequel je travaille ne semble pas avoir un beaucoup de proc stocké, donc je voudrais voir s'il existe d'autres solutions avant de me lancer dans cette voie.

Merci pour votre aide.


Merci les gars pour votre aide, très appréciée. Cependant j'ai trouvé une autre manière d'y arriver, et l'ai posté pour information: here

Répondre

0

Je l'ai fait en utilisant des procédures stockées qui sont très bien pour ce genre de choses. Sinon, vous pouvez passer à Java. Saisissez simplement les données de la base de données et, selon les paramètres fournis par l'utilisateur, filtrez-le, groupez-le et envoyez-le en tant que collection de beans au rapport Jasper qui effectuera le rendu. JasperDesign vous permet réellement de modifier des parties de votre document jrxml.

8

Donc disons que vous avez un paquet "rapports" où vous stockez votre rapport construit soit à la main ou par un outil comme iReport. Tant que votre requête est définie dans la balise <queryString> ce qui suit fonctionnera vous permettant de modifier la requête à la volée:

try { 
    String fileName = getClass().getClassLoader().getResource("com/foo/myproject/reports/TestReport.jrxml").getFile(); 
    File theFile = new File(fileName); 
    JasperDesign jasperDesign = JRXmlLoader.load(theFile); 

    //Build a new query 
    String theQuery = "SLECT * FROM myTable WHERE ..."; 

    // update the data query 
    JRDesignQuery newQuery = new JRDesignQuery(); 
    newQuery.setText(theQuery); 
    jasperDesign.setQuery(newQuery); 

    JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); 
    Connection conn = MyDatabaseClass.getConnection(); 
    JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, null, conn); 
    JasperViewer.viewReport(jasperPrint); 
} catch (Exception ex) { 
    String connectMsg = "Could not create the report " + ex.getMessage() + " " + ex.getLocalizedMessage(); 
    System.out.println(connectMsg); 
} 

Avec quelque chose comme cela, vous pouvez créer une variable de membre de votre classe qui détient la nouvelle requête et construisez-le avec toutes les contraintes d'utilisateur souhaitées. Ensuite, à l'heure de la vue, il suffit de modifier le design.

-Jeff

+0

Je cherchais vraiment quelque chose d'autre mais ce message de votre part m'aide beaucoup merci –

+0

Je pensais juste ajouter que vous pouvez également obtenir la requête originale (si c'est celle que vous voulez mettre à jour) en faisant jasperDesign.getQuery(). getText(); –

1

JasperDesign m'a aidé à résoudre le problème de la construction requête dynamique dans le dossier JRXML.

Pour générer le SQL dynamique, j'utilisais le code Squiggle (Google Code) pour générer dynamiquement le code SQL. Merci jeff