- Chercher les programmes en erreur de niveau
Permet de repérer les programmes RPG qui vont planter en erreur de niveau suite à une évolution de la base de données.
1) Lister les références des programmes dans un fichier temporaire :
DSPPGMREF PGM(BIBPGM/*ALL) OUTPUT(OUTFILE) OBJTYPE(*PGM) OUTFILE(QTEMP/LISTEPGM)2) Croiser les « format level ID » entre la liste des références des programmes et la liste des fichiers
SELECT whlib, whpnam, whlnam, whfnam, whrfnm<>
FROM qtemp.listepgm
LEFT JOIN sysfiles ON whfnam=system_table_name AND whrfnm=format_name
WHERE whrfsnformat_level_idANDsystem_table_schema IN ('BIBFICHIER1' , 'BIBFICHIER2')On obtient la liste des programmes de la bibliothèque BIBPGM en erreur de niveau sur les fichiers des bibliothèques BIBFICHIER1 et BIBFICHIER2 :

Il n’y a plus qu’à recompiler le ou les programmes trouvés (dans l’exemple BIBPGM/ADDCUST). La méthode fonctionne aussi pour les PRTF et les DSPF.
- Boucle de lecture en SQLRPGLE
Exemple : Lecture de la table utilisateur en filtrant les habitants de PARIS
**FREE // Déclaration des variables dcl-s nom char(30); dcl-s prenom char(30); dcl-s ville char(20) inz('PARIS'); // Définition du curseur C01 exec sql declare C01 cursor for select NOM , PRENOM from UTILISATEUR where VILLE = :ville order by NOM , PRENOM; // Ouverture du curseur exec sql open C01; // Boucle de lecture dow sqlcode = 0; exec sql fetch C01 into :nom , :prenom ; if sqlcode = 0; // lecture réussie, je fais mon traitement ici endif; enddo; // Fermeture du curseur exec sql close C01; *inlr = *on; return; - Remplacer des caractères dans une chaîne de caractères
Utilisation de %SCANRPL( from : to : source { : start } )
**FREE dcl-s chaine varchar(50); chaine = 'AZ500 IBMi AZ500 IBMi AZ500'; chaine = %SCANRPL('Z5' : 'S4' : chaine); // chaine = 'AS400 IBMi AS400 IBMi AS400' chaine = %SCANRPL(' IBMi ' : ' ' : chaine); // chaine = 'AS400 AS400 AS400'chaine = %SCANRPL(' ' : '' : chaine); // chaine = 'AS400AS400AS400' - Trouver le programme appelant dans un RPG
Permet dans un RPG d’identifier son programme appelant. Cela peut servir par exemple pour conditionner certaines actions ou laisser une trace dans un fichier log.
en SQLRPGLE :
dcl-ds N PSDS;
nom_du_pgm CHAR(10) POS(1);
end-ds;
dcl-s appelant char(10);
EXEC SQL
SELECT program_name INTO :appelant
FROM TABLE(stack_info('*'))
WHERE program_name not in (' ' , :nom_du_pgm)
AND ordinal_position <
( SELECT ordinal_position FROM TABLE(stack_info('*')) WHERE
program_name=:nom_du_pgm LIMIT 1)
LIMIT 1;Explications :
stack_infopermet de récupérer la pile de programme en cours. Le SQL proposé identifie dans la pile le programme au dessus du programme en cours. - Trouver le numéro du jour de la semaine sans calendrier
Permet d’affecter à la variable jour le numéro du jour de la semaine du jour comme suit :
1:Lundi 2:Mardi 3:Mercredi 4:Jeudi 5:Vendredi 6:Samedi 7:Dimanche
(et sans s’appuyer sur un calendrier!)
en SQLRPGLE :EXEC SQL
SET :jour= (CASE WHEN DAYOFWEEK(CURRENT_DATE) = 1 THEN 7 ELSE DAYOFWEEK(CURRENT_DATE)-1 END);Explications : la fonction SQL DAYOFWEEK permet de récupérer le numéro de jour d’une date dans sa numérotation anglaise (1:Dimanche 2:Lundi 3:Mardi …) d’où le dayofweek()-1
- Récupérer la date du au format AAAAMMJJ
Free RPG :
dcl-s dateDuJour char(8);
dateDuJour = %char(%date():*ISO0);