Possibilité de lire plusieurs fichiers (5 maxi) dans un même CL (V5R3) :
Le nouveau paramètre OPNID permet de manipuler plusieurs fichiers avec les ordres DCLF, RCVF, SNDRCVF et SNDF.
Ce paramètre est facultatif pour un seul fichier.
Les zones de FICHIER1, y compris les indicateurs, seront préfixées de l’OPNID (ex FIC1_). Par exemple la zone » CLIENT » de FICHIER1 devrait être utilisée ainsi : &FIC1_CLIENT.
Exemple
PGM DCLF FILE(FICHIER1) OPNID(FIC1) DCLF FILE(ECRAN) OPNID(ECR) SNDRCVF OPNID(ECR) LIR: DOWHILE COND(*NOT &ECRAN_IN03) RCVF OPNID(FIC1) MONMSG MSGID(CPF0864) EXEC(LEAVE CMDLBL(LIR)) CHGVAR &ECR_CLIENT &FIC1_CLIENT SNDRCVF OPNID(ECR) ENDDO ENDPGM |
Nouveaux ordre de structuration (DOWHILE-DOUNTIL-DOFOR-SELECT) (V5R3) :
Pour les trois boucles (DOxxxx) on peut forcer une sortie anticipée de la boucle par LEAVE ou sauter un tour par ITERATE .
On peut mettre un LABEL devant le DOxxx et indiquer le label lors du LEAVE
DOWHILE : Le test est réalisé avant d’entrer dans la boucle
DOWHILE COND(...) ... ENDDO |
DOUNTIL : La condition est testée sur le « ENDDO », la boucle sera toujours exécutée au moins une fois.
DOUNTIL COND(...) ... ENDDO |
DOFOR : TO=Départ BY=Pas
DOFOR VAR(&VAR) FROM(1) TO(22) BY(3) ... ENDDO |
SELECT équivalent au SELECT du RPG
SELECT WHEN COND( ) THEN( ) WHEN COND( ) THEN() OTHERWISE CMD( ) ENDSELECT |
variables binaires (V5R3)
Nouveau type de variable permettant de ne plus utiliser %BIN
DCL VAR(&VAR) TYPE(*INT) |
Il existe aussi le format *UINT (binaire non signé)
La longueur est de 2 octets et 4 octets
On peut convertir vers du décimal ou caractère avec CHGVAR
Définition de données OVERLAY (V5R4):
Il est maintenant possible recouvrir une variable avec des autres (même principe que overlay en RPG).
Le nouveau DCL soutient le mot-clé de STG (stockage), qui vous laisse indiquer comment le stockage d’une variable doit être assigné.
— STG (*DEFINED) indique au compilateur ce un ensemble ou une partie de recouvrements de variable d’une autre variable.
— DEFVAR (défini sur la variable) pour dire quelle variable cette nouvelle variable recouvre. DEFVAR prend deux valeurs–le nom de la variable qui est recouverte et la position de départ pour le recouvrement. La position de départ de défaut est « 1 ».
Exemple => Le cl reçoit un paramètre de 20 caractères de long, les 10 premmiers pour le nom de la bibliothèque et les 10 derniers pour le nom du fichier.
pgm (&QualFile) dcl &QualFile type(*char) len(20) dcl &File type(*char) len(10) + stg(*defined) defvar(&QualFile 1) dcl &Lib type(*char) len(10) + stg(*defined) defvar(&QualFile 11) chkobj &Lib/&File *file |
Cette technique est une excellente alternative aux opérations de sous chaine (type SST).
Gestion des pointeurs V5R4
A partir de la V5R4 on peut utilisé les pointeurs dans un CL.
pour déclarer un pointeur, il ne faut pas renseigner le paramètre LEN
DCL &Paddr TYPE(*PTR) |
Pour que le pointeur « pointe » une variable on utilise %ADDR (ou %ADDRESS).
CHGVAR VAR(&Paddr) VALUE(%ADDR(&LIST1)) |
Déclarer une variable « basée sur un pointeur :
DCL VAR(&Var) TYPE(???) STG(*BASED) BASPTR(&Paddr) |
Gestion des sous-routines (ou sous programme V5R4):
Les sous programmes doivent être placés à la fin du pgm (juste avant ENDPGM) et ne doivent pas être imbriqués.
Il n’est pas nécessaire de placer un GOTO ou un RETURN avant la 1ère sous-routine, le compilateur s’en charge.
On peu appeler un sous programme à partir d’un autre sous programme dans la limite indiquée par DLCPRCOPT (valeur par défaut 99)
Exemple
PGM /* declarations: DCL, DCLF, DCLPRCOPT, COPYRIGHT */ /* global MONMSG commands> */ /* Corps du pgm */ SUBR /* procedural code */ ENDSUBR SUBR /*procedural code */ ENDSUBR ENDPGM |
Un sous programme peut retourner une valeur numérique (cette valeur doit être une variable de type *INT de lg 4).
ENDSUBR RTNVAL(&ret) |
Cette valeur est alors récupérée lors de l’appel par
CALLSUBR RTNVAL(&ret) |