JasperReports Server: Gérer les paramètres vides de vos rapports

Il est très facile de créer des boîtes de dialogues dans les rapports, il suffit de créer des « input control » et de les lier aux paramètres de votre rapport mais comment faire pour gérer l’absence d’une entrée utilisateur.

Introduction

Comme à l’accoutumée, j’utiliserais la base de données de test Foodmart fournie en standard avec JasperReports Server qui peut facilement être installée de manière automatique.

Pré-requis et paramétrage

Pour ce tutoriel, il faut installer IReport et JasperReports Server (voir mon précédent article) et configurer les deux environnements pour la connexion à la base de données.

Configuration de IReport

Paramétrez la connexion à la DB en utilisant les drivers de MySQL qui sont 100% compatibles avec MariaDB

art17_img1_jasperreport_server__parametre_vide

Connexion au référentiel de JasperReport

Dans IReport, la vue « référentiel » n’est pas présente par défaut, pour l’afficher : « fenêtres » puis « JasperReports server repository », une fois cette fenêtre accessible, ajoutez la connexion vers JasperServer Reports.

art17_img2_jasperreport_server__parametre_vide

Configuration de JasperServer Reports

Paramétrez la connexion JDBC à la DB Foodmart en faisant un clic droit sur le répertoire « datasource », faites ensuite « add resource » puis « data source »

art17_img3_jasperreport_server__parametre_vide

Testez la connexion

art17_img4_jasperreport_server__parametre_vide

Les requêtes d’alimentation

Pour alimenter les listes déroulantes (combobox), il faut écrire des requêtes SQL. Idem que précédemment, je recommande de créer un répertoire dédié à cet effet.

art17_img5_jasperreport_server__parametre_vide

Clic droit sur le répertoire « queries», faites ensuite « add resource » puis « query »

Donnez un nom à votre requête

art17_img6_jasperreport_server__parametre_vide

Liez la source de données à la requête

art17_img7_jasperreport_server__parametre_vide

Entrez maintenant la requête qui permet de ressortir tous les genres distincts

art17_img8_jasperreport_server__parametre_vide

Créer des inputs control

Il faut garder à l’esprit que le nom de l’input control doit être identique au nom du paramètre utilisé dans IReport, c’est l’unique moyen pour JasperReport de faire le lien entre l’input control et votre paramètre utilisateur.

Ajouter un répertoire pour stocker vos « input control », je recommande de créer un répertoire par type d’objet à créer.

Cliquez droit sur le répertoire racine (root) puis « add folder »

art17_img9_jasperreport_server__parametre_vide

Pour créer un input control, cliquez droit sur le répertoire nouvellement créé « input controls » ensuite faire « add resource » puis « input control »

art17_img10_jasperreport_server__parametre_vide

Pour rappel, voici la liste des types d’input control disponibles:

Nom Utilisation
Boolean Valeur booléenne
Single value On entre une seule valeur
Single select list of values Sélection d’une valeur dans une liste définie
Single select query Sélection d’une valeur depuis une requête
Multi select list of values Sélection de plusieurs valeurs dans une liste définie
Multi select query Sélection de plusieurs valeurs depuis une requête
Single select list of values (radio) Sélection d’une valeur dans une liste définie via un bouton radio
Single select query (radio) Sélection d’une valeur depuis une requête via un bouton radio
Multi select list of values (check box) Sélection de plusieurs valeurs dans une liste définie via une case à cocher
Multi select query (check box) Sélection de plusieurs valeurs depuis une requête via une case à cocher

Pour notre exemple nous aurons besoin d’une seule valeur issue d’une requête (Single select query)

art17_img11_jasperreport_server__parametre_vide

Décochez l’option « mandatory » (obligatoire) pour permettre une saisie nulle, il faut ensuite lier l’input control à la requête « gender »

art17_img12_jasperreport_server__parametre_vide

Dans cette étape, vous indiquez le champ affiché (visible column) et le champ qui sera utilisé dans la construction du résultat (value column), étant donné qu’un seul champ est remonté dans la requête « gender », les deux valeurs restent identiques.

art17_img13_jasperreport_server__parametre_vide

ATTENTION : n’oubliez pas de cliquer sur « add » sinon l’éditeur n’enregistrera pas la saisie.

Cliquez ensuite sur submit » pour valider les opérations et enregistrer l’input control dans le réferentiel

Créer un rapport

Nous allons faire un rapport sur les clients et filtrer sur le genre (F pour féminin et M pour Masculin)

Ouvrez IReport, faire « File » puis « new » pour ajouter un rapport et collez la requête suivante :

art17_img14_jasperreport_server__parametre_vide

Construisez le rapport avec l’éditeur comme suit:

art17_img15_jasperreport_server__parametre_vide

Synchroniser ce rapport avec JasperServer Report en cliquant droit sur le répertoire de destination voulu puis ajoutez-le. (Report-> Add -> JasperServer Report)

art17_img16_jasperreport_server__parametre_vide

Faites « get source from current opened report » pour obtenir le rapport de l’éditeur qui est ouvert

art17_img18_jasperreport_server__parametre_vide

Nommez le rapport

art17_img17_jasperreport_server__parametre_vide
Sélectionnez la connexion Foodmart précédemment créée

art17_img19_jasperreport_server__parametre_vide

Cliquez sur « terminer »

Ne reste plus qu’à lier notre input control au rapport

art17_img20_jasperreport_server__parametre_vide

Connectez-vous à JasperReport et rendez-vous dans le répertoire choisi pour sauvegarder le rapport, on peut constater l’apparition de notre rapport.

art17_img21_jasperreport_server__parametre_vide

Cliquez sur le rapport pour le lancer et sélectionnez un genre

art17_img22_jasperreport_server__parametre_vide

art17_img23_jasperreport_server__parametre_vide

L’affichage du rapport avec la paramètre genre =’F’, mais comment gérer l’absence d’une entrée de l’utilisateur ? Si nous choisissons la valeur vide le rapport ne retourne rien

art17_img24_jasperreport_server__parametre_vide

Le comportement voulu est de dire « si je ne sélectionne rien, c’est que je souhaite voir tous les enregistrements »

Le paramètre vide

Jasperserver ne propose pas de gérer les entrées nulles ou vides de manière automatique en supprimant la « where clause », il faudra donc ajouter pour chaque paramètre, une condition que j’appelerai « toujours vraie » basée sur la valeur par défaut du paramètre et grâce au mot clé SQL « OR »

Petit exemple

 

 SELECT * FROM table1 WHERE champ1 = $parameter 


Dans le cas où le paramètre est vide ou null la requête ne retournera rien, pour pallier à ça, il suffit d’ajouter la fameuse condition « toujours vraie »

 

 SELECT * FROM table1 WHERE champ1 = $parameter OR 1 = 1 


Ce que nous pouvons traduire avec notre paramètre par :

 

 SELECT * FROM table1 WHERE champ1 = $parameter OR $parameter IS NULL 



La requête retournera l’entièreté des enregistrements en cas de paramètre vide.

Modifications

Retournez dans l’édition de votre rapport et modifiez la requête comme suit :

Mettez à jour le rapport, en cliquant droit dessus puis :

art17_img25_jasperreport_server__parametre_vide

Ajoutez la condition « toujours vraie » à la requête

art17_img26_jasperreport_server__parametre_vide

Lorsque l’utilisateur sélectionnera une entrée vide, cela aura pour effet de neutraliser la « where clause ».

Relancez le rapport :

art17_img27_jasperreport_server__parametre_vide

Tous les enregistrements par genre confondus s’affichent !

0 thoughts on “JasperReports Server: Gérer les paramètres vides de vos rapports

  1. Narmandakh

    Bonjour, j’aimerais savoir si c’est possible d’afficher la somme cumulé dans un crosstab, par exemple :

    CAR Count Cumulé %cumulé
    VW 5 5 50 %
    BMW 1 6 60 %
    Audi 4 10 100 %

    Merci.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

Petit calcul pour valider votre commentaire! merci * Time limit is exhausted. Please reload CAPTCHA.