Dans le développement sur IBM i, l’utilisation de la commande CRTSQLRPGI est incontournable pour intégrer des instructions SQL dans vos programmes RPG. Cependant, un détail souvent négligé peut entraîner des échecs de compilation difficiles à diagnostiquer : le traitement des directives de compilation.
Comprendre le processus de CRTSQLRPGI
Par défaut, le précompilateur SQL examine votre source, identifie les instructions SQL, et insère le code RPG nécessaire à leur exécution. Une fois cette étape terminée, la source mise à jour est transmise au compilateur ILE RPG pour le traitement final.
Cependant, le précompilateur SQL ne sait pas interpréter les directives de compilation telles que /COPY, /INCLUDE, /DEFINE ou /IF. Cela peut poser problème si votre programme s’appuie sur ces directives pour déclarer des variables ou inclure du code.
Les erreurs suivantes sont alors fréquentes :
- RNF7030 : Le nom ou l’indicateur n’est pas défini ;
- RNF7503 : L’expression contient un opérande qui n’est pas défini.
La solution : RPGPPOPT(*LVL2)
Pour éviter ces erreurs, il suffit de spécifier l’option *RPGPPOPT(LVL2) dans votre commande CRTSQLRPGI. Cette option indique au compilateur ILE RPG de traiter les directives de compilation avant que le précompilateur SQL n’intervienne. Résultat : toutes les variables nécessaires à vos instructions SQL sont définies et disponibles.
Pourquoi passer à RPGPPOPT(*LVL2) ?
La valeur par défaut actuelle de RPGPPOPT est *NONE, mais il n’existe aucun inconvénient à utiliser *LVL2. Cette configuration garantit que toutes vos directives de compilation sont correctement interprétées, éliminant ainsi les erreurs potentielles liées à des variables non définies.
Vous pouvez même définir cette option comme valeur par défaut dans vos processus automatisés de compilation : https://www.ibm.com/support/pages/resolving-crtsqlrpgi-fails-rnf7030rnf7503-using-rpgppoptlvl2
Exemple :
Voici mon code avec un /include

Essayons une compilation avec l’option RPGPPOPT réglée sur *NONE.
Cela entraînera une erreur indiquant que la variable NOMPRO n’est pas définie.
Maintenant , essayons avec l’option RPGPPOPT à *LVL2
puis compilons
la compilation passe et le programme fonctionne
Partagez votre expérience : avez-vous rencontré des problèmes avec /INCLUDE ou /COPY ? Utilisez-vous déjà cette option ? Vos retours sont les bienvenus !
Merci à Lionel KIEFFER pour cette astuce 🙂


