Aller au contenu

Instruction RPG full free · IBM i (AS/400) · Mots-clés de déclaration

QUALIFIED

Structure à sous-zones qualifiées, et modèles

Oblige à écrire structure.sous_zone pour désigner une sous-zone ; avec TEMPLATE, la structure sert seulement de modèle pour d'autres déclarations.

Syntaxe

dcl-ds nom qualified;
dcl-ds nom_t qualified template;
dcl-ds copie likeds(nom_t);
dcl-ds copie likeds(nom_t) inz(*likeds);
QUALIFIED
Les sous-zones se désignent sous la forme structure.sous_zone. Deux structures peuvent donc avoir une sous-zone du même nom.
TEMPLATE
La structure n'est qu'une définition : on ne s'en sert pas dans le programme, on la copie avec LIKEDS. Convention : suffixer son nom par _t.
INZ(*LIKEDS)
Sur une structure copiée par LIKEDS, reprend les valeurs initiales du modèle.
DIM(n)
Une structure qualifiée peut être un tableau : clients(2).nom.
Effet
Aucun indicateur. Sans QUALIFIED, deux sous-zones de même nom dans deux structures donnent l'erreur de compilation RNF3315 (entrée déjà définie).

À quoi ça sert

Une structure classique fait de chaque sous-zone une variable globale du programme. Avec une dizaine de structures, les conflits de noms arrivent vite. QUALIFIED règle le problème à la racine : ancien.ville et nouveau.ville coexistent.

Combiné à TEMPLATE, on écrit une fois la forme d'une adresse, d'un client, d'un paramètre, puis on la réutilise par LIKEDS pour les variables, les paramètres et les retours de procédure. C'est la base de tout programme RPG moderne un peu structuré.

Exemple 1 : Modèle, copies et tableau de structures

**free
// QUALIFIED et TEMPLATE : deux structures de meme forme, noms de zones identiques sans conflit.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-ds personne_t qualified template;
  nom    char(20);
  ville  char(15);
  solde  packed(9:2) inz(0);
end-ds;

dcl-ds ancien likeds(personne_t);
dcl-ds nouveau likeds(personne_t);
dcl-ds clients qualified dim(2);
  nom   char(20);
  ville char(15);
end-ds;

ancien.nom = 'Dupont SA';
ancien.ville = 'Montpellier';
ancien.solde = 1250.50;

nouveau = ancien;
nouveau.ville = 'Lyon';

snd-msg 'Ancien : ' + %trimr(ancien.nom) + ' / ' + %trimr(ancien.ville)
  + ' / ' + %char(ancien.solde);
snd-msg 'Nouveau : ' + %trimr(nouveau.nom) + ' / ' + %trimr(nouveau.ville);

clients(1).nom = 'Martin et fils';
clients(2).nom = 'Petit Atelier';
snd-msg 'Tableau : ' + %trimr(clients(1).nom) + ' / ' + %trimr(clients(2).nom);

*inlr = *on;

Résultat réel, compilé et exécuté sur IBM i 7.5 :

Ancien : Dupont SA / Montpellier / 1250.50
Nouveau : Dupont SA / Lyon
Tableau : Martin et fils / Petit Atelier

personne_t est un modèle. ancien et nouveau en sont des copies. nouveau = ancien copie la structure entière, puis on change la ville de la copie sans toucher à l'original. clients est un tableau de deux structures qualifiées, d'où clients(1).nom.

Exemple 2 : INZ(*LIKEDS) et structure sans INZ

**free
// Piege : une structure LIKEDS d'un modele a INZ n'est pas initialisee comme lui.
ctl-opt dftactgrp(*no) actgrp(*new);

dcl-ds personne_t qualified template;
  nom   char(20);
  solde packed(9:2) inz(5);
end-ds;

dcl-ds avec likeds(personne_t) inz(*likeds);
dcl-ds sans likeds(personne_t);

snd-msg 'Avec INZ(*LIKEDS) : ' + %char(avec.solde);
snd-msg 'Sans INZ : [' + sans.nom + ']';
snd-msg 'Solde : ' + %char(sans.solde);

*inlr = *on;

Résultat réel, compilé et exécuté sur IBM i 7.5 :

Avec INZ(*LIKEDS) : 5.00
Sans INZ : [                    ]
Erreur : RNQ0907 - (C G D F) Erreur de données décimales.

La structure avec reçoit le inz(5) du modèle grâce à inz(*likeds) : 5,00. La structure sans, copiée sans cette précision, a son libellé en blancs mais son solde packed est invalide : la lecture déclenche RNQ0907.

Le piège

Une structure copiée par LIKEDS n'hérite pas du INZ du modèle. Même si le modèle déclare solde packed(9:2) inz(5), la structure sans likeds(personne_t) n'est pas initialisée, et lire son solde plante en RNQ0907. Ajoutez inz(*likeds).

Sans QUALIFIED, deux sous-zones de même nom dans deux structures sont rejetées à la compilation : nous avons obtenu RNF3315 en déclarant numero dans deux structures.