Le Blog de C-quad

Archive pour la catégorie ‘Business Intelligence’

BI – Déployer un rapport sur JasperReports Server

Nous avons vu précédemment comment installer JasperReports Server sur une Centos, je vais vous montrer maintenant comment déployer un rapport sur le portail.

Pré-requis

Avoir une installation fonctionnelle de JasperReports Server et une base de données sur laquelle effectuer les rapports.

Il est nécessaire dans un premier temps de créer son rapport avec l’outil iReport. Une fois que le rapport correspond au résultat attendu, le sauvegarder au format jrxml.

Nous allons ensuite pouvoir passer à la configuration de JasperReports

Définition d’une connexion sous JasperReport

A l’aide de votre navigateur web se rendre sur l’interface de jasperreport : http://votre_serveur:8080/jasperserver

La connexion se fera avec l’utilisateur d’administration, à savoir par défaut jasperadmin/jasperadmin.

Nous créons un dossier qui va héberger la connexion vers la base de données qui sera consultée au sein du rapport :

 Nous créons donc un dossier connexions :

Nous ajoutons ensuite une source de données dans le dossier connexions que nous venons de créer.


Il reste à configurer la connexion. Il faut dans un premier temps choisir un type de connexion.
Il y a plusieurs possibilités :

  • soit une connexion JNDI qui va imposer que la définition de la connexion soit faite dans les fichiers de configuration du serveur d’application (ici tomcat)
  • soit une connexion JDBC

Bien évidement que ce soit dans le cas de la connexion JNDI ou JDBC, il est nécessaire que les drivers de connexion à la base de données cible soit bien présent pour le serveur d’application (pour tomcat : /usr/share/tomcat6/lib)

Prenons l’exemple d’une connexion JDBC :

Nous choisissons un nom, par exemple jdbc-foodmart : ce nom n’a pas vraiment d’importance, c’est le nom qui sera affiché dans JasperReport

Nous renseignons le pilote à utiliser : pour mysql ce sera com.mysql.jdbc.Driver

L’url de connexion sera du type  « jdbc:mysql://le_serveur:3306/la_bdd » ou l’on remplacera « le_serveur » par le nom du serveur qui héberge la base de données et « la_bdd » par le nom de la base de données à laquelle on veut accéder.

Il nous reste ensuite à définir l’utilisateur et le mot de passe associé à la base de données.

Déployer le rapport vers JasperServer

Nous allons maintenant déployer le rapport qui a été créé sous iReport :

Il nous faut ensuite choisir un nom pour le rapport et sélectionner le fichier de type jrxml (créé auparavant avec iReport)  à envoyer.

Nous sélectionnons ensuite la source de données précédemment créée (ici jdbc-foodmart) :

Il ne reste ensuite plus qu’a soumettre.
Et nous avons ensuite une jolie exécution du rapport possible par via le portail.

Il est alors possible de choisir d’exporter le résultat du rapport sous divers formats …

Une autre fonctionnalité intéressante est de pouvoir planifier l’exécution d’un rapport.

Planifier une exécution de rapport

 Il vous reste ensuite à cliquer sur planifier une tache et de suivre les divers écrans.

Voila donc un rapide survol de la publication de rapports avec la version libre de jasperreports. Une autre fonctionnalité important de cette version libre consiste à publier un cube OLAP de type Mondrian.

Cela pourra faire l’objet d’un autre article si cela vous intéresse…

BI – Installation de JasperReports sur CentOS 6

Je vous avais présenté (j’ai surtout survolé) précédemment la solution open source SpagoBI. Le monde de l’aide à la décision est massivement constitué d’outils propriétaires, mais il existe d’autres alternatives opensource. C’est le cas de la solution JasperReports qui fourni un portail web qui permettra d’héberger et de mettre à la disposition des utilisateurs de très beau rapports.

La force pour moi de JasperReports, c’est que la création des rapports y est assez simple et permet de faire le rendu que l’on désire au pixel près. Les créatifs pourront donc faire de très joli rendus.

JasperReports est produit pas une société : JasperSoft, qui propose un produit « entrée de gamme » open source qui est libre et une version plus évoluée qui elle n’est pas fournie sous licence open source.

Les versions payantes en fonction de l’option choisie permettent en autre de réaliser des requêtes ad-hoc, de gérer les accès aux rapports, de créer des dashboards, etc …

Je vous détaille ici la mise en place de la version open source disponible sur jasperforge.

Pré-requis

Tout d’abord, nous allons commencer par télécharger l’archive JasperReports-server.

J’ai choisi de prendre le war pour la simple et bonne raison, que les autres versions embarquent un serveur d’appplication ainsi que la base de données. Et je préfère utiliser les fonctionnalités de mon système d’exploitation, l’intégration n’en sera que plus propre.

Afin de pouvoir installer jasperreports, il est nécessaire d’avoir un serveur d’application ainsi qu’une base de données pour le moteur.

Nous utiliserons tomcat pour le serveur d’application et postgresql pour la base de données (tel que recommandé par jaspersoft)

 Installation et configuration de PostgreSQL

Remarque : Pour plus de détail sur l’installation de PostgreSQL, vous pouvez jeter un œil à la documentation fedora-fr sur le sujet.

Nous commençons par installer la base de données et le connecteur jdbc associé:

# yum install postgresql-server postgresql-jdbc

Une fois postgresql installé, il est nécessaire d’initialiser une base de données :

# service postgresql initdb

Si tout se passe bien vous avez pour réponse :

# Initialisation de la base de données : [ ok ]

Ensuite il est nécessaire de démarrer le service :

# service postgresql start

Si vous souhaitez que son lancement soit automatique lors du démarrage de la machine :

# chkconfig postgresql on

Nous définissions ensuite le mot de passe de l’utilisateur postgres :

# su - postgres
$ psql
postgres=# ALTER USER postgres WITH PASSWORD 'mon_password';

Et afin d’être propre nous allons créer un utilisateur spécifique pour JasperReports :

$ psql
# CREATE USER jruser;
# ALTER ROLE jruser WITH CREATEDB;
# ALTER USER jruser WITH ENCRYPTED PASSWORD 'jrpassword';

Afin de permettre la connexion à un utilisateur qui n’est pas défini sous unix, nous allons modifier la configuration de postgres en éditant le fichier /var/lib/pgsql/data/pg_hba.conf :

Modifier le fichier en remplaçant ident par md5 afin d’obtenir les lignes suivantes :

# "local" is for Unix domain socket connections only
local   all         all                               md5
# IPv4 local connections:
host    all         all         127.0.0.1/32          md5
# IPv6 local connections:
host    all         all         ::1/128               md5

Pour que les modifications prennent effet il faut redémarrer le serveur :

# service postgresql restart

Installation et configuration de Tomcat

L’installation est toujours aussi simple, il nous suffira de faire appel à yum :

# yum install tomcat6*

Il est ensuite nécessaire de définir un utilisateur qui pourra administrer tomcat, pour se faire éditer le fichier /etc/tomcat6/tomcat-users.xml et ajouter les lignes suivantes dans la section tomcat-users :

<role rolename="manager"/>
<user username="tomcat" password="tomcat" roles="manager"/>

Il est nécessaire d’ajouter le driver de connexion dans les libraires de tomcat :

# ln -s /usr/share/java/postgresql-jdbc.jar /usr/share/tomcat6/lib/

A noter : cette action sera aussi nécessaire en fonction des bases de données qui devront être accédées par vos rapports.

Nous pouvons ensuite démarrer le service tomcat6 et se connecter à l’interface d’administration. Attention pour que tomcat fonctionne il est nécessaire d’avoir un service apache fonctionnel :

# service httpd start
# service tomcat6 start
# chkconfig httpd on
# chkconfig tomcat6 on

Installation de JasperReports

Il est nécessaire dans un premier temps de décompresser l’archive téléchargée précédemment.
Puis nous allons créer un fichier default_master.properties dans le répertoire buildomatic qui contiendra :

# application server type (default is tomcat6)
appServerType = tomcat6

# Tomcat app server root dir
appServerDir = /var/lib/tomcat6

# database type
dbType=postgresql

# database location and connection settings
dbHost=localhost
dbUsername=jruser
dbPassword=jrpassword

# additional database parameters
# (uncomment these if you want non-default settings)
# dbPort=5432
# JasperServer db name, sample db names
# js.dbName=jasperserver
# sugarcrm.dbName=sugarcrm
# foodmart.dbName=foodmart

Une fois le fichier de configuration mis à jour nous pouvons tester si tout est ok pour l’installation :

# cd buildomatic
# ./js-install-ce.sh test

Si tout va bien, nous pouvons procéder à l’installation :

# ./js-install-ce.sh minimal
...
install-minimal-ce:
     [echo] Installation successfully completed!

BUILD SUCCESSFUL
Total time: 2 minutes 4 seconds
Checking Ant return code: OK

Note : Si on ne passe pas l’argument minimal, les databases de test foodmart et sugarcrm seront installées.

Afin que jaspersoft puisse fonctionner correctement, il est nécessaire qu’il puisse écrire (ses logs par exemple) dans la webapps. Nous allons spécifier que tomcat est le propriétaire de jasperserver :

# cd /usr/share/tomcat6/webapps
# chown -R tomcat:tomcat jasperserver

Bien vérifier que la connexion définie dans /usr/share/tomcat6/conf/Catalina/localhost/jasperserver.xml est correcte

Par défaut l’application est configurée avec deux comptes utilisateurs :

  • Un compte administrateur : jasperadmin avec le mot de passe jasperadmin
  • Un compte utilisateur : joeuser avec le mot de passe joeuser

Voici un aperçu de l’interface de l’administrateur :

Nous voila avec un portail JasperReports fonctionnel, il est maintenant nécessaire de créer les rapports avec le Studio de développement iReport.

SpagoBI 3.2 est disponible !

Ce n’est pas dans mes habitudes d’annoncer la disponibilité d’une version de logiciel sur ce blog, c’est même la première fois. Mais il faut dire que SpagoBI est une suite OpenSource qui mérite vraiment qu’on s’y intéresse.

SpagoBI est une suite décisionnelle open source. C’est donc un outil destiné aux entreprises qui ont des besoins décisionnel. SpagoBI est modulable. On peut considérer que de base, c’est un portail permettant de mettre à disposition des utilisateurs des rapports et graphiques pré-établis (C’est une vision très réductrice des fonctionnalités proposées de base). Les nombreux modules permettent d’augmenter les fonctionnalités en fonction des besoins (OLAP, Jasper, Talend, Qbe, etc …)

Chaque nouvelle version apporte de nombreuses nouvelles fonctionnalités et corrections de bugs.

La version 3.1 de SpagoBI présentait déjà les fonctionnalités suivantes :

  •  Rapports, Diagrammes et Cockpits (via BIRT et JasperReports)
  •  Analyse OLAP (JPalo)
  • Tableaux de bord en temps réel
  • Modèles d’Indicateurs clé de performance (KPI)
  • Analyse géo-référencée, pour l’affichage des informations sur une base géographique
  • Query by Example (QbE), pour la construction libre et visuelle des interrogations et pour la composition de vues structurées
  • Permet des exports dans de nombreux formats de fichiers (PDF, ODT, etc)
  • Console en temps réel, pour le monitorage des applications
  • Smart Filter, pour la sélection guidée des données
  • ETL (Talend)

Normalement la version 3.2 devrait apporter une fonctionnalité que j’attendais avec impatience:

  • l’analyse en mémoire (un peu comme le fait Qlikview par exemple)
  • Et de nombreuses améliorations du Studio de développement

J’essaierais de vous faire un retour sur ces nouvelles fonctionnalités dès que j’aurais eu le temps de les tester.

Pour ceux qui se sentent l’envie d’essayer, cela se passe par ici.

SpagoBI – Premier tableaux de bords

Nous avons vu précédemment comment installer et configurer l’accès à une base de données, nous allons donc pouvoir nous attaquer à la création de nos premières restitutions : les tableaux de bords.

Pré-requis

Pour pouvoir créer des tableaux de bords ou tout autre objet sur SpagoBI, il est préférable d’utiliser le « Studio ».  Vous pouvez télécharger le Studio pour Linux ou le Studio pour Windows. Le studio va vous permettre de créer entre autre les fichiers « template ». Il est tout à fait possible de les écrire aussi à la main, mais il est tout de même plus aisé de le faire avec le studio.

Lancer « SpagoBI – Eclipse Plateform ». Nous allons créer un nouveau projet : Fichier -> Nouveau -> Autre -> SpagoBI -> SpagoBI Project.

Nous déclarons maintenant notre serveur. Déplions l’item « Resources » afin de faire apparaitre l’item « Server » sur lequel nous allons faire un clic droit afin de pouvoir créer un nouveau serveur.

Nous voila prêt à créer notre premier tableau de bord.

Création d’un tableau de bord

On va commencer par créer un nouveau « DataSet » sur lequel le tableau de bord se basera.

Je crée le dataset « Ventes_par_pays » via l’interface web qui contient la requête suivante :

select s.store_country
sum(f.store_sales) as store_sales, sum(f.store_cost) as store_cost, sum(f.unit_sales) as unit_sales
from sales_fact_1998 f
inner join store s on (s.store_id = f.store_id)
inner join sales_region r on (s.region_id = r.region_id)
group by   s.store_country ;

Nous pouvons maintenant aller dans le Studio et faire un clic droit sur « Sbi_Analysis ». Nous choisissons « DashBoard » :

Sélectionner le document créé et faire un clic droit « Deploy »

On défini ensuite le nom du document ainsi que le dataset sur lequel il est basé.

Direction l’interface graphique :

 Comme vous pouvez le constater, nous n’avons que très peu la main sur l’organisation du tableau. Cette fonctionnalité permet pour moi surtout d’afficher le résultat d’une requête « proprement ». Mais je suis peut être passé à coté de quelque chose au niveau du paramétrage.

Je vous fais un rapide aperçu des autres possibilités de restitutions avec la requête utilisée :

Les colonnes en trois dimensions :

La requête utilisée :

select  concat(fname,' ',lname) Customer_Name,    
        round(rand()*100,2) Effort_Index,
    round(rand()*100,2) Competitiveness,
    round(rand()*100,2) Cost_Optimization,
    round(rand()*100,2) Health
from customer
where customer_id < 5;

Et son rendu graphique en utilisant columns3d.lzx.swf:

L’aiguille de compteur :

La requête utilisée :

select concat(fname,' ',lname) as serie, round(rand()*100,2) as value
from customer
where customer_id =1;

Le rendu en utilisant rot.lzx.swf :

Sur le modèle du tableau de bord ci dessus, il est possible de faire le même type de restitutions avec plusieurs aiguilles.

Le compteur multi-aiguilles :

Malheureusement le compteur avec plusieurs aiguilles n’est pas disponible dans la liste de choix dans le Studio. Il vous faudra donc créer le template vous même. Voici le template que j’ai utilisé :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<DASHBOARD movie='/dashboards/multirotation.lzx.swf' >
 <DIMENSION width='400' height='400' />
 <CONF>
  <PARAMETER name='minValue' value='0' />
  <PARAMETER name='maxValue' value='100' />
  <PARAMETER name='lowValue' value='33' />
  <PARAMETER name='highValue' value='66' />
  <PARAMETER name='numNeedles' value='4' />
  <PARAMETER name='xSerieAttributeName ' value='serie' />
  <PARAMETER name='value1' value='profits' />
  <PARAMETER name='value2' value='ventes' />
  <PARAMETER name='value3' value='SAV' />
  <PARAMETER name='value4' value='salaires' />
  <PARAMETER name='colorNeedle1' value='red' />
  <PARAMETER name='colorNeedle2' value='blue' />
  <PARAMETER name='colorNeedle3' value='aqua' />
  <PARAMETER name='colorNeedle3' value='yellow' />

  <PARAMETER name='multichart' value='false'/>
  <PARAMETER name='numCharts' value='1' />
    <PARAMETER name='orientation_multichart' value='vertical'/>
    <PARAMETER name='colorTitleSerie' value='purple' />
    <PARAMETER name='sizeTitleSerie' value='12' />
    <PARAMETER name='displayTitleBar' value='true' />
    <PARAMETER name='title' value='Exemple de graphique a 4 aiguilles' />
    <PARAMETER name='colorTitle' value='purple' />
    <PARAMETER name='sizeTitle' value='14' />
    <PARAMETER name='legend' value='true'/> 
 </CONF>

   <DRILL document="chtHistorySalesDirec">
    <!-- possible types for param: RELATIVE, ABSOUTE-->
      <PARAM name="param1" type="RELATIVE"  value="$F{serie}"/> <!-- parameter from db-->
      <PARAM name="paramStat" type="ABSOLUTE"  value="parametro statico"/> <!-- static parameter -->
  </DRILL>

  <DATA url='/servlet/AdapterHTTP?ACTION_NAME=GET_DATASET_RESULT'></DATA>

</DASHBOARD>

La requête utilisée :

SELECT 'Titre du graphique' as serie, 
       'profits' as value1, 'ventes' as value2, 'SAV' as value3, 'salaires' as value4, 
        20 as profits, 80 as ventes, 12 as SAV, 7 as salaires 
from dual;

Comme vous pouvez le constater la requête est structurante pour le rendu. Le texte retourné pour la colonne « serie » sert de Titre au graphique, et les libellés stockés dans value[1-4] servent dans la légende.

Voici le rendu en utilisant multirotation.lzx.swf :

Je pense qu’il est possible de créer des modèles de graphiques différent les fichiers « lzx.swf » sont en effet le fruit d’un logiciel libre : OpenLaszlo. Je n’ai par contre pas trouvé de tutoriel sur la possible création de nouveaux modèles pour SpagoBI.

 

SpagoBI 3.0 – Accéder à une base de données


Nous avons vu précédemment comment installer SpagoBI, nous allons maintenant le configurer afin qu’il puisse accéder à une base de données.

C’est mieux si un portail de restitution peux lire vos données 😉

Plutôt que de prendre le contenu d’une base de données qui ne vous est pas accessible, nous allons utiliser la base de données foodmart.

Créer la base de données Foodmart pour nos tests

Nous allons télécharger les données foodmart pour mysql.

Après décompressions de l’archive nous pouvons lancer l’import dans mysql :

$ mysql -u root -p < 'foodmart 20090211 1624.sql'

Nous donnons ensuite les droits à SpagoBI sur cette nouvelle database :

mysql> GRANT ALL PRIVILEGES ON `foodmart`.* TO 'SpagoBI'@'%';

Une petite vérification nous permet de constater que tout est ok :

$ mysql -u SpagoBI -p foodmart

Ajout de la connexion dans tomcat

Tel que nous l’avons fait pour la configuration de la base de données propre à SpagoBI, nous allons ajouter un connexion Jndi pour foodmart.
Pour cela nous éditons le fichier /etc/tomcat6/server.xml et ajoutons dans la section GlobalNamingResources :

<Resource name="jdbc/foodmart" auth="Container" type="javax.sql.DataSource"
          maxActive="100" maxIdle="30" maxWait="10000"
          username="SpagoBI" password="SpagoBI" driverClassName="com.mysql.jdbc.Driver"
          url="jdbc:mysql://localhost:3306/foodmart"/>

A noter : l’édition du fichier server.xml permet à ce que toutes les webapps de tomcat aient accès à cette connexion. Si vous voulez limiter la définition de la connexion à une seule application, il faut ajouter les lignes ci dessus au fichier context.xml du répertoire META-INF de votre application.

Création d’un DataSource dans SpagoBI

Se connecter avec le compte biadmin et aller dans Ressources -> Source de données :

Et renseigner les paramètres conformément à ce qui a été saisi dans le fichier server.xml :

On tombe alors sur une erreur :

it.eng.spago.error.EMFInternalError: severity [ERROR] description [DefaultScrollableDataResult::getDataRow: java.sql.SQLException: Column 'DS_ID' not found

Pour corriger cet erreur, il faut modifier le fichier statements.xml situé dans webapps/SpagoBI/WEB-INF/conf/config/ en y supprimant les alias.

exemple :

Select DS_ID as ID

doit être modifié en

Select DS_ID

Je n’ai par contre pas trouvé pourquoi cela ne fonctionne pas avec la première écriture.  A ma connaissance les alias de colonnes existent depuis la norme SQL92. A votre avis le problème vient du driver odbc mysql ? ou de l’utilisation qui en est faite par SpagoBI ? Je ne sais pas ou déposer mon rapport de bug …

edit : Après recherche approfondie, il n’est plus nécessaire de modifier le fichier statements.xml. Ce problème sur les alias est tracé dans le bug Mysql 35150 et 31499. Afin de corriger le problème il faut modifier la connexion mysql.

Pour cela éditer le fichier /etc/tomcat6/server.xml et ajouter « ?useOldAliasMetadataBehavior=true » :

<Resource name="jdbc/SpagoBI" auth="Container"
 type="javax.sql.DataSource"
 maxActive="100" maxIdle="30" maxWait="10000"
 username="SpagoBI" password="SpagoBI" drvierClassName="com.mysql.jdbc.Driver"
 url="jdbc:mysql://localhost:3306/SpagoBI?useOldAliasMetadataBehavior=true" />

Dans Ressources -> DataSet -> onglet Type on sélectionne Query. La Base de données que l’on vient de référencer « Foodmart » et on saisi une requête pour vérifier que la connexion est bien fonctionnelle :

Dans mon exemple j’ai pris :

select * from product;

Cliquer sur « Preview » et l’on constate que tout fonctionne 🙂