Construire un sous-état avec Crystal Reports

Adrien Artero

Ce tutoriel a pour but de vous montrer comment débuter avec les sous-états sur le logiciel Crystal Reports.

- Titre : Construire un sous-état avec Crystal Reports

- Auteur : Adrien Artero

- Parution : 15 avril 2008

- Mise à jour : 30 avril 2020

- Licence : Ce document est issu de http://www.developpez.com et reste la propriété exclusive de son auteur. La copie, modification et/ou distribution par quelque moyen que ce soit est soumise à l'obtention préalable de l'autorisation de l'auteur.

Sommaire

- Introduction

- I. Pourquoi un sous-état ?

- II. Réalisation de l'état

- III. Conception du sous-état

- III-A. Création du sous-état

- III-B. Paramétrage du sous-état

- III-C. Mise en forme du sous-état

- IV. Finition de l'état

- Conclusion

- Liens utiles

- Remerciements

Introduction

Ce tutoriel va se baser sur une connexion à la base de données de l'ERP X3 en se basant uniquement sur les champs et tables standards.

Pour l'exemple que nous suivrons tout au long de ce tutoriel, nous allons concevoir un état de tous les mouvements de stock pour une période donnée.
Pour avoir un stock initial, il va nous falloir calculer tous les mouvements de stocks qui ont eu lieu avant la période donnée.

Je vais concevoir assez rapidement la première partie de l'état.
Je vous suggère donc de lire avant le tutoriel de Fleur Anne Blain, Initiation à Crystal Reports XI.

Si vous souhaitez découvrir Crystal Reports 2008, il vous est possible de télécharger une version d'évaluation de 30 jours à cette adresse : Téléchargement Crystal Reports 2008.

I - Pourquoi un sous-état ?

Un sous-état est un second niveau d'état. Il permet de calculer ou lister des données qui ne correspondent pas aux critères de sélection du premier niveau.

Pour prendre l'exemple qui sera développé dans cet article, il est nécessaire de faire un sous-état.
Nous souhaitons lister les mouvements de stocks pour une période donnée. Nous allons donc mettre des bornes aux enregistrements afin de ne récupérer que ceux qui nous intéressent.
En faisant ceci, il nous est impossible de savoir quels sont les mouvements antérieurs et donc de connaitre le stock initial.

Il faut donc réaliser un sous-état qui pourra calculer les mouvements antérieurs à la période.

L'inconvénient majeur du sous-état est le temps de traitement. S'il est répété plusieurs fois dans l'état, ce dernier mettre beaucoup plus de temps à se charger complètement.
De même, lorsque plusieurs sous-états sont utilisés, le temps d'affichage devient important.

Un seul niveau de sous-état est possible, c'est-à-dire qu'il est impossible d'insérer un sous-état dans un sous-état. Les utilisateurs de Crystal Reports espèrent que dans les prochaines versions, ce critère soit pris en compte.

Il est également possible de se servir de sous-états pour les en-têtes ou pieds de page de documents (logos d'entreprise).
Au lieu de configurer sur chaque état, l'emplacement et la taille du logo dans l'en-tête ou le pied de page, il est possible de créer un état sans table, et d'y insérer le logo. Une fois paramétré, il est possible d'enregistrer cet état et de le réinsérer en tant que sous-état dans vos documents.

Voyons comment se conçoit un sous-état.

II - Réalisation de l'état

Pour concevoir cet état, nous n'avons besoin que de deux tables :
ITMMASTER (table article) et STOJOU (table des mouvements de stocks)

Afin d'être tranquille par la suite, on va tout de suite créer quatre paramètres :
datedeb , datefin , articledeb et articlefin

Nous allons passer à l'expert sélection.

Le champ code article s'appelle ITMMASTER.ITMREF_0 et le champ date s'appelle STOJOU.IPTDAT_0 (date d'imputation du mouvement).

Ainsi, on va filtrer sur les bornes articles que l'on souhaite et les dates que l'on souhaite dans l'expert sélection :

{ITMMASTER.ITMREF_0} in {?articledeb} to {?articlefin} and
{STOJOU.IPTDAT_0} in {?datedeb} to {?datefin}

Créons maintenant un groupe par code article (ITMMASTER.ITMREF) à l'aide de l'expert groupe :

Nous pouvons maintenant passer à la création du sous-état.

III - Conception du sous-état

Notre but est de déterminer le stock au début de la période demandée. Pour cela, nous allons créer un sous-état stock_ini que nous allons placer dans l'en-tête du groupe Article.

III-A - Création du sous-état

Pour cela, Fichier / Insertion / Sous-état

Il est possible de choisir un état déjà existant, mais dans notre exemple, nous allons le créer.
On saisit le nom stock_ini puis nous choisissons Assistant Etat.

Dans ce sous-état, nous allons reprendre les mêmes tables et champs que le rapport principal, car les infos sont les mêmes, il n'y a que la date qui varie.

Cliquons sur suivant. Il est possible ici de déjà sélectionner les champs que nous allons inclure dans le sous-état :
Il suffit pour cela de cliquer sur le champ disponible dans la partie de gauche, de cliquer sur la flèche qui va vers la droite afin de sélectionner le champ voulu.

La première flèche ajoute un champ dans le sous-état
La première double flèche ajoute la totalité des champs dans le sous-état
La seconde flèche retire un champ du sous-état
La seconde double flèche retire tous les champs du sous-état

On obtient ainsi pour notre exemple :

Cliquons sur suivant. Tout comme si l'on crée un état avec l'assistant, nous définissons les critères de notre sous-état.
Cliquons sur Terminer.
Nous revenons à la fenêtre d'insertion du sous-état. Cette fois-ci, le bouton OK n'est plus grisé. Cliquons donc dessus !
Il nous suffit maintenant de déposer le sous-état à l'endroit désiré (en-tête de groupe pour ce qui nous concerne).

Et ainsi :

Notre sous-état stock_ini est créé.

Il faut encore maintenant le relier à l'état principal, définir ses paramètres, ses critères, etc.

III-B - Paramétrage du sous-état

Il va falloir dans un premier temps relier les deux états.

Il nous faut relier le code article : ITMMASTER.ITMREF à lui-même entre les deux états.
Pour la date, il faut créer un paramètre dans le sous-état afin de pouvoir déterminer la sélection des enregistrements par la suite.
Il n'est pas ici question de bornes, car nous allons sélectionner tous les enregistrements dont la date se situe avant la période déterminée précédemment.

Nous créons donc dans le sous-état un paramètre dateref.

Nous retournons alors dans l'état principal pour créer ces liens.

Il faut cliquer droit sur le sous-état puis Changer les liens du sous-état

La fenêtre suivante est répartie en quatre éléments principaux. Il est capital de les maitriser, car si le sous-état est mal relié, les informations renvoyées seront incohérentes.

- Champs disponibles : ce sont tout simplement les champs de l'état principal qui peuvent être utilisés pour la liaison.

- Champs auxquels relier : ce sont tous les champs que nous allons prendre dans l'état principal pour la liaison.

- Champ de paramètre de sous-état : c'est le paramètre du sous-état qui va servir à la liaison. Il est créé automatiquement si l'on prend un champ standard.

- Sélectionner des données dans le sous-état : ce sont les champs standards du sous-état qui vont nous servir à la liaison.

Dans l'exemple précédent, nous avons sélectionné le champ ITMMASTER.ITMREF en nous positionnant dessus puis en cliquant sur la flèche.
Par défaut, Crystal Reports va prendre automatiquement le champ auquel il y a le plus de chances qu'il soit relié en fonction du type de champ, du nom de champ, etc.

Le bon champ a été sélectionné directement pour notre exemple. On voit ainsi que le champ de paramètre du sous-état qui sera utilisé s'appelle ?Pm-ITMMASTER.ITMREF_0

Nous pouvons maintenant, dans le 1er élément de l'écran, sélectionner le champ de paramètre ?datedeb afin de le relier à notre paramètre de sous-état ?dateref.
Une fois positionné dessus, nous cliquons sur la flèche afin de le sélectionner, puis nous décochons Sélectionner des données dans le sous-état (nous ne prenons pas un champ standard, mais un paramètre).

Ainsi, au niveau des paramètres de sous-état à utiliser, nous sélectionnons dans le menu déroulant, ?dateref

En allant vérifier les paramètres du sous-état, on constate que le paramètre ?Pm-ITMMASTER.ITMREF_0 est bien créé.

Allons maintenant dans l'expert sélection. On constate que le champ ITMREF doit être égal au paramètre nouvellement créé.

Il va falloir néanmoins déterminer que nous souhaitons tous les enregistrements dont la date est antérieure à ?dateref. Nous affichons alors la formule afin d'entrer le code suivant :

{ITMMASTER.ITMREF_0} = {?Pm-ITMMASTER.ITMREF_0} and
{STOJOU.IPTDAT_0} < {?dateref}

Nous allons pouvoir maintenant intégrer les données que l'on souhaite dans le sous-état.

III-C - Mise en forme du sous-état

Afin de pouvoir utiliser les données de notre sous-état dans l'état principal, il va falloir « stocker » les données dans des variables partagées. Partager les variables signifie qu'elles seront partagées entre les deux états.

Par précaution, il faut en en-tête de sous-état, initialiser la variable (lui donner la valeur 0) afin qu'en cas de non-enregistrement, les données renvoyées soient erronées.
Nous créons donc une formule @init que nous plaçons en en-tête de sous-état et dans laquelle nous écrivons le code suivant :

stoini représentera notre stock initial et stofin notre stock final.

shared numbervar stoini;
stoini:=0

Nous avons déterminé que pour le moment notre stock initial était de 0.
Pour connaitre notre réel stock initial à la date de référence, nous allons cumuler tous les mouvements de stocks.

Pour cela, nous créons une formule @stoini où l'on ajoute notre variable à la somme des mouvements de stocks et nous plaçons cette formule en pied d'état.

shared numbervar stoini;
stoini:=stoini+sum({STOJOU.QTYSTU_0})

Pour l'instant, notre sous-état ressemble à ceci :

Afin de gagner de l'espace au niveau de l'affichage, il est possible de supprimer toutes les sections où l'on ne souhaite pas voir les données.

Pour voir à quoi correspond cette valeur, il est bon d'ajouter un objet texte :

Nous en avons maintenant fini avec le sous-état. Il ne reste plus qu'à finaliser l'état principal et c'est fini.

Revenons alors dans l'état principal.

IV - Finition de l'état

Par défaut, Crystal Reports encadre le sous-état. Nous allons enlever ces bordures dans un souci d'esthétique.
Pour cela, il faut cliquer droit sur le sous-état puis Mettre en forme le champ.

Dans l'onglet Bordure, nous enlevons tous les traits.

Nous pouvons inclure un objet texte avec la référence de l'article afin de la placer en en-tête de groupe. Nous obtenons ainsi :

Nous allons maintenant lister les mouvements de stocks de la période en ajoutant la date et la quantité. Afin que les dates soient dans l'ordre chronologique, nous créons un deuxième groupe STOJOU.IPTDAT_0 dont nous masquons l'en-tête et le pied (le groupe ne nous sert qu'à afficher les données dans l'ordre).
Nous obtenons :

Nos mouvements étant listés, il va falloir les additionner au stock initial afin d'obtenir le stock final.

Nous créons pour cela, une formule stofin que nous plaçons en pied de groupe et où nous mettons le code suivant :

shared numbervar stoini;
shared numbervar stofin;
stofin:=stoini+sum({STOJOU.QTYSTU_0},{ITMMASTER.ITMREF_0})

Ici encore, nous plaçons un objet texte pour avoir une information sur la donnée. Nous avons donc :

Nous avons fini notre état, il ne nous reste plus qu'à visualiser le résultat :

Conclusion

Nous avons vu ici tous les points principaux de la réalisation d'un sous-état.

Les maitriser s'avère souvent utile dans la mesure où ils permettent d'aller encore plus loin dans l'exploration des données en contournant des critères de sélection déterminés à la base.
Nous avons ici mené à bien un exemple simple. Il est toutefois possible de réaliser des sous-états plus complexes, tant par les jointures que par des conditions d'affichage de ce sous-état.

Liens utiles

- Forum d'entraide Crystal Reports

- FAQ Crystal Reports

Remerciements

Je remercie Fleur-Anne Blain pour l'aide et les corrections qu'elle m'a apportées pour la réalisation de cet article et say pour ses remarques constructives.