Accueil du site > Les articles > Pièges et astuces en Adélia.
Version à imprimer Enregistrer au format PDF

Pièges et astuces en Adélia.

mardi 18 mai 2004, par Grégory Jarrige Visites  6755

Cet article évoque quelque pièges possibles sous Adélia et les astuces pour les éviter.


Piège et astuce.

Voici un piège vicieux, méconnu, et qui peut faire perdre pas mal de temps en débugage. En général, les programmeurs expérimentés ne se font pas avoir, encore que... Il est référencé dans la documentation HARDIS, mais je ne pense pas que la hotline d’HARDIS m’en voudra si je cite cette même documentation ici :

Problème : vous avez déclaré une vue sur un fichier logique, ou un fichier physique avec clé, vous faites une lecture séquentielle en pensant que les enregistrements seront lus en tenant compte de la clé du fichier, grave erreur.

Solution : si on accède à un fichier logique (ou physique avec clé) en séquentiel, la lecture se fait selon l’ordre d’écriture des enregistrements dans le fichier physique. Pour obtenir une lecture sur l’ordre des clés du logique (ou du physique), il faut : 1 - définir une vue avec un type d’accès par clé (et non séquentiel sans clé) 2 - préciser au moins une zone du chemin d’accès (même si elle paraît inutile) Et j’ajouterais qu’un positionnement avant la première lecture, après avoir mis la clé à blanc, lèvera toute ambiguïté quant à ce que le programme est censé faire.

Encore un piège pour débutant (celui-là je me suis pris les pieds dedans à mes débuts) :

Problème : vous lisez un fichier déclaré en mise à jour ou création en prenant soin de mettre un *UNLCK pour éviter un verrouillage d’enregistrement, et vous ne comprenez pas pourquoi vous avez un verrouillage d’enregistrement sur le fichier correspondant à cette vue.

Solution : commencez par chercher du côté des autres vues du programme, y compris celles déclarées dans les macros. Peut être existe-t-il une autre vue pointant sur le même fichier. Si c’est le cas, et même si elle n’est pas en mise à jour, c’est la vue en mise à jour qui prime. En effet, à la génération du code RPG, ADELIA déclarera un seul fichier pour toutes les vues (chaque vue étant déclarée sous forme de clé en RPG), et c’est le mode de lecture en mise à jour (ou création) qui sera déclaré sur ce fichier dans le RPG. Toute lecture de ce fichier (même par une vue sans mise à jour) entraînera un verrouillage d’enregistrement (que vous pourrez facilement éviter par un "LIRE *UNLCK" ou l’ordre "LIBERER").

Piège à éviter.

Déclarer une vue dans une macro-instruction ou une règle de gestion avec une clé spécifique, et une autre vue avec le même nom dans une autre macro-instruction (ou règle de gestion) utilisée par le même programme (ou une vue avec le même nom dans le programme utilisant la première macro), avec une autre clé. Si ces vues portant le même nom, portent sur le même fichier, aucun message d’avertissement ne vous préviendra à la compilation que la clé de la seconde vue du même nom est perdue. A l’exécution, le programme lira les enregistrements avec une clé qui n’est pas forcément celle que vous avez prévu. En cas de doute, regardez le listing résultant de la compilation Adelia qui vous donnera une vue synthétique de l’ensemble des vues utilisées dans le programme, avec leurs clés respectives. Une bonne habitude à prendre est de donner à vos vues de macro un nom sans ambiguïté. Par exemple, tous les noms de vues déclarées au sein de macros pourraient commencer par "MA_" suivi du nom du fichier, et d’un suffixe (à vous de codifier ce suffixe) pour indiquer qu’elles appartiennent à des macro-instructions, et surtout éviter les conflits entre macro-instructions.

Astuces.

N°1

Si vous souhaitez vous assurer qu’un enregistrement existe dans un fichier, sans pour autant charger cet enregistrement dans le buffer (car vous n’avez besoin d’aucune zone de ce fichier), vous pouvez utiliser un POSITIONNER_AV (correspond à un SETLL en RPG), suivi d’un SI EXISTE. En plus de ne pas charger le buffer, cette astuce offre un autre avantage, elle n’entraîne pas de verrouillage d’enregistrement. Mais elle peut entraîner des complications en maintenance, si vous décidez par la suite d’utiliser des zones du fichier en omettant de remplacer le POSITIONNER_AV par un LIRE.

Comment récupérer le numéro d’enregistrement dans un fichier physique sans clé, ou le numéro d’enregistrement d’une ligne de sous-fichier (la technique est la même).

* Récupération en zone cachée du numéro d'enregistrement
* ------------------------------------------------------
INFODS VUE_SFL
ZC_NUM_ENREG = *NO_ENR

Grâce à l'astuce ci-dessus, il est possible de relire l'enregistrement en accès direct dans le fichier physique :

LIRE VUE_DIRECT *UNLCK
SI VUE_DIRECT N_EXISTE_PAS
 REGLE_GESTION GEN0001 ZW_COD_OPTION
 ANOMALIE
SINON
 *-- mise à jour libellé dans sous-fichier
 ZZ_LIB_CLI = CF_LIB_CLI
FIN

Attention : la vue VUE_DIRECT doit être déclarée en accès direct avec pour clé ZC_NUM_ENREG (zone numérique de longueur 8.0)

N°2

Vous connaissez les commandes AS/400 (fournies avec Adélia/400 Réalisation) WRKMODI et WRKMODB ??? Si la réponse est non, c’est dommage, car ces commandes sont des raccourcis tellement plus pratiques que les options 31..37 et 41..46.

Pour éviter d’avoir à les taper chaque fois que vous en avez besoin, je vous suggère de les dupliquer en WI et WB (attention, j’ai bien dit "dupliquer" et pas "renommer").

N°3

Ne plus saisir les noms de variables dans l’éditeur de source d’Adélia/400.

Fonction non documentée dans les manuels Hardis (ou les miens ne sont pas à jour)

Lorsque vous appuyez sur "F13=Données" alors que le curseur se trouve sur une ligne de programme ou sur la zone de recherche, l’écran des variables (appelé aussi "glossaire des données" contient une option supplémentaire : 1=choisir

Il vous suffit d’utiliser cette option pour insérer la variable dans le modèle (source).

Si vous saisissez plusieurs 1, seule la première variable sera rapatriée.

Pour les suivantes, il vous faudra refaire F13 (sans sélection) et ENTREE, et hop !

N°4

La mire d’Adélia/400 ne vous plaît plus ? Vous souhaitez voir vos propres options dans les menus Adelia ? Changez-en !

Tous les fonds d’écran se trouvent dans le fichier HA£MENP

Pour ajouter des options aux menus : fichier HA£OPTP

Bon courage, car les manips seront à refaire à chaque changement de version d’Adélia.

N°5

Votre programme batch (par exemple, le programme MPU001) utilise 2 maquettes états (MPU001 et MPU002), mais quand vous demandez la compilation de votre programme, vous ne voyez apparaître que la maquette MPU001 dans la liste des maquettes rattachées. Vous avez probablement un problème avec l’environnement de données de votre programme. Pour vous en assurer, allez dans le source du programme, pressez F13 pour visualiser l’environnement de données, puis repressez F13 pour visualiser la listes des fichiers et maquettes liés au programme. Si vous ne voyez que la maquette MPU001 et pas la maquette MPU002, ne cherchez pas plus loin. Pressez F12 pour revenir à l’environnement de données, et ajoutez la maquette MPU002 dans la zone prévue à cet effet. Essayez à nouveau de compiler le programme, le problème devrait être réglé.