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 XITutoriel : 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éssaire 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 connaître 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-état 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 2 tables :
ITMMASTER (table article) et STOJOU (table des mouvements de stocks)

Image non disponible

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

Image non disponible

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 :

 
Sélectionnez

			{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 :

Image non disponible


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

menu

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

création

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.

lien sous-état

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.

boutons

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 :

champs sous-états

Cliquons sur suivant. Tout comme si l'on créé 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).

glisser - deposer

Et ainsi :

sous-état

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 2 états.

Il nous faut relier le code article : ITMMASTER.ITMREF à lui-même entre les 2 é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

changer les liens

La fenêtre suivante est répartie en 4 é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.
liens


Dans l'exemple précédent, nous avons sélectionner le champ ITMMASTER.ITMREF en se 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 chance 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 élement 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

paramètre dateref

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

paramètres

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

expert selection sous-etat

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 :

 
Sélectionnez

				{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 2 é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.

 
Sélectionnez

				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.

 
Sélectionnez

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

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

sous-etat V1

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.

sous-etat V2

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

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.

Mettre en forme le sous etat

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

Bordures

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 :

en-tête

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 sous sert qu'à afficher les données dans l'ordre).
Nous obtenons :

second groupe

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 :

 
Sélectionnez

			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 :

état fini

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

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 complexe, tant par les jointures que par des conditions d'affichage de ce sous-état.

Liens utiles

Remerciements

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