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
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.
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 »
Testez la connexion
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.
Clic droit sur le répertoire « queries», faites ensuite « add resource » puis « query »
Donnez un nom à votre requête
Liez la source de données à la requête
Entrez maintenant la requête qui permet de ressortir tous les genres distincts
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 »
Pour créer un input control, cliquez droit sur le répertoire nouvellement créé « input controls » ensuite faire « add resource » puis « input control »
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)
Décochez l’option « mandatory » (obligatoire) pour permettre une saisie nulle, il faut ensuite lier l’input control à la requête « gender »
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.
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 :
Construisez le rapport avec l’éditeur comme suit:
Synchroniser ce rapport avec JasperServer Report en cliquant droit sur le répertoire de destination voulu puis ajoutez-le. (Report-> Add -> JasperServer Report)
Faites « get source from current opened report » pour obtenir le rapport de l’éditeur qui est ouvert
Nommez le rapport
Sélectionnez la connexion Foodmart précédemment créée
Cliquez sur « terminer »
Ne reste plus qu’à lier notre input control au rapport
Connectez-vous à JasperReport et rendez-vous dans le répertoire choisi pour sauvegarder le rapport, on peut constater l’apparition de notre rapport.
Cliquez sur le rapport pour le lancer et sélectionnez un genre
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
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 :
Ajoutez la condition « toujours vraie » à la requête
Lorsque l’utilisateur sélectionnera une entrée vide, cela aura pour effet de neutraliser la « where clause ».
Relancez le rapport :
Tous les enregistrements par genre confondus s’affichent !
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.