Gaia
  • La société
  • Expertises
  • Centre de services
  • Produits
    • G-Remote
    • G-EIM
    • Gitit
  • Ressources
  • Contact
  • Dispositifs IA
  • Blog
  • Volubis
  • Menu Menu
  • Lien vers X

Archive pour la catégorie : RPG Free

Vous êtes ici : Accueil1 / Développement2 / RPG Free
Analyse de Données, Développement, RPG Free, SQL_DB2Interprétation SQLCODE et SQLSTATE

Par exemple, vous utilisez SQL Error Logging Facility (SELF).

Vous voulez analyser les erreurs générées

Les erreurs sont stockées dans la vue SQL_ERROR_LOG de QSYS2

Vous avez une zone LOGGED_SQLCODE et une LOGGED_SQLSTATE qui contiennent le SQLCODE et le SQLSTATE de l’erreur

Vous voulez connaitre l’explication sur l’erreur SQL, vous avez des fonctions table SQLCODE_INFO et SQLCODE_STATE qui interprètent ce code

exemple :

SELECT LOGGED_SQLCODE,
STATEMENT_TEXT,
STATEMENT_OPERATION_DETAIL,
PROGRAM_LIBRARY,
PROGRAM_NAME
FROM QSYS2.SQL_ERROR;

Ajouter la Fonction table

SELECT LOGGED_SQLCODE,
(SELECT Message_text
FROM TABLE (
SYSTOOLS.SQLCODE_INFO(LOGGED_SQLCODE)
)) AS SQLCODE_TEXT,
STATEMENT_TEXT,
STATEMENT_OPERATION_DETAIL,
PROGRAM_LIBRARY,
PROGRAM_NAME
FROM QSYS2.SQL_ERROR;

Vous pouvez le faire sur le SQLSTATE ou sur le SQLCODE

Autre exemple, dans une programme RPGLE vous pouvez faire ceci par exemple

W_Text_sql char(512) ;
W_sqlcode like(sqlcode) ;

// traitement des erreurs SQL

if sqlcode <> 0;
w_sqlcode = sqlcode;
exec sql
// calcul du nombre de job à supprimer
SELECT Message_text into :W_Text_sql
FROM TABLE (
SYSTOOLS.SQLCODE_INFO(:w_sqlcode))
;
// Ecriture message dans la log
snd-msg (W_Text_sql) ;
endif ;

Plus d’informations ici

https://www.ibm.com/docs/en/i/7.6.0?topic=services-sqlcode-info-table-function
https://www.ibm.com/docs/en/i/7.6.0?topic=services-sqlstate-info-table

Rappel

il est important de traiter les erreurs SQL sur chaque instruction

7 août 2026/par Pierre-Louis BERTHOIN
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png 600 600 Pierre-Louis BERTHOIN /wp-content/uploads/2017/05/logogaia.png Pierre-Louis BERTHOIN2026-08-07 14:41:272026-08-07 14:48:10Interprétation SQLCODE et SQLSTATE
RPG Free, Securité, SQL_DB2Fonction QCMDEXC dans un programme SQLRPGLE

Par exemple, vous voulez créer une commande qui suppriment les travaux d’un utilisateur avec des noms dupliqués ce que ne permet pas la Commande ENDJOB nativement.

Vous choisissez de le faire en SQLRPGLE, vous avez la fonction table QSYS2.ACTIVE_JOB_INFO qui va permettre de trouver les travaux à supprimer

Exemple :

Pour savoir le nombre de travaux à supprimer

dcl-s w_cnt int(10);

P_jobn = ‘QHSTB’ ;
P_user = ‘PLB’;

exec sql
SELECT COUNT(*)
INTO :w_cnt
FROM TABLE (
QSYS2.ACTIVE_JOB_INFO(JOB_NAME_FILTER => :p_jobnm)
) A
WHERE A.JOB_USER = :p_user ;

Remarque
Vous pouvez indiquer le nom du job dans le filtre et l’utilisateur dans la clause where de sélection

Maintenant pour agir vous devez utiliser la fonction QCMDEXC

SELECT QCMDEXC(‘ENDJOB JOB(‘ concat trim(A.JOB_NAME) concat ‘) OPTION(*IMMED)’)
FROM TABLE (
QSYS2.ACTIVE_JOB_INFO(JOB_NAME_FILTER => :P_jobn)
) A
WHERE A.JOB_USER = :p_user ;

Cette commande marche dans ACS par exemple, ou ajoutant un create table as dans un RUNSQL ou un RUNSQLSTM;

Le probléme de cette solution en RPGLE est qu’elle va vous obliger à avoir un curseur
soit dans le RPGLE
soit en faisant du Dynamic Compound Statement (Compile de code SQL à la volée)

Voici une astuce qui va permettre d’éviter le curseur

exec sql
SELECT COUNT(*) INTO :w_cnt
FROM TABLE(QSYS2.ACTIVE_JOB_INFO(
JOB_NAME_FILTER => :p_jobnm)) AS A
WHERE A.JOB_USER = :p_user
AND QSYS2.QCMDEXC(
‘ENDJOB JOB(‘ CONCAT TRIM(A.JOB_NAME)
CONCAT ‘) OPTION(*IMMED)’
) = 1;

On va utiliser le QCMDEXC dans la clause where
En effet cette fonction renvoie 1 quand c’est ok

Conclusions :

C’est simple et efficace

Mais attention à la sécurité et l’injection de code par exemple avec une clause where paramétrable qui peut permettre de passer n’importe quelle commande ?

Astuce :

Vous pouvez faire une commande qui lancera votre programme

CMD PROMPT(‘Arrêter plusieurs Travaux’)

PARM KWD(JOBNM) TYPE(*NAME) LEN(10) MIN(1) +
PROMPT(‘Travail’)

PARM KWD(USER) TYPE(*NAME) LEN(10) MIN(1) +
PROMPT(‘Utilisateur’)

7 août 2026/par Pierre-Louis BERTHOIN
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png 600 600 Pierre-Louis BERTHOIN /wp-content/uploads/2017/05/logogaia.png Pierre-Louis BERTHOIN2026-08-07 08:29:462026-08-07 08:29:48Fonction QCMDEXC dans un programme SQLRPGLE
Administration, Développement, Organisation, RPG FreePrésentation RPGUNIT

Vous avez tous entendu parlé de entendu RPGUNIT

C’est un projet qui a eu plusieurs Vies, il existe même un plugin RDI et une extension vscode

C’est un projet qui permet de faire des tests unitaires sur des fonctions ILE

Il est basé sur les « assertions »

En informatique c’est une vérification intégrée dans le code qui s’assure qu’une condition spécifique est vraie à un moment donné de l’exécution du programme

Exemple :
2+2 ca doit faire 4

https://fr.wikipedia.org/wiki/Assertion

Voici un petit exemple

D’abord vous devez installer une version de la bibliothèque RPGUNIT sur votre systéme, cette bibliothèque contient le Framework qui va permettre de mettre en œuvre vos tests

Vous devrez avoir un programme service et connaitre la fonction à tester

Vous allez créer un programme de service spécifique qui va créer des surcouche à vos fonction

Exemple :
Fonction calcul dans votre application deviendra Fonction test_calcul dans le programme de service RPGUNIT

Votre programme CALCUL ici dans la bibliothèque DEMOUNIT

**free

ctl-opt nomain;

dcl-proc Addition export;

   dcl-pi *n int(10);
      a int(10) const;
      b int(10) const;
   end-pi;

   return a + b;

end-proc;

Génération de votre programme de service

CRTRPGMOD MODULE(DEMOUNIT/CALCUL)
SRCFILE(DEMOUNIT/QRPGLESRC)

CRTSRVPGM SRVPGM(DEMOUNIT/CALCUL)
MODULE(DEMOUNIT/CALCUL)
EXPORT(*ALL)

Vous devrez coder un programme de service RPGUNIT qui ressemblera à ca

Une hypothèse avec un cas vrai et une erreur

**free
ctl-opt nomain;
/include RPGUNIT/QINCLUDE,ASSERT


dcl-pr Addition int(10);
   a int(10);
   b int(10);
end-pr;


dcl-proc testAddition export;

   iEqual(
      5 :
      Addition(2:3)
   );

end-proc;
// Test volontairement en erreur
dcl-proc testErreur export;

   iEqual(
       10 :
       Addition(2:3)
   );

Pour générer votre programme

CRTRPGMOD MODULE(DEMOUNIT/TESTCALC)
SRCFILE(DEMOUNIT/QRPGLESRC)

CRTSRVPGM SRVPGM(DEMOUNIT/TESTCALC)
MODULE(TESTCALC)
BNDSRVPGM(DEMOUNIT/CALCUL RPGUNIT/RUTESTCASE)
EXPORT(*ALL)

ou par RPGUNIT/RUCRTRPG , mais attention au liage ???

Vous devrez ensuite lancer le contrôle par la commande
==>RPGUNIT/RUCALLTST TESTCALC

Vous obtenez un spool RPGUNIT

Exemple :

 *** Tests of TESTCALC ***                                   
 Date        : 2026-07-23 / 15:41:45                         
 Job         : 935696/PLB/QPADEV002D                         
 User        : PLB                                           
 iRPGUnit    : v6.0.0.v                                      
 IBM i       : V7R6M0                                        
 Cur. library: PLB                                           
 Library list:   10 RPGUNIT        60 OUTILS                 
                 20 DEMOUNIT       70 TOOLS                  
                 30 QGPL                                     
                 40 QTEMP                                    
                 50 EXPLOIT                                  
 TESTERREUR - FAILURE                                        
 Expected 10, but was 5.                                     
   TESTERREUR (TESTCALC->TESTCALC:888)                       
 Expected:        1 '10'                                     
 Actual:          1 '5'                                      
 -----------------------                                     
 FAILURE. 3 test cases, 2 assertions, 1 failure, 0 error. 

ici on a bien validé nos 2 caseq

Les sources et outil de référence se trouvent ici

https://irpgunit.sourceforge.io/
https://github.com/Tools-400/irpgunit

Remarque :

Vous avez pouvez faire des choses plus évoluées et VSCODE vous offre un assistant pour générer le programme RPGUNIT de Test, mais je pense qu’il est important de comprendre ce qu’on fait

Les assertions sont inclues en standard dans la TR2 en V7R6 pour le RPGLE

https://www.ibm.com/support/pages/node/7276258

Site pour les extensions

iRPGUnit Plug-in Update Site RDi 9.6.0.13+

https://tools-400.github.io/irpgunit/update-site/eclipse/rdi8.0

Merci à Florian pour son aide !

24 juillet 2026/par Pierre-Louis BERTHOIN
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png 600 600 Pierre-Louis BERTHOIN /wp-content/uploads/2017/05/logogaia.png Pierre-Louis BERTHOIN2026-07-24 09:39:252026-07-24 11:25:54Présentation RPGUNIT
Développement, RPG FreeEnvoyer un message en RPGLE

On a parfois besoin d’envoyer pour différentes raisons des messages en RPGLE

Voici un tableau comparatif des solutions existantes :

Conclusions

Pour un développement moderne sur IBM i 7.5 ou plus voici nos préconisations :

SND-MSG pour les messages applicatifs en RPGLE (notamment *ESCAPE, *DIAG, *STATUS) , pour du SQLRPGLE il remplace avantageusement le dsply


QSYS2.SEND_MESSAGE lorsqu’on est principalement en SQL ou SQLRPGLE, il permet par exemple de choisir une file de messages


QSYS2.WRITE pour remplacer les DSPLY de débogage par des traces propres dans la joblog


QMHSNDPM pour les développements avancés , par exemple pour échanger vers des files de messages programmes

Remarques

Pour des actions particulières, par exemple refus de trigger, erreur de données dans un cgi, il peut être plus judicieux de créer un fichier de log.
Il devra contenir les informations sur la nature de l’erreur et le contexte d’exécution à minima user, job, date heure, programme

18 juillet 2026/par Pierre-Louis BERTHOIN
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png 600 600 Pierre-Louis BERTHOIN /wp-content/uploads/2017/05/logogaia.png Pierre-Louis BERTHOIN2026-07-18 10:45:332026-07-19 20:10:04Envoyer un message en RPGLE
RPG FreeTest Basic IA et RPGLE

On attend beaucoup de BOB, mais que font les autres IA aujourd’hui, par exemple sur du RPGLE sur IBMi

j’ai décider de faire un petit challenge Gemini, Coplilot, ChatGPT, Grok

J’ai volontairement fait 3 erreurs dans mon code
w_bool non déclaré
endif manquant
fin de programme manquante

*free ctl-opt DFTACTGRP(NO) ;
dcl-s texte char(10 ) ;
dcl-s bool ind ;
// ecriture
if w_bool ;
texte = 'Texte' ;
dsply ('texte ' + texte) ;

Je n’ai pas fourni de contexte
je n’ai pas fourni le résultat de compilation
je n’ai aucun abonnement, j’ai utilisé une version grand public pour les 3 IA

Voici mon prompt, il est volontairement très basic

« Ce programme ne compile pas, SVP, peux tu m’indiquer ou est le probléme « 

*free ctl-opt DFTACTGRP(NO) ;
dcl-s texte char(10 ) ;
dcl-s bool ind ;
// ecriture
if w_bool ;
texte = ‘Texte’ ;
dsply (‘texte ‘ + texte) ;

Je n’ai pas mis l’analyse que les IA ont rendues qui étaient pertinentes dans les 3 cas

Voici le résultat quelles ont produit

Gemini

Il a ajouter un return

*free ctl-opt DFTACTGRP(NO);

dcl-s texte char(10);
dcl-s bool ind;

// Initialisation (pour le test)
bool = *on;

if bool; // Utilisation du bon nom de variable
texte = 'Texte';
dsply ('texte ' + texte);
endif; // Ne pas oublier de fermer le IF
*inlr = *on;
return;

Chatgpt

*free ctl-opt dftactgrp(no);

dcl-s texte char(10);
dcl-s bool ind inz(*on);

// écriture
if bool;
texte = 'Texte';
dsply ('texte ' + texte);
endif;

*inlr = *on;

Copilot

*free ctl-opt dftactgrp(no);

dcl-s texte char(10);
dcl-s bool ind;

// ecriture
if bool;
texte = 'Texte';
dsply ('texte ' + texte);
endif;

*inlr = *on;
return;

Grok

un %char sur le texte qui ne sert à rien

**free
ctl-opt                      
  dftactgrp(*no) ;             
dcl-s texte   char(10) ;       
dcl-s bool    ind    ;         
// Initialisation
bool = *on ;                   // ← Ajout nécessaire !
// Ecriture                   
if bool ;                     
  texte = 'Texte' ;            
  dsply ('texte  ' + %char(texte)) ;
endif ;
*inlr = *on ;

Conclusion :

Les 4 IA ont produit un code qui compile, et une analyse pertinente
Avec de IA entrainées et spécialisées, on doit pouvoir faire des choses étonnantes

1 février 2026/par Pierre-Louis BERTHOIN
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png 600 600 Pierre-Louis BERTHOIN /wp-content/uploads/2017/05/logogaia.png Pierre-Louis BERTHOIN2026-02-01 10:58:592026-02-16 12:00:19Test Basic IA et RPGLE
Développement, RPG Free, VSCodeComprendre l’impact du CCSID de votre source

Vous avez vos sources coté IBMi qui sont le plus souvent stockés dans des fichiers sources QRPGLESRC et le CCSID est à 1147 (je reviens pas sur les dangers du 65635)

Vous décidez de placer, vos sources dans l’IFS et vous décidez d’adopter un (CCSID UTF-8 recommandé) ,voir Windows 1252.

C’est le sens de l’histoire pour giter par exemple

Le CCSID du source a un impact sur les constantes de votre programme RPGLE, à la compilation on va voir un exemple :

Les constantes étant basées sur le CCSID du source par défaut

Voici un programme

**free                                                                 
ctl-opt dftactgrp(*no)                                                 
  //    ccsid(*exact)    // << clé : figer au CCSID de                   
  ;                                                                    
dcl-c titre 'Tarif semaine dès 4 jours ?  ' ;   // Constante           
dcl-s mots char(06) dim(3) ctdata perrcd(1);    // tableau chargé à la 
dcl-ds ds_texte    ;                            // tableau de constante
      *N Char(06) Inz('école' ) ;       //                             
      *N Char(06) Inz('garçon') ;       //                             
      *N Char(06) Inz('café ' ) ;       //                             
      texte   char(06) dim(3) pos(1) ;                                 
end-ds;                                                                
dcl-s i     int(10);                                                   
// Affichage Résultat                                                  
dsply ('Constante : ' + titre);                                        
for i = 1 to %elem(texte) ;                                            
  dsply ('Texte    : ' + texte(i));                                    
endfor; 
for i = 1 to %elem(mots);                     
  dsply (' CTDATA   : ' + mots(i));           
endfor;                                       
*inlr = *on;                                  
** CTDATA mots (3 lignes, codées avec accents)
école                                         
garçon                                        
café

Coté IBMi

Avec un ccsid 1147

CRTBNDRPG PGM(GDATA/SRCCCSID)
SRCFILE(GDATA/QRPGLESRC)

Vous obtenez ceci

Coté IFS

Avec un ccsid UTF-8

CRTBNDRPG PGM(GDATA/SRCCCSID)      

          SRCSTMF(‘SRCCCSID.RPGLE’)

Vous obtenez ceci

Vous perdez les caractères spéciaux

Vous avez une option de compile TGTCCSID qui fixe le CCSID à utiliser

donc on ajoute l’option

CRTBNDRPG PGM(GDATA/SRCCCSID)      

          SRCSTMF(‘SRCCCSID.RPGLE’)

          TGTCCSID(1147)    

L’affichage est correct

Conclusion :

Vous pouvez également utiliser *JOB dans la valeur de TGTCCSID(), à ce moment la vous aurez le même comportement dans les 2 cas si votre job est en 1147.

On expliquera ccsid(*exact) dans un autre post

t

9 janvier 2026/par Pierre-Louis BERTHOIN
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png 600 600 Pierre-Louis BERTHOIN /wp-content/uploads/2017/05/logogaia.png Pierre-Louis BERTHOIN2026-01-09 11:42:362026-01-24 20:23:14Comprendre l’impact du CCSID de votre source
Administration, Analyse de Données, Développement, RPG Free, SQL_DB2SQL : « dump » des enregistrements d’une table

Suite à des demandes multiples, je propose une implémentation de « DUMP » des enregistrements d’une table (plutôt d’un objet *FILE / PF-DTA, que ce soit un PF ou une table).

L’idée est d’obtenir u script SQL contenant les instructions INSERT permettant de reproduire les données dans une autre base.

A l’image de la commande mariadb-dump par exemple (https://mariadb.com/docs/server/clients-and-utilities/backup-restore-and-import-clients/mariadb-dump). C’est un moyen commun de faire des sauvegarde/restauration de la base pour ces technologies.

DMPSQL

Oui, je ne détaille pas ici le processus de mise à jour, c’est classique : téléchargement des images et clés sur ESS, PRUV pour les contrôle etc …

Le fichier SQLSAMPLE/EMPLOYEE est ici produit par :

CALL QSYS.CREATE_SQL_SAMPLE ('SQLSAMPLE')

Cette procédure vous permet de créer et recréer des bases de données à des fins d’exemple et de tests.

Contenu du fichier :

Il s’agit d’une table très classique, représentative de la plupart des données dans nos applications.

Exemple d’usage :

DMPSQL FILE(SQLSAMPLE/EMPLOYEE)
SQLSCRIPT('/home/NB/employee.sql')

Le résultat de notre commande :

Le fichier est en UTF-8 afin de permettre la gestion de l’ensemble des caractères usuels.

Le code est disponible ici : https://github.com/FrenchIBMi/Outils/tree/master/DMPSQL

Usage ?

Cela permettait de répondre à plusieurs demandes.

Premièrement, la réplication de données sans utiliser les commandes de sauvegarde/restauration. Ces dernières nécessitent des droits élevés, alors qu’ici nous ne faisons que manipuler de la donnée.

Deuxièmement, dans le cadre de traitement de journaux (initialement en vue d’une fonction de type CDC), pour permettre d’isoler un enregistrement que l’on souhaite répliquer (avec ou sans transformation) dans une autre table.

Vous trouverez certainement d’autres usages !

Limites

Le code est fourni « as is », pour démonstration.

Quelques limites d’usage actuellement

  • Types de colonnes non supportées actuellement : CLOB, BLOB, DATALINK, XML, GRAPHIC, VARGRAPHIC, {VAR}CHAR CCSID 65535
  • Pas plus de 16Mo par enregistrement
  • On ne gère pas les alias, partitions, IASP
  • 250 colonnes maximum
  • En cas de multi-membres, seul le premier membre est traité

On peut bien évidemment ajouter de nouvelles fonctionnalités !

N’hésitez pas à donner un feedback, améliorer le code

2 septembre 2025/par Nathanaël Bonnet
https://www.gaia.fr/wp-content/uploads/2017/02/team1.png 600 600 Nathanaël Bonnet /wp-content/uploads/2017/05/logogaia.png Nathanaël Bonnet2025-09-02 09:50:002025-09-01 12:33:38SQL : « dump » des enregistrements d’une table
Développement, RDI, RPG FreeV7R6 , date sur 6 positions en RPG

Vous avez un nouveau paramètre sur les commandes CRTBNDRPG ou CRTRPGMOD DATEYY( )

DATE WITH 2-DIGIT YEARS . . . . DATEYY( *ALLOW)

Ce paramètre n’est pas encore documenté dans l’aide mais vous comprenez , que c’est pour les dates sur 6 caractères

Rappel sur les dates à 6 , vous avez un point de bascule:
40 – 99 : Le siècle est supposé être « 19 »
00 – 39 : Le siècle est supposé être « 20 »

C’est dans 14 ans

Pour ce paramètre, DATEYY vous avez 3 valeurs possibles

DATEYY(*ALLOW) : autorise tous les formats de date, autrement dit, n’effectue aucune validation. DATEYY(WARN) : si une date est détectée, elle est considérée comme une année sur deux caractères, une erreur de compilation de niveau 10 est générée.
DATEYY(*NOALLOW) : si une date pourrait être détectée, la compilation est renvoyée avec une erreur de niveau 30. La valeur par défaut est « *ALLOW ».

il est conseillé de compiler avec *WARM, vous aurez une liste des problèmes potentiels

Ce message apparaitra

Msg id Sv Number Seq Message text
*RNF0201 10 5 002300 WARNING: A DATE WITH 2 DIGITS FOR THE YEAR ONLY SUPPORTS
THE YEARS 1940 TO 2039. REASON CODE: xxxxxx.

Rappel:
Pensez dans SQL à bien utiliser des formats sur 8 *ISO par exemple pour tous vos calculs

Exec SQL
Set Option
Datfmt = *iso ;

18 août 2025/par Pierre-Louis BERTHOIN
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png 600 600 Pierre-Louis BERTHOIN /wp-content/uploads/2017/05/logogaia.png Pierre-Louis BERTHOIN2025-08-18 16:42:512025-08-20 11:32:37V7R6 , date sur 6 positions en RPG
Développement, RPG Free, SecuritéChanger le groupe d’activation d’un programme

Vous voulez changer le groupe d’activation d’un programme. Contrairement à une idée reçue, on peut dans certains cas renommer le groupe d’activation d’un programme ILE

Si vous créez un programme

CRTPGM

Ou 

CRTBNDRPG

Vous allez indiquer le groupe d’activation d’exécution de votre programme

Vous ne pouvez pas changer le groupe d’activation par CHGPGM !

Mais vous pouvez le faire par la commande UPDPGM 

avant ==> DSPPGM AATSTRET

Attribut du groupe d’activation  . . . . . . . :   PLB1

UPDPGM PGM(AATSTRET) MODULE(*NONE) ACTGRP(PLB45)              
Valeurs des paramètres AUT et USRPRF ignorées.                
L’objet remplacé AATSTRET type *PGM a été déplacé dans QRPLOBJ.
Programme AATSTRET créé dans la bibliothèque GDATA.            
Programme AATSTRET mis à jour dans GDATA.   

après  ==>DSPPGM AATSTRET

Attribut du groupe d’activation  . . . . . . . :   PLB45                   

la seule limitation est que le groupe doit être nommé

Pour interdir ce changement à l’assemblage vous devez indiquer

CRTPGM …  ALWUPD(*NO) 

PS :    

Cette option n’existe pas sur le CRTBNDRPG donc modifiable par défaut 

Vous devez avoir le droit *change sur programme.

Rappel:

En batch on essaye d’avoir le premier programme qui crée le groupe d’activation et les programmes appelés s’exécuteront en *caller

Dans les autres cas, webservice, interactif, etc il peut être préférable d’avoir un groupe d’activation par programme

Pour analyser les groupes actifs, vous pouvez utiliser le service : QSYS2.ACTIVATION_GROUP_INFO

— Liste des groupes par Travail
SELECT A.JOB_NAME,
       count(*)
    FROM TABLE (
             QSYS2.ACTIVE_JOB_INFO()
         ) AS A
         LEFT JOIN TABLE (
                 QSYS2.ACTIVATION_GROUP_INFO(JOB_NAME => A.JOB_NAME)
             ) AS G
             ON 1 = 1
    group by A.JOB_NAME         
        ORDER BY count(*) desc
            ;

13 août 2025/par Pierre-Louis BERTHOIN
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png 600 600 Pierre-Louis BERTHOIN /wp-content/uploads/2017/05/logogaia.png Pierre-Louis BERTHOIN2025-08-13 11:29:572025-08-19 13:54:43Changer le groupe d’activation d’un programme
Développement, RPG Free, SQL_DB2Gestion du SQLCODE dans un SQL embarqué

En SQL embarquée la gestion des erreurs est différente par rapport à un RPGLE classique.


Essentiellement sur 2 points


1) Ca ne plante pas
Vous pouvez donc avoir des erreurs silencieuses
Il est très important de traiter les SQLCODE
Même si vous pensez ne pas en avoir besoin
Les 3 lignes suivantes peuvent être ajoutées sans risque !

EXEC SQL ... ;
IF SQLCODE <> 0;
DSPLY ('nompgm' + ' : ' + %CHAR(SQLCODE) ;
ENDIF;


Permettra d’avoir un message dans la log qui peut vous aider en cas de probléme.

2) On n’a le résultat de la dernière instruction dans le SQLCODE.

Le risque est donc sur une boucle, il est possible que le SQLCODE soit parasité par une autre requête SQL dans une autre fonction par exemple

dou sqlcode <> 0                    ;
  exec sql ... ;                                         
  if sqlcode <> 0                   ;
    leave                           ;
  endif                             ;
enddo                               ;

Pour éliminer ce probléme vous devez sauvegarder votre SQLCODE dans une variable de travail

Votre boucle deviendra

// Déclaration de la variable de travail ! 
DCL-S  W_SQLCODE like SQLCODE; 
//
dou w_sqlcode <> 0                    ;
  exec sql ... ;                                         
  if sqlcode <> 0                   ;
    leave                           ;
  endif                             ;
  W_SQLCODE = SQLCODE                 ;
enddo  

Ainsi vous êtes sur de tester le bon SQLCODE

Remarque :
Pour ceux qui utilisent le sqlstate, la remarque est la même.
Vous pouvez être plus précis que <> 0 ;

Rappel :
en dessus de 0 c’est des avertissements
en dessous c’est des erreurs
par exemple if sqlcode < 0 ; traitera les erreurs uniquement

12 juillet 2025/par Pierre-Louis BERTHOIN
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png 600 600 Pierre-Louis BERTHOIN /wp-content/uploads/2017/05/logogaia.png Pierre-Louis BERTHOIN2025-07-12 09:07:372025-07-12 09:09:04Gestion du SQLCODE dans un SQL embarqué
Page 1 sur 212
Search Search

Nos Formations

Formations Volubis

Articles récents

  • Répondre à un message en SQL
  • Acces Client Solutions : mises à jour d’août 2026 (1.1.9.14 et 1.1.9.15)
  • La commande intégrée ‘/init’ de Bob
  • Fonctions et procédures SQL Surchargées
  • Interprétation SQLCODE et SQLSTATE

Archives

  • août 2026
  • juillet 2026
  • juin 2026
  • mai 2026
  • avril 2026
  • mars 2026
  • février 2026
  • janvier 2026
  • décembre 2025
  • novembre 2025
  • octobre 2025
  • septembre 2025
  • août 2025
  • juillet 2025
  • juin 2025
  • mai 2025
  • avril 2025
  • mars 2025
  • février 2025
  • janvier 2025
  • décembre 2024
  • novembre 2024
  • octobre 2024
  • septembre 2024
  • août 2024
  • juillet 2024
  • juin 2024
  • mai 2024
  • avril 2024
  • mars 2024
  • février 2024
  • janvier 2024
  • décembre 2023
  • novembre 2023
  • octobre 2023
  • septembre 2023
  • août 2023
  • juillet 2023
  • juin 2023
  • mai 2023
  • avril 2023
  • mars 2023
  • février 2023
  • janvier 2023
  • décembre 2022
  • novembre 2022
  • octobre 2022
  • septembre 2022
  • août 2022
  • juillet 2022
  • juin 2022
  • mai 2022
  • avril 2022
  • mars 2022
  • février 2022
  • janvier 2022
  • décembre 2021
  • novembre 2021
  • octobre 2021
  • septembre 2021
  • août 2021
  • juillet 2021
  • juin 2021
  • mai 2021
  • avril 2021
  • mars 2021
  • février 2021
  • janvier 2021
  • décembre 2020
  • novembre 2020
  • octobre 2020
  • septembre 2020
  • août 2020
  • juillet 2020
  • juin 2020
  • mai 2020
  • avril 2020
  • mars 2020
  • janvier 2020
  • décembre 2019
  • novembre 2019
  • octobre 2019
  • septembre 2019
  • août 2019
  • juillet 2019
  • juin 2019
  • mai 2019
  • mars 2019
  • février 2019
  • janvier 2019
  • novembre 2018
  • octobre 2018
  • juillet 2018
  • juin 2018
  • mai 2018
  • avril 2018
  • mars 2018
  • février 2018
  • janvier 2018
  • décembre 2017
  • octobre 2017
  • septembre 2017
  • août 2017
  • juillet 2017
  • février 2017

Catégories

  • 400iday
  • Access Client Solutions
  • Administration
  • Analyse de Données
  • API
  • Bob
  • Commandes
  • Développement
  • DSPF
  • Fonctions Géospatiales
  • hardware
  • IA
  • Navigatorfori
  • News
  • Non classé
  • Open source
  • Organisation
  • Personal
  • RDI
  • RPG Free
  • Securité
  • SQL_DB2
  • Uncategorized
  • VSCode
©Copyright. GAIA MINI SYSTEMES | Tous droits réservés | Mentions Légales | Wovenlinks, agence web
  • La société
  • Expertises
  • Centre de services
  • Produits
  • Ressources
  • Contact
  • Dispositifs IA
  • Blog
  • Volubis
Faire défiler vers le haut Faire défiler vers le haut Faire défiler vers le haut
Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Acceptez-vous l'utilisation des cookies ?