, Mettez des relations dans votre DB

Vous êtes en train d’analyser votre data base et vous voulez mettre en place des relations sur celle-ci.

Je vais vous re présenter les contraintes d’intégralité référentielles
et plus précisément pour voir et comprendre les données en attente de validation .

Voici un petit exemple pour illustrer :
Considérons un fichier pour les employés et un pour les services services :


Création du fichier des services
CREATE OR REPLACE TABLE GDATA.CST2 (
SERVICE CHAR(3) CCSID 1147 NOT NULL DEFAULT  » ,
LIBEL CHAR(30) CCSID 1147 NOT NULL DEFAULT  » ,
CONSTRAINT GDATA.Q_GDATA_CST2_SERVICE_00001 PRIMARY KEY( SERVICE ) )

RCDFMT CST2F ;


1/ Création du fichier des employés avec une contrainte

CREATE OR REPLACE TABLE GDATA.CST1 (

NUMERO DECIMAL(5, 0) NOT NULL DEFAULT 0 ,
NOM CHAR(30) CCSID 1147 NOT NULL DEFAULT  » ,
PRENOM CHAR(30) CCSID 1147 NOT NULL DEFAULT  » ,
SERVICE CHAR(3) CCSID 1147 NOT NULL DEFAULT  » ,
PRIMARY KEY( NUMERO ) ,
CONSTRAINT GDATA.Q_GDATA_CST1_SERVICE_00001
FOREIGN KEY( SERVICE )
REFERENCES GDATA.CST2 ( SERVICE )
ON DELETE NO ACTION
ON UPDATE NO ACTION )

RCDFMT CST1F ;

Vous pouvez ajouter la contrainte ultérieurement avec

  • la commande :

ADDPFCST FILE(GDATA/CST1)
TYPE(REFCST) KEY(SERVICE) PRNFILE(GDATA/CST2) PRNKEY(SERVICE) DLTRULE(NOACTION)
UPDRULE(*NOACTION)

  • le SQL

ALTER TABLE GDATA.CST1
ADD CONSTRAINT GDATA.Q_GDATA_CST1_SERVICE_00001
FOREIGN KEY( SERVICE )
REFERENCES GDATA.CST2 ( SERVICE )
ON DELETE NO ACTION
ON UPDATE NO ACTION ;

2/ Alimentation des données

Création des services

INSERT INTO GDATA/CST2 VALUES(‘COM’, ‘Comptabilité’)
INSERT INTO GDATA/CST2 VALUES(‘PRO’, ‘Production ‘)

Création des employés

INSERT INTO GDATA/CST1 VALUES(01, ‘Berthoin’, ‘Pierre-Louis’, ‘COM’)
INSERT INTO GDATA/CST1 VALUES(02, ‘Berthoin’, ‘Younes ‘, ‘PRO’)

Sur une insertion avec service inexistant, un message d’erreur est produit

INSERT INTO GDATA/CST1 VALUES(03, ‘Berthoin’, ‘Yasmine ‘, ‘CRP’)

ID message . . . . . . : SQL0530

Message . . . . : Opération non admise par la contrainte référentielle
Q_GDATA_CST1_SERVICE_00001 de GDATA.

Sur une suppression de service avec des employés liés, un message d’erreur est produit

DELETE FROM GDATA/CST2 WHERE SERVICE = ‘PRO’

ID message . . . . . . : SQL0532

Message . . . . : Suppression impossible à cause de la contrainte
référentielle Q_GDATA_CST1_SERVICE_00001 de GDATA.

Il est possible de désactiver la contrainte :

CHGPFCST FILE(GDATA/CST1)
CST(‘Q_GDATA_CST1_SERVICE_00001’)
STATE(*DISABLED)

Une fois les contrôles désactivés, les requêtes précédentes s’exécutent

DELETE FROM GDATA/CST2 WHERE SERVICE = ‘PRO’

INSERT INTO GDATA/CST1 VALUES(03, ‘Berthoin’, ‘Yasmine ‘, ‘CRP’)

Lorsqu’on remet la contrainte :

CHGPFCST FILE(GDATA/CST1)
CST(‘Q_GDATA_CST1_SERVICE_00001’)
STATE(ENABLED) CHECK(YES)

Les valeurs de clé de la contrainte référentielle sont incorrectes.
Vérification en instance pour le fichier CST1.

Si vous avez des anomalies, vous devez désactiver la contrainte :

CHGPFCST FILE(GDATA/CST1)
CST(‘Q_GDATA_CST1_SERVICE_00001’)
STATE(*DISABLED)

Pour voir les enregistrements en attente de validation :

DSPCPCST FILE(GDATA/CST1)
CST(‘Q_GDATA_CST1_SERVICE_00001’)
OUTPUT(*)

Pas de service SQL mais un peu d’astuce et c’est ok

Il suffit de chercher les employés avec un service inexistant

CREATE TABLE QTEMP.ATTENTES AS
(SELECT *
FROM GDATA.CST1 A
WHERE NOT EXISTS (
SELECT *
FROM GDATA.CST2 B
WHERE A.SERVICE = B.SERVICE
AND B.SERVICE IS NOT NULL))
WITH DATA;

Remarque :

Vous pouvez passer cette commande avant de mettre en œuvre votre contrainte !
Vous pourrez ainsi mettre des relations dans votre application sans risque

Vous pouvez ensuite utiliser, un outil de modélisation :

https://gitmind.com/fr/schema-base-donnees.html

Vous avez également des extensions dans Visual Studio Code

ou utiliser un simple Chatgpt avec un prompt du style :

« Peux tu me faire un schéma format PNG des relations de ma base de données avec les scriptes ci joint  »

FK Foreign key

PK Primary key

Rien de magique , mais si on peut renseigner et documenter sa base, c’est toujours ça de fait

, , Fichier SQLPRE de QTEMP

Vous avez des sources SQLRPGLE qui sont différents des tailles par défaut de 100

Vous pouvez avoir ce message à la compile RNF0733
C’est le fichier, QTEMP/QSQLPRE de pré-compilation qui est trop court QTEMP/QSQLPRE
Ce fichier est utilisé dans les commandes CRTBNDRPG , CRTRPGMOD, ou CRTSQLRPGI

Vous avez une variable d’environnement QIBM_RPG_PPSRCFILE_LENGTH qui permet de changer la valeur par défaut qui est de 112.
Elle doit avoir la longueur de votre donnée + 12
Exemple
SRCDTA = 140
Vous devrez indiquer 152

Pour ajouter la variable :

ADDENVVAR ENVVAR(QIBM_RPG_PPSRCFILE_LENGTH.)
VALUE(152)
LEVEL(*SYS)

*SYS pour l’ajouter à tout le système

Pour ne savoir plus ici

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

, , , Une commande méconnue FNDSTRPDM2

On utilise de moins en moins PDM et SEU, pour le remplacer par du RDI ou Visual studio code, ce qui est le sens de l’histoire, mais cette commande peut vous aider, surtout si vous ne disposez pas d’outils d’analyse (Arcad, X-Analysis, Grefer, etc…)

Cette commande permet de faire un FNDSTRPDM (option 25 dans la gestion des membres) sur une liste de fichiers sources, FNDSTRPDM étant limité à un seul fichier source par recherche

Vous devez définir la liste des fichiers à analyser
Pour ceci, vous avez un fichier modèle QAUOSR2 dans la bibliothèque QPDA
Il est conseillé de le dupliquer sous un nouveau nom dans votre bibliothèque

C’est un fichier source que vous pouvez éditer facilement par SEU, RDI, VSCODE, ou SQL

Il est composé de 3 zones de 10 caractères

Exemple :

Notre fichier s’appellera souvent FNDSTRPDM2 membre FNDSTRPDM2 et on choisira une bibliothèque.

£lib       £file      £member   
GDATA      QCLSRC     *ALL       
GDATA      QRPGLESRC  *ALL       
GDATA      QDDSSRC    *ALL       
GDATA      QCMDSRC    *ALL
GDATA      QSQLSRC    M* 


Dans les membres vous pouvez indiquer *ALL ou un nom générique

Vous pouvez ensuite lancer la commande de recherche avec le paramétrage que vous désirez

Exemple

FNDSTRPDM2 STRING(DCL)
FILE(GDATA/FNDSTRPDM2)
MBR(FNDSTRPDM2)
OPTION(NONE) PRTMBRLIST(YES)

Ici on a demandé une liste que vous retrouvez dans votre spool, c’est un fichier QPUOPRTF, il y en a un par fichier source

Exemple :

  Nb d'occurrences  . . :   102 
                                 
                          Création  Dernière modif              
  Membre      Type        Date      Date      Heure     Enreg   
  ----------  ----------  --------  --------  --------  ------- 
  AAAA        CLLE        01/07/21  15/01/24  15:28:17  0000006 
  AAAA2       CLLE        10/01/24  16/09/23  10:25:24  0000009 
  AAA1        CLLE        16/05/23  06/06/23  10:24:58  0000017 
  AADB        CLLE        02/01/24  02/01/24  10:59:24  0000005 
  AAPF2CL     CLLE        03/07/23  03/07/23  13:53:03  0000008  
            

Vous pouvez également demandé la liste des enregistrements comportant votre chaine, PRTRCDS(*ALL) vous obtenez également à une autre liste dans vos spools

Exemple :

 Membre  . . . . . . . :   AAAA2                                               
 Type  . . . . . . . . :   CLLE                                                
 Texte . . . . . . . . :   Liste des touches de fonction d'un RPG              
 Longueur d'enreg  . . :   92                                                  
     SEQNBR  *...+....1....+....2....+....3....+....4....+....5....+....6....+...
                          DCL                                                    
          4               DCL        VAR(&TXT) TYPE(*CHAR) LEN(80)               
                          DCL                                                    
          5               DCL        VAR(&id ) TYPE(*CHAR) LEN(7)                
 Nombre d'enregistrements explorés . . . . . . . . :   9                         
 Nombre d'enregistrements à trouver  . . . . . . . :   *ALL                      
 Nombre d'enregistrements trouvés  . . . . . . . . :   2                         
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _   F I N   D U   M E M B R E 

On rencontre 2 usages principalement

Pour rechercher dans tous les sources d’une bibliothèque

£lib       £file      £member   
GDATA      QCLSRC     *ALL       
GDATA      QRPGLESRC  *ALL       
GDATA      QDDSSRC    *ALL       
GDATA      QCMDSRC    *ALL 

Pour rechercher dans tous les sources RPGLE de plusieurs bibliothèques

£lib       £file      £member
GDATA      QRPGLESRC  *ALL   
GDATA1     QRPGLESRC  *ALL       
GDATA2     QRPGLESRC  *ALL       
GDATA3     QRPGLESRC  *ALL 

Remarques :

Vous pouvez facilement générer cette liste dynamiquement si vous le désirez en utilisant SQL et les vues de QSYS2.

Exemple :

INSERT INTO GDATA/FNDSTRPDM2 VALUES((select max(srcseq) + 1 from
gdata/fndstrpdm2), 0, ‘Biblio ‘ concat ‘ ‘ concat
‘Fichier ‘ concat ‘ ‘ concat ‘Membre ‘)

Il existe d’autres solutions pour scanner vos fichier sources, mais celle ci est simple à mettre à œuvre, et vous avez de grande chance d’avoir QPDA sur vos machines.

, Debug avec VSCode

La semaine dernière, Laurent revenait sur les possibilités de débogage avec RDi : https://www.gaia.fr/debug-rdi-conditionner-un-point-darret/

C’est donc l’occasion de voir ce que l’on peut faire maintenant avec VSCode côté débogage.

Nous partons donc du même exemple, même programme, on ne changera que le débogueur :

Considérons une table CLIENTS contenant les colonnes et lignes suivantes :

Le programme PROGTEST lit la tables CLIENTS et exécute la procédure traitement_CLIENTS pour chacun des clients de la table :

Prérequis

Pour déboguer par VSCode, vous devez installer l’extension « IBM i Debug »

Comme vous le voyez ici, cela nécessite des PTF côté serveur.

Côté IBM i, le déboguer ILE spécifique tourne dans PASE est nécessite un certificat pour garantir la confidentialité de la connexion.

L’assistant depuis VSCode permet d’effectuer automatiquement toutes ces actions :

Référence : https://halcyon-tech.github.io/docs/#/pages/developing/debug/debug?id=starting-to-debug

Une fois le service configuré et l’extension installée, il nous faut régler quelques options importantes.

Nous allons retrouver des options à deux endroits :

  • Au niveau de la connexion

Au niveau des options de l’extension :


Déboguer avec VSCode

Il y a plusieurs possibilités dans l’éditeur, nous en choisissons une.

Ouvrez le source du programme à déboguer (on parlera ILE plus tard) :

L’outil vous demande votre mot de passe sur l’IBM i pour valider votre profil, et prompte ensuite la commande d’appel du programme :

Vous basculez alors dans l’affichage du déboguer :

Voyons les outils :

  • affichage des variables

Affiche les variables locales (quand vous êtes dans une procédure, vous ne voyez que les variables locales de la procédures, pas les variables globales du module).

Vous pouvez copier les valeurs, les modifier, ajouter un guet

  • Guet (watch)

Affiche, et permet la saisie, de guets de variables.

  • Pile d’appel

Permet de voir la procédure en cours d’exécution :

L’ordre d’affiche est : procédure / module / programme (de service)

  • Points d’arrêt

Liste les points d’arrêt, permet la création de nouveaux points et la suppression :

  • Contrôle de l’avancement

Permet d’avancer dans le débogage :

Dans l’ordre :
  1. Avancer jusqu’au prochain point d’arrêt (équivalent F12 dans STRDBG)
  2. Avancer et entrer en débogage dans la procédure ou programme appelé (équivalent F22 dans STRDBG)
  3. Continuer jusqu’à ressortir de la procédure en cours
  4. restart : non supporté pour l’IBM i
  5. Arrêt du débogage (équivalent F3 dans STRDBG)
  • Editeur

Identification visuelle de la ligne en cours de débogage (non encore exécutée) :

Point d’arrêt

Pour ajouter un point d’arrêt :

Soit clique gauche dans la marge

Le débogueur s’arrête sur le point d’arrêt au prochain passage.

Les variables modifiées par la dernière instruction sont mises en évidence.

Point d’arrêt conditionné

Commencer par définir le point d’arrêt, puis clique droit -> Editer sur le point :

Puis indiquer votre condition avec la même syntaxe qu’avec STRDBG :

On ne s’arrêtera que lorsque la condition sera vraie !

Par rapport à RDi, le debug de VSCode ne permet pas, pour le moment, les points d’entrée de service ! Il faut donc que VSCode déclenche lui même l’exécution du programme à déboguer ! Gageons la situation évoluera très vite …

Une fois que vous êtes habitués au débogage, regardez les options de couverture de code …

, , , Comment gérer les options de compile des PRTF

On se demande souvent comment gérer les paramètres de compile sur les PRTF et les DSPF, il existe plusieurs solutions comme créer des CL de compile par exemple, ou utiliser des ALM qui intègrent cette possibilité. Mais comment faire pour que ca marche tout le temps sans avoir à modifier les commandes de compile

Voici une solution qui a été mise au point pour nos clients du centre de service.

On va utiliser le programme d’exit QIBM_QCA_CHG_COMMAND qui, à chaque fois qu’il verra un CRTPRTF l’interceptera.

Pour éviter que cela ne boucle on devra dupliquer la commande CRTPRTF dans une autre bibliothèque et renvoyer sur celle de QSYS quand on aura fait le paramétrage complémentaire.

Cette bibliothèque devra donc être devant QSYS dans la liste des bibliothèques, imaginons que cette bibliothèque s’appelle GDDS.

CHGSYSLIBL LIB(GDDS)

soit DSPLIBL

dans le source de votre PRTF vous allez indiquer des lignes commençant par A*<COMP> et terminées par </COMP>

+ votre mot clé exemple SAVE(*YES)
Vous pouvez indiquer plusieurs paramètres sur une seule ligne.

Nous avons 2 programmes que vous pouvez retrouver ici, il vous suffit des les compiler et de les ajouter à la bibliothèque GDDS que vous avez placée en tête de liste

Vous avez donc dans votre bibliothèque 2 programmes et une duplication de la commande CRTPRTF et (du CRTDSPF si vous l’ajoutez)

RTVMBRSRC qui va retrouver à partir de la commande le membre source à compiler
GDDS qui prendra la commande et qui lui ajoutera les informations lues dans le fichier source
c’est ce programme qu’on devra ajouter au programme d’exit comme ceci :
ADDEXITPGM EXITPNT(QIBM_QCA_CHG_COMMAND) FORMAT(CHGC0100) PGMNBR(92)
PGM(GDDS/GDDS) TEXT(‘Paramétrage GDDS’) PGMDTA(*JOB 20
‘CRTPRTF GDDS ‘)

Attention au paramètre PGMDTA, la commande fois faire 10 de long pour que le système la trouve

idem pour les DSPF voire les PF et LF.

Vous trouverez le source des 2 programmes ici https://github.com/Plberthoin/PLB/tree/master/GTOOLS/RPG

Vous avez un programme CLLE INITGDDS qui peut vous aider dans le répertoire CLP

==>WRKREGINF QIBM_QCA_CHG_COMMAND puis option 8


Avec cette commande, on prendra en compte désormais les CRTPRTF.
A partir de ce moment là, quand vous passerez la commande CRTPRTF, vos paramètres indiqués dans le sources seront ajoutés à la commande.

Par exemple en demandant l’invite sur la commande :
CRTPRTF FILE(GDATA/PRTF198) SRCFILE(GDATA/QDDSSRC) SRCMBR(*FILE)
Vous aurez vos paramètres

Remarque :
Vous pouvez indiquer un programme d’exit pour les DSPF (CRTDSPF), et même si vous avez encore quelque PF (CRTPF), les LF (CRTLF)
Bien sûr, tous les mots clés que vous indiquez doivent syntaxiquement être justes et correspondre au type de fichier que vous créez.
Cette solution marche en interactif, en batch, par RDI et par Vs Code, dans vos CL de compile etc …

, , Les Fichiers Markdown

Ce son des fichiers qui ont l’extension MD, ce format a été créer par John Gruber, son but était de produire des fichiers formatés très simple à administrer un peu comme RTF mais encore en plus simple.

Ce format a été adopté dans le monde open source comme un standard, par exemple les gens qui publient sur Github, mettrons un readme.md pour décrire leurs publications.
https://gist.github.com/JulienRAVIA/1cc6589cbf880d380a5bb574baa38811

La syntaxe est très simple vous pouvez l’apprendre ici :

https://blindhelp.github.io/recapitulatifsyntaxemarkdown.html

Par exemple, pour mettre des titres vous devrez utiliser le caractère #

Si la syntaxe est relativement simple, nous vous conseillons d’utiliser un éditeur pour commencer

Celui que nous utilisons s’appelle JOPLIN (Merci à Yvon qui nous l’a fait découvrir)

Vous pouvez le télécharger là https://joplinapp.org/

(il existe sous forme d’extension pour VSE également, et même sur téléphone)

L’utilisation est très simple, et relativement classique pour les utilisateurs de produits Windows

Vous avez une barre avec les différents éléments que vous voulez intégrer.

L’outil est WYSIWYG ce qui permet de voir en temps réel ce que vous voulez faire

il dispose également de nombreuses possibilités d’exportation comme HTML et PDF

Conclusion :

C’est un format simple à utiliser et c’est un standard pour les nouveaux qui arrivent sur notre plateforme.
il est donc fortement conseillé de vous y mettre, et l’effort n’est pas important au regard de ce qu’il peut rapidement vous apporter.

Vous pourrez facilement faire des docs techniques de qualité et les exporter, il existe de nombreuses extensions pour vous aider

Sites à connaitre

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

https://www.markdownguide.org/basic-syntax/

https://www.ionos.fr/digitalguide/sites-internet/developpement-web/markdown/ (en français)