jeudi 19 janvier 2012

Rapports dans libreoffice base

Nous allons montrer, sur un exemple, comment dans libreoffice base réaliser un rapport contenant des sous-totaux et un grand total. Pour ce faire nous aurons besoin de l'extension "Oracle Report Builder". De nombreuses distributions fournissent un paquet qui installe cette extension, paquet le plus souvent appelé libreoffice-report-builder. A défaut de paquet, on peut également trouver cette extension ici. Notre rapport sera basé sur les données de la table PostgreSQL "opération" appartenant à bdtest, notre base de données de test, et qui a été introduite dans ce billet.
Pour faciliter notre travail, crééons une vue avec cette instruction exécutée dans un terminal psql connecté à bdtest:
CREATE VIEW opérationv2
AS
SELECT jour, seq, 
CASE  
 WHEN montant > 0 THEN
 montant 
ELSE 0
END AS crédit,
CASE  
 WHEN montant < 0 THEN
 -montant 
ELSE 0
END AS débit,
montant AS solde
FROM opération
Après avoir connecté libreoffice à bdtest, cliquons sur "Créer un rapport en mode Ébauche".
La première étape consiste à choisir la source des données, à savoir la vue opérationv2 (qui est considérée comme une table par libreoffice):


Par défaut, le rapport contient 3 sections dont seule la section "Détail" est prévue pour accueillir des données. Il est clair que nous aurons besoin de davantage de sections (pour les sous-totaux notamment). Heureusement celles-ci vont se créer automatiquement dans la suite.
Cliquons sur l'icône "Tri et groupement" de la barre d'outils standard:


et choisissons de grouper nos données par jour:


Nous n'oublions pas de sélectionner "Présent" pour "Grouper le pied de page" afin de disposer d'une section pour les sous-totaux.
Demandons également que tout le groupe soit conservé ensemble.
Enfin, ajoutons seq comme groupe afin de pouvoir définir un tri, mais nous ne voulons pas cette fois de section supplémentaire (il ne s'agit pas vraiment d'un groupe):


Nous pouvons commencer à disposer les différents champs et étiquettes sur le rapport. Procédons en premier, comme montré sur l'image ci-dessous, avec le champ "jour" qui se placera, précédé de son étiquette, dans la section "jour En-tête" préalablement sélectionnée:


Pour les données de la zone détail nous allons procéder autrement car nous ne voulons pas placer les étiquettes dans cette zone, mais bien dans la zone en-tête de groupe.
Sélectionnons "zone de texte" dans la barre d'outils "Contrôles de rapport" et déployons le champ à l'endroit qui convient:


La donnée à placer dans ce champ peut être choisie dans le panneau latéral droit des propriétés, onglet données:


Nous avons placé le champ de données seq. Procédons de même avec les champs débit, crédit et solde.
Tous les champs de la zone détail étant sélectionnés, nous fixons via l'onglet "Général" du panneau des propriétés les alignements et le formatage:


(il faudra plus tard mettre un formatage sans décimales pour seq)

Ensuite, nous cliquons sur les icônes "Aligner en haut de la section":


et "Réduire à partir du bas":



Cliquant sur l'icône "Champ d'étiquette"


déployons en dessous du champ seq,  et donc forcément dans la section "jour Pied de page", une étiquette avec la mention "total jour". De même plaçons en dessous des champs débit, crédit et solde, des zones de texte. Mais cette fois, au niveau des propriétés, "Type de champs de données", nous choisissons "Fonction", ensuite le Champ de données et comme fonction "Accumulation" :


Sélectionnant ensemble les trois champs de données, fixons comme auparavant les alignements (horizontal à droite, vertical au milieu) ainsi que le formatage (numérique avec décimales et séparateur de milliers). Ensuite nous alignons l'ensemble des champs en haut de la section et puis nous réduisons celle-ci.
Très bien. Mais où placer la ligne "Grand total" ? Nous avons besoin d'une section supplémentaire. Il nous faudrait un pied de page pour l'ensemble du rapport. Nous pouvons l'obtenir via le menu "Edition":


Reproduisons dans ce nouveau pied de page ce qui se trouve dans le pied de page de groupe, mis à part que l'étiquette contiendra la mention "TOTAL" et que pour les 3 champs de données la fonction accumulation sera étendue à l'ensemble du rapport:


Disposons maintenant dans la section en-tête du groupe jour, les étiquettes correspondant aux données figurant dans la section détails. Laissons un espace entre ces étiquettes et la limite inférieure de la section afin de pouvoir souligner l'ensemble. Au besoin, nous pouvons les aligner via l'icône "En haut" de la barre d'outils "Aligner":


Pour souligner l'ensemble de ces étiquettes, on s'attend à pouvoir utiliser l'icône "Ligne horizontale" de la barre d'outils "Contrôles de rapport":


Malheureusement les lignes obtenues en utilisant cet outil sont invisibles lorsque le rapport est exécuté.
Comment procéder? Utiliser la forme rectangle?



Toute tentative de redimensionner l'objet (pour le faire ressembler à une ligne) entraîne un plantage immédiat.
La solution consiste à placer un champ d'étiquette, sans libellé, avec une couleur d'arrière blanc et dont on contrôle la hauteur via le panneau propriété:



Nous soulignons également (en rouge cette fois) le champ "jour" précédé de son étiquette.
Dans la section "En-tête de rapport", déployons une étiquette contenant le titre du rapport (sur fond jaune pâle).
Dans la section "En-tête", plaçons via le menu insertion date et numéros de page.
Le résultat aura plus belle allure si nous adaptons la couleur du texte qui surmonte un trait à la couleur de ce trait:


Pour améliorer la présentation, donnons également une couleur de fond à l'ensemble formé par le champ jour et son libellé: nous choisissons "gris bleu".
D'autre part, il est préférable de garder l'ensemble de l'en-tête de groupe sur une même page:


(Ceci est inutile si auparavant il a été demandé de conserver ensemble tout le groupe.)

En ce qui concerne la section "Pied de groupe", nous lui attribuons la couleur d'arrière plan "gris clair".
Il reste à séparer le total général du reste du rapport par un trait.
Et voici le résultat:



EDIT: voir deux autres exemples de rapport dans ce billet