image gauche logo Clairinfo image droite

Version du : 28/01/2007

TUTORIAL PARADOX POUR WINDOWS

Leçon 8 - La création d'états

Introduction :

La leçon précédente nous a permis d'extraire et de trier les données souhaitées pour notre édition, reste maintenant à construire l'édition elle-même. Nous allons donc créer un nouvel état dans la terminologie Paradox. Comme précédemment nous n'allons pas utiliser d'assistant pour cela afin de bien comprendre tout le processus.

Même si les états ressemblent fortement aux fiches (on peut d'ailleurs convertir une fiche en état ou inversement), les états ont des particularités propres. Ils n'intègrent pas de code OPAL mais offrent par exemple avec les "bandes de groupe" la possibilité de regrouper les données par paquets , cela sur plusieurs niveaux , ou la possibilité de déterminer le tri des enregistrements.

Concernant le tri des données il est quand même préférable de la faire dans la requête afin d'offrir avec un seul état des tris différents possibles car si le tri était réalisé dans l'état il nous faudrait multiplier les états pour offrir de multiple tris.

Créer un nouvel état LCli1.rsl (liste simplifiée des clients) :

- Menu Fichier / Nouveau / Etat
- Menu Fichier / Enregistrer et choisir LCli1 comme nom de fichier. L'extension pour les états est .RSL lorsqu'ils ne sont pas distribués (donc avec les ssources permettant de les modifier) et .RDL lorsqu'ils sont distribués (ils sont alors non modifiables)
- A ce stade vous pouvez choisir d'utiliser un assistant (un "expert") mais là nous allons tout créer de zéro, nous choisissons Vierge

- Vérifiez que vous avez bien les barres d'outils Propriété et Design Object (Objets de conception) affichées (Menu Affichage / Barre d'outils)

Définir le modèle relationnel :

Les états disposent comme les fiches d'un modèle relationnel permettant de préciser les tables à atteindre pour notre édition et les relations qui les unissent.

- Menu Format / Modèle relationnel (dans les versions plus anciennes c'est dans le menu fiche)
- La liste des tables de notre répertoire de travail s'affiche. Mais nous souhaitons ici prendre comme source de données principale la table Reponse.db située dans le répertoire privé que notre programme d'édition a créé (voir la leçon précédente).

- On valide par Ok. L'état sait maintenant quelles tables nous proposer... Ici notre premier état est très simple et ne nécessite qu'une seule table mais nous aurons souvent besoin de joindre plusieurs tables. Le cas le plus fréquent pour nos états programmés c'est de partir d'une table réponse dans le répertoire privé construite en OPAL et d'atteindre les données liées aux autres tables du répertoire de travail.

Rappel : Dans les modèles relationnels , qu'ils soient destinés aux fiches ou aux états, il est très important d'appeler les tables par l'alias défini pour l'application. Ici nous avons utilisé :Priv: qui désigne le répertoire privé. Pour notre répertoire de travail nous aurions utilisé :App:. L'idéal encore une fois étant de prendre 2 alias différents pour atteindre fiche et états d'un côté et les tables de l'autre car l'éventuel passage en Client/Serveur n'en sera que plus facile ensuite.

Placer nos éléments en conception :

a) Créer un titre réutilisable

Commençons par le titre des pages et construisons un bandeau clair et réutilisable pour nos éditions.

- Dans la barre d'outils prendre l'outil Boite et dessiner un grand rectangle horizontal sur la largeur de l'état dans le bande Page (les éléments placés dans cette bande se répétent en haut de chaque page). Dans ses propriétés spécifiez un cadre ombré (onglet Cadre).

- A l'intérieur placez un premier champ à gauche, pour placer la date d'édition, et accèdez à ses propriétés, Type d'affichage : Sans libellé , nous n'aurons que la date, pas de titre. Demandez également une police en italique. Maintenant , le champ étant sélectionné, demandez bouton droit / Définir le champ et dans la liste Champ spécial prenez "CeJour" qui affiche la date machine ("Maintenant" vous affiche l'heure et les autres possibilités sont explicites)

- Au milieu de la boite viendra le titre donc placez une zone texte et tapez "Liste simplifiée des clients", mettez le en gras et italique , taille 12 et centrez le horizontalement dans la boite conteneur.

- A droite dans la boite, placez une zone texte afin d'afficher la numérotation des pages. Nous voulons obtenir "Page n°x/y" par exemple. Tapez dans la zone texte Page n° puis placez un premier champ DANS la zone texte (donc faites un champ tout petit), après le texte saisi. Demandez un champ sans libellé. Définissez ce champ comme un champ spécial de type N°Page. placez vous ensuite à droite de ce premier champ toujours dans la zone texte et tapez le slashe / . Placez enfin un dernier champ dans la zone texte défini comme le champ spécial Nombre de page. Mettez la zone texte et les 2 champs en police italique.

Pour tester le résultat, comme pour les fiches, il vous suffit de basculer du mode conception en mode exécution avec <F8> par exemple

Cette entête d'état pourra désormais être copiée/collée à volonté , il ne vous restera qu'à modifier le titre.

b) Placer un cadre de table pour obtenir la liste des clients

- Il suffit de placer un objet cadre de table dans la bande Record (Enregistrement) puis de définir la table concernée par le menu contextuel (bouton droit de la souris) , Définir la table. Apparait alors notre modèle relationnel et nous pouvons sélectionner les champs souhaités dans la liste déroulante. Prenons juste le CodeClient et le Nom par exemple. Nous pouvons facilement changer l'ordre des colonnes ou retirer un champ de notre sélection dans la boite de dialogue

- Une fois affiché enonception à l'écran notre de table s'avère toujours très maniable. Nous pouvons déplacer les colonnes en positionnant la souris sur l'extrémité haute de la colonne et en effectuant un cliqué glissé.Nous pouvons changer la largeur d'une colonne en pointant la souris sur le trait séparateur de colonne et en effectuant un cliqué glissé. Changer la hauteur des lignes s'effectue de manière similaire mais pour les lignes intérieures seule la première ligne est modifiable ce qui provoquera la modification de toutes les autres lignes.

- Les propriétés du cadre de table permettent d'accéder à de nombreuses options dont la présentation de grille, l'affichage ou non d'un diviseur d'enregistrement (obtenir un trait horizontal entre chaque enregistrement), l'affichage ou non des barres de défilement (les ascenseurs). Avec les versions récentes de Paradox (10 et supérieur) il est recommandé de cocher la case "Afficher toutes les colonnes" dans l'onglet exécution afin de supprimer le bip audible à l'exécution sinon !

- Le cadre de table est lui-même un conteneur mais chaque objet du cadre de table peut être individuellement sélectionné et modifié (positionnement, couleur, style etc...). L'en-tête (contenant les titres des colonnes) du cadre peut ainsi être sélectionné pour être détaché, déplacé, supprimé...

- Les colonnes peuvent être individuellement sélectionnées en positionnant la souris sur la partie basse d'une colonne et cliquant plusieurs fois. La colonne sélectionnée peut alors être supprimée avec <Suppr>. Il est possible d'insérer une nouvelle colonne avec <Inser> (elle se place à gauche de la colonne en cours).

- Le cadre de table est un objet vraiment magique à l'usage. Vous pouvez par exemple déplacer (ou Couper/Copier - Coller) un ou plusieurs champs pour les disposer dans une même colonne en les superposant ou non afin de gagner de la place en largeur par exemple. Vous pouvez bien entendu ajouter du texte fixe à loisir par l'outil A de la barre d'outils.

c) Ajouter un champ calculé

Nous souhaitons afficher sous notre cadre de table le nombre de clients.

- Nous plaçons un nouveau champ sous le cadre de table mais dans la bande Report (ou Etat) pour que ce nombre ne s'affiche qu'à la fin de l'édition.
- Bouton droit définir le champ, choisir CodeClient dans la liste des champs de la table reponse.db et cocher Count (ou Nombre) dans la liste déroulante "Opérateur récapitulatif". Ce champ va compter le nombre de CodeClient donc le nombre de client.
- Nous pouvons alors sélectionner le texte associé pour écrire par exemple "Nombre de clients :"
- Il sera préférable d'adopter un format Entier pour le champ afin de masquer les décimales et de cadrer à gauche le résultat.

d) Ajouter une bande de regroupement

Imaginons que nous voulions regrouper nos clients par CodePostal sur notre édition.

- Menu Insérer / Grouper la bande... (Menu Etat / Ajouter une bande dans les anciennes versions)
- Choisir le Champ de regroupement, valider et...constater le miracle !

Paradox nous a ajouté une bande au dessus et en dessous de la bande des enregistrements , il a placé le champs dans la bande du dessus. Si nous souhaitons connaiître le nombre de client par code postal il nous suffit de recopier notre champ calculé dans la bande CodePostal...

- Nous pouvons multiplier les regroupements sans problème et , autre point très intéressant , pour les champs de type Date nous pourrons demander une fourchette de regroupement comme la semaine, le mois, l'année... Très , très pratique à l'usage !

- Ces bandes de regroupement sont prioritaires sur le tri de nos enregistrements bien entendu.

e) Spécifier un tri des enregistrements sur l'état lui-même

Même si nous n'en avons pas l'utilité ici il est très facile de spécifier un tri en effectuant un clic droit sur la bande "Tous les enregistrmeents" et en demandant Trier. Le tri peut alors s'effectuer sur plusieurs champs successifs mais il sera toujours ascendant.

f) Spécifier une sélection d'enregistrement sur l'état lui-même

Là encore nous n'en avons pas l'utilité ici mais il est possible de poser des critères de filtre directement sur le modèle relationnel en sélectionnant une table et en choisant Filtre dans son menu contextuel (bouton droit). Ces critères de filtre pourraient être définis en OPAL mais cela oblige alors à ouvrir l'état en conception , via l'instruction load, ce qui n'est pas très pratique.

Méfiez-vous de ne pas enregistrer votre état avec des filtres définis car c'est une cause classique de résultats étranges que l'on ne s'explique pas (même problème possible avec les fiches). L'utilisateur a l'impression d'avoir "perdu" des enregistrements...

g) Faire apparaître les critères de l'édition sur la première page de notre état

Voilà une demande légitime des utilisateurs ! Leur faire un bel état construit à la demande c'est bien mais leur rappeler quels étaient les critères de l'édition c'est mieux !

Rappelez-vous que nous avons pris soin lors de la leçon précédente d'enregistrer ces critères dans des variables d'environnement via des writeEnvironmentString ... Nous allons donc tout simplement les rappeler dans notre en-tête d'édition par un champ calculé effectuant un ReadEnvironmentString.

Mais nous voulons en outre ne pas répéter ces critères sur chaque page pour ne pas prendre trop de place. Nous allons donc copier notre en-tête standard vue plus haut dans la bande Report (Etat) en la modifiant légèrement pour afficher nos critères et nous allons demander à notre en-tête de page de ne pas s'afficher sur la première page pour ne pas doublon.

- Copiez/Coller notre boite d'en-tête dans la bande Report du haut
- Agrandissez la boite verticalement pour obtenir de la place pour les critères
- Placez une nouvelle zone texte sous le titre actuel de l'édition et cliquez dedans

- Tapez le libellé du premier critère "CodeClient :"
- Placez ensuite un nouveau champ DANS la zone de texte à la suite, demandez un affichage sans libellé
- Le champ étant sélectionné, demandez Bouton droit / Définir le champ et cochez Champ calculé
- Dans la case de la formule tapez : ReadEnvironmentString("CodeClient") et validez

Répétez ce dernier bloc de manipulations pour chacun des critères de l'édition.

- Sélectionnez enfin la bande Page (du haut) en cliquant dessus et accédez à ses propriétés (bouton droit de la souris)
- Décochez "Imprimer sur la première page" pour que seule notre en-tête d'état apparaisse sur la première page.

Nous aurons l'occasion lors de ce didacticiel Paradox de construire d'autres états nécessitant plusieurs tables mais nous avons vu là les points les plus importants.

A titre d'exercice je vous laisse construire l'état LCli2.rsl qui présentera toutes les données des clients dans un cadre de table donc en empilant les champs dans une même colonne pour gagner de la place en largeur. "Idéalement on duplique l'état et l'on ne modifie que ce qui change mais évidemment si le but est d'apprendre il vaut mieux tout recréer de zéro..."

Pour la création de l'état étiquettes je vous recommande d'utiliser l'expert par contre car il connait déjà les principaux formats (Avery L7160 par exemple)

Et comme rien ne vaut la pratique je vous laisse aussi faire les états liés aux produits car Il nous faut maintenant attaquer les choses sérieuses avec la facturation...

Haut de page    Précédent    Suivant

© Copyright 2000-2007 , Clairinfo ® , http://www.clairinfo.fr