https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2023-11-19 20:07:162023-11-19 20:07:17Générer un XLS avec SQL
La TR3 de la V7R5, nous apporte une nouvelle fonction table qui va nous permettre d’analyser plus finement et surtout plus simplement la fin d’un travail, soit en réalité le message CPF1164, en effet on a accès directement au code secondaire .
Exemple :
SELECT FROM_JOB, JOB_END_CODE, JOB_END_DETAIL, SECONDARY_ENDING_CODE, SECONDARY_ENDING_CODE_DETAIL FROM TABLE ( SYSTOOLS.ENDED_JOB_INFO() ) WHERE JOB_END_CODE > 10
Remarque :
Par défaut il analyse la veille soit (current date – 1)
Depuis la V7R1 (SF99701 – DB2 – niveau 23), on peut invoquer des web service via SQL. Les fonctions se trouvent dans SYSTOOLS.
En V7R4 TR5, sont sorties de nouvelles fonctions, elles se trouvent dans QSYS2.
Outre les fonctions HTTP, celles pour encoder / décoder en base64 et pour encoder / décoder L’URL, ont aussi été implémentées dans QSYS2.
Rappel des différences entre ces fonctions
Tout d’abord les performances. Les fonctions de QSYS2 permettent un gain non négligeable, elles sont basé sur les fonctions AXIS en C natif, contrairement à celles de SYSTOOLS qui sont basées sur des classes java.
Les paramètres dans l’entête ou le corps du message sont transmis en JSON pour les fonctions de QSYS2, à la place de XML pour celle de SYSTOOLS.
La gestion des certificats est simplifiée par l’utilisation de DCM, alors qu’avec les fonctions de SYSTOOLS, il fallait pousser le certificat dans le magasin du runtime java utilisé par les fonctions HTTP. En cas de multiple versions de java installées, il fallait s’assurer de laquelle servait pour les fonctions HTTP. L’ajout du certificat, se faisait via des commandes shell.
Les types et tailles des paramètres des fonctions ont été adaptés pour ne plus être des facteurs limitants de l’utilisation des fonctions SQL, voici quelques exemples :
Certaines utilisations ont aussi été simplifiées en automatisant des tâches.
Prenons l’exemple d’un appel à un web service avec une authentification basique. Le couple profil / mot de passe doit être séparé par « : » et l’ensemble encoder en base64. C’est la norme HTTP.
Dans le cas des fonctions de SYSTOOLS, il fallait effectuer l’ensemble des opérations, alors qu’avec les fonctions de QSYS2, il suffit de passer le profil et le mot de passe dans la propriété BasicAuth. La mise en forme et l’encodage étant faits directement par les fonctions AXIS :
Il y a par contre un cas limitatif des fonctions QSYS2, que IBM a rajouté, alors que la norme HTTP autorise ce type d’appel.
Il s’agit d’avoir une authentification basique sur un appel en http.
Ce cas n’est pas trop contraignant, aujourd’hui le https est la norme et le http quasiment disparu…. quasiment ! Nous rencontrons encore chez nos clients des web services « interne » en http. La migration en https n’étant pas vendeur auprès des directions qui n’y voit aucun gain pour le métier. C’est l’éternel problème des changements structurels en IT.
Dans ces cas, la fonction de QSYS2, renverra une erreur, assez claire !
Le premier réflexe est de voir avec le fournisseur du service s’il ne dispose pas d’une version en https.
Maintenant, si vous n’avez pas d’autre choix que d’appeler un web service en http avec authentification basique, il faudra continuer d’utiliser les fonctions de SYSTOOLS. Dans tous les autres cas, aucune hésitation, utilisez les fonctions de QSYS2.
Mais mettons nous d’accord, de l’authentification basique en http, ce n’est pas de la sécurité, c’est une absurdité.
En http, le message passe en clair sur la trame réseau, avec votre profil / mot de passe, encodé en base 64, et non encrypté, donc en clair eux aussi.
Edit :Précision apportée par Gautier Dumas de CFD-innovation. Merci à lui. On peut contourner le problème avec les fonctions de QSYS2. Il ne faut pas utiliser la propriété BASICAUTH, mais construire l’authentification basique comme on le faisait avec celle de SYSTOOLS. VALUES QSYS2.HTTP_GET( ‘http://hostname/wscommon/api/contacts’, ‘{« header »: »Authorization, BASIC dGVzdHVzZXI6dGVzdHB3ZA== »}’); Il n’y a donc vraiment plus de raison de continuer avec les fonctions de SYSTOOLS !
A*
A DSPSIZ(24 80 *DS3)
A CA03
A R FMT01
A*
A OVERLAY
A 1 28'Test TOUCHES INFDS/ ATTRIBUT'
A 3 2'Text'
A ZONE 12A B 3 9DSPATR(&ATTRIB)
A ATTRIB 1A P
A 22 3'F3=Exit'
RPGLE
**free
// Exemple d'utilisation d'un écran
// Sans indicateurs
//
Dcl-F TOUCHE WORKSTN INFDS(FICHIERDS) ;
/INCLUDE INFDS_INC
/INCLUDE TOUCHE_INC
/INCLUDE ATTR_INC
// initialisation des attributs
Zone = 'Welcome';
ATTRIB = P_HI;
// Boucle su F3
DOU Touche_Ecran = F3 ;
Exfmt FMT01 ;
ENDDO ;
//
*inlr = *on ;
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2023-11-05 10:12:432023-11-05 10:12:45Diminuer les indicateurs dans vos RPGLE
Administration, SQL_DB2Comprendre comment un travail interactif est affecté à un sous système.
C’est des entrées écran qui peuvent être indiquées sur des sous systèmes, par les commandes ADDWSE et CHGWSE.
Il va utiliser le nom de l’unité écran, il va faire la recherche dans cet ordre :
-Par nom -par nom générique -*all
Vous avez un service SQL qui permet de les visualiser QSYS2.WORKSTATION_INFO
Voici une requête qui permet de voir et comprendre les entrées de votre système
SELECT A.SUBSYSTEM_DESCRIPTION_LIBRARY, A.SUBSYSTEM_DESCRIPTION, WORKSTATION_NAME
FROM QSYS2.WORKSTATION_INFO as A Join QSYS2.SUBSYSTEM_INFO AS B
on A.SUBSYSTEM_DESCRIPTION_LIBRARY= b.SUBSYSTEM_DESCRIPTION_LIBRARY and
A.SUBSYSTEM_DESCRIPTION = b.SUBSYSTEM_DESCRIPTION
and B.STATUS = 'ACTIVE' and ALLOCATION = '*SIGNON'
where WORKSTATION_NAME not like('%*%')
union
SELECT A.SUBSYSTEM_DESCRIPTION_LIBRARY, A.SUBSYSTEM_DESCRIPTION, WORKSTATION_NAME
FROM QSYS2.WORKSTATION_INFO as A Join QSYS2.SUBSYSTEM_INFO AS B
on A.SUBSYSTEM_DESCRIPTION_LIBRARY= b.SUBSYSTEM_DESCRIPTION_LIBRARY and
A.SUBSYSTEM_DESCRIPTION = b.SUBSYSTEM_DESCRIPTION
and B.STATUS = 'ACTIVE' and ALLOCATION = '*SIGNON'
where WORKSTATION_NAME like('%*%')
union
SELECT A.SUBSYSTEM_DESCRIPTION_LIBRARY, A.SUBSYSTEM_DESCRIPTION, WORKSTATION_TYPE
FROM QSYS2.WORKSTATION_INFO as A Join QSYS2.SUBSYSTEM_INFO AS B
on A.SUBSYSTEM_DESCRIPTION_LIBRARY= b.SUBSYSTEM_DESCRIPTION_LIBRARY and
A.SUBSYSTEM_DESCRIPTION = b.SUBSYSTEM_DESCRIPTION
and B.STATUS = 'ACTIVE' and ALLOCATION = '*SIGNON'
where WORKSTATION_TYPE = '*ALL'
En principe ca représentera l’ordre de recherche dans votre #ibmi
Remarque :
Quand 2 entrées sont démarrés avec le même critère c’est le premier qui est pris en compte Ici les entrées QPADEV* entrerons dans QINTER On peut également faire des entrées par type les 2 principaux sont IBM-3477-FC 132 IBM-3179-2 80 https://www.rfc-editor.org/rfc/rfc1205 Mais à éviter pas simple à gérer
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2023-11-03 11:43:412023-11-03 11:43:44Comprendre comment un travail interactif est affecté à un sous système.
Vous avez besoin d’avoir un écran qui se met à jour automatiquement voici un exemple qui fait ca.
Cette une barre d’avancement qui rafraichit également l’heure affichée.
DSPF
A DSPSIZ(24 80 *DS3)
A CA03(03)
A* Test écran en réaffichage auto
A*
A R FMT01
A*%%TS SD 20231026 124638 PLB REL-V7R4M0 5770-WDS
A PUTOVR
A OVRDTA
A OVRATR
A 5 27'Barre d''avancement'
A DSPATR(HI)
A TEXTE 50A O 11 15
A 22 4'F3=Exit'
A STATUS 15A O 9 27
Vous voulez utiliser la souris dans un dspf sur dans un de vos programmes voici un exemple en CLLE:
DSPF :
A DSPSIZ(24 80 *DS3)
A CA03(03)
A* EVENNEMENT SOURIS
A* UNSHIFT / LEFT / PRESS
A R FMT01
A*%%TS SD 20231025 171347 QSECOFR REL-V7R4M0 5770-WDS
A MOUBTN(*ULP ENTER)
A RTNCSRLOC(*MOUSE &L1 &C1 &L2 &C2)
A* RÉCUPÉRATION DU CURSEUR
A L1 3S 0H
A C1 3S 0H
A L2 3S 0H
A C2 3S 0H
A 3 13'Tester la position de la souris'
A 5 13'En faisant un clic Gauche.'
A* BOUTON BAS DE PAGE
A F1B 2Y 0B 23 2PSHBTNFLD
A PSHBTNCHC(1 'F3=>Exit' CA03)
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2023-10-25 20:47:252023-10-27 19:46:40Utilisation de la souris dans un DSPF
C’est la possibilité d’avoir un menu déroulant dans vos DSPF avec plusieurs onglets et de choisir une option, exactement comme dans windows.
Ci dessous un exemple avec son programme 2 menus déroulants ici PULLA et PULLB
DSPF
A* Exemple de menu barre
A DSPSIZ(27 132 *DS4)
A MNUCNL(CA12)
A CA03(03 'EXIT')
A R MB MNUBAR
A MNUFLD 2Y 0B 1 2
A MNUBARCHC(1 PULLA +
A '>Pulla')
A MNUBARCHC(2 PULLB +
A '>Pullb')
A MNUBARSEP( +
A (*CHAR '_'))
A
A R RECORD
A*%%TS SD 20231025 122354 PLB REL-V7R4M0 5770-WDS
A MNUBARDSP(MB &MNUCHC &PULL)
A 11 2'Nom :'
A ZONE1 30A B 11 14
A 12 2'Prénom :'
A ZONE2 20A B 12 14
A MNUCHC 2Y 0H
A PULL 2S 0H
A 13 2'Sexe :'
A F1S 2Y 0B 13 14SNGCHCFLD(*AUTOSLT (*NUMCOL 3))
A CHOICE(1 '>Homme ')
A CHOICE(2 '>Femme ')
A CHOICE(3 '>Inconnu')
A 14 2'Langue(s):'
A F1M 2Y 0B 14 14MLTCHCFLD((*NUMCOL 4))
A CHOICE(1 '>Anglais')
A CHCCTL(1 &CHOIX1)
A CHOICE(2 '>Espagnol')
A CHCCTL(2 &CHOIX2)
A CHOICE(3 'Alleman>d')
A CHCCTL(3 &CHOIX3)
A CHOICE(4 '>Italien ')
A CHCCTL(4 &CHOIX4)
A* CHOICE(5 'A>utre ')
A* CHCCTL(5 &CHOIX5)
A CHOIX1 1Y 0H
A CHOIX2 1Y 0H
A CHOIX3 1Y 0H
A CHOIX4 1Y 0H
A* CHOIX5 1Y 0H
A* Bas de page
A F1B 2Y 0B 23 2PSHBTNFLD
A PSHBTNCHC(1 'F3=>Exit' CA03)
A PSHBTNCHC(2 'E>nter')
A 9 3'Renseignements'
A R PULLA PULLDOWN
A F1 2Y 0B 1 02SNGCHCFLD(*AUTOENT)
A CHOICE(1 '>UN ')
A CHCCTL(1 &C1)
A CHOICE(2 '>DEUX')
A CHCCTL(2 &C2)
A CHOICE(3 '>TROIS')
A CHCCTL(3 &C3)
A C1 1Y 0H
A C2 1Y 0H
A C3 1Y 0H
A R PULLB PULLDOWN
A F1 2Y 0B 1 02SNGCHCFLD
A CHOICE(1 '>UN')
A CHCCTL(1 &C21)
A CHOICE(2 '>DEUX')
A CHCCTL(2 &C22)
A CHOICE(3 '>TROIS')
A CHCCTL(3 &C23)
A C21 1Y 0H
A C22 1Y 0H
A C23 1Y 0H
A
RPGLE
**FREE
// exemple de menu barre
Dcl-F MNUBAR WORKSTN ;
CLEAR RECORD ;
DoW *IN03 = '0';
Exfmt RECORD;
If *IN03 = '0';
If PULL > 0;
Select ;
When PULL = 1;
DSPLY 'Un' ;
When PULL = 2;
DSPLY 'Deux' ;
when PULL = 3;
DSPLY 'Trois' ;
Endsl;
// ici traitement des zones du format
EndIf;
EndIf;
EndDo;
*INLR = *On;
Remarque :
Vous devez compiler avec l’option ENHDSP(*YES)
Pour la présentation, cet exemple comporte également Un bouton poussoir pour les touches de fonctions un exemple de case a cocher unique un exemple de case à cocher multiple
Pour commencer c’est un peu compliqué, pour vous aider, vous pouvez utiliser notre générateur téléchargeable ici …
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2023-10-25 15:49:012023-11-03 12:32:01Utiliser un menu barre dans vos DSPF
C’est la possibilité d’avoir plusieurs messages d’erreur et de pouvoir paginer dessus
Vous pouvez programmer un sous fichier message, mais ca peut être un peu compliqué à réaliser.
Voici une solution simple, il suffit de mettre le mot clé ERRSFL au niveau fichier écran
Ci dessous un exemple avec son programme en CLLE
DSPF
A* Exemple sous fichier d'erreurs
A DSPSIZ(24 80 *DS3)
A ERRSFL
A CA03(03)
A R FMT01
A ZONE1 10A B 11 20
A 41 ERRMSG('Erreur ZONE 1' 41)
A ZONE2 10A B 12 20
A 42 ERRMSG('Erreur ZONE 2' 42)
A ZONE3 10A B 13 20
A 43 ERRMSG('Erreur ZONE 3' 43)
A 6 8'Sous fichier d''erreur'
A DSPATR(HI)
A 11 8'Zone 1 :'
A 12 8'Zone 2 :'
A 13 8'Zone 3 :'
CLLE
/* Exemple sous fichier message d'erreur */
PGM
DCLF ERREUR
dountil &in03
SNDRCVF RCDFMT(FMT01)
IF COND(*NOT &IN03) THEN(DO)
/* activation des indicateurs d'erreur */
CHGVAR &IN41 '1'
CHGVAR &IN42 '1'
CHGVAR &IN43 '1'
enddo
enddo
ENDPGM
Remarque:
La seule limitation, c’est une seule erreur par zone, mais ca suffit dans 90 % des cas
Vous pouvez utilisez des sous fichiers pour faire des sélections par case à cocher, ce qui améliore la gestion des écrans pour les utilisateurs
Voici 2 exemples
Sélection unique
Mot clé SFLSNGCHC, https://www.ibm.com/docs/en/i/7.4?topic=dkedfp4t8-sflsngchc-subfile-single-choice-selection-list-keyword-display-files
Le DSPF
A*%%TS SD 20231024 203749 QSECOFR REL-V7R4M0 5770-WDS
A* SOUS FICHIER À CHOIX MULTIPLE
A*
A*%%EC
A DSPSIZ(24 80 *DS3)
A CA03(03)
A R SFL01 SFL
A* ZONE À COCHER
A ZONCTL 1Y 0H SFLCHCCTL
A ZONE 10A O 4 10
A R CTL01 SFLCTL(SFL01)
A*%%TS SD 20231024 203749 QSECOFR REL-V7R4M0 5770-WDS
A SFLPAG(0005)
A WINDOW(5 5 9 31)
A* SOUS FICHIER A SELECTION UNIQUE
A SFLSNGCHC(*SLTIND *AUTOSLT)
A* TAILLE DYNAMIQUE À FOURNIR
A SFLSIZ(&SFLSIZ)
A SFLDSP
A SFLDSPCTL
A 41 SFLCLR
A 45 SFLEND(*SCRBAR *SCRBAR)
A* LIGNE EN COURS < FOURNIT PAR LE SYSTÈME
A DEMANDE 5S 0H SFLSCROLL
A* LIGNE DE LA PAGE À AFFICHER > A FOURNIR PAR LE PROGRAMME
A LIGNE 4S 0H SFLRCDNBR(*TOP)
A* TAILLE DU SOUS FICHIER > A FOURNIR PAR LE PROGRAMME
A SFLSIZ 5S 0P
A* CLÉ DU SOUS FICHIER
A CLE01 4Y 0H
A 2 01'Sous Fichier Sélection Simple'
Le RPGLE
**free
// sous fichier à choix unique
ctl-opt DFTACTGRP(*NO) ;
dcl-f BOUTON8 WORKSTN
SFILE(sfl01:cle01) ;
dcl-s i int(10) ;
// Initialisation du sous fichier
SFLSIZ = 10;
LIGNE = 1;
cle01 = 0 ;
*in41 = *on ;
write ctl01 ;
*in41 = *off ;
// Chargement du sous fichier
cle01 = cle01+1 ;
zone = 'AAAAAAAAA' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'BBBBBBBBB' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'CCCCCCCCC' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'DDDDDDDDD' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'EEEEEEEEE' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'FFFFFFFFF' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'GGGGGGGGG' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'HHHHHHHHH' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'IIIIIIIII' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'JJJJJJJJJ' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'KKKKKKKKK' ;
Write sfl01;
// Boucle d'affichage
dou *in03 ;
exfmt ctl01 ;
if not *in03;
// Lecture de l'enregistrement sélectionné
readc sfl01 ;
if not %eof() ;
dsply zone ;
ZONCTL = 0 ;
update(e) sfl01 ;
LIGNE = demande ;
endif ;
endif ;
enddo ;
*inlr = *on ;
Sélection multiple
Mot clé SFLMLTCHC https://www.ibm.com/docs/en/i/7.4?topic=dkedfp4t8-sflmltchc-subfile-multiple-choice-selection-list-keyword-display-files
Le DSPF
A*%%TS SD 20231025 044340 QSECOFR REL-V7R4M0 5770-WDS
A* SOUS FICHIER À CHOIX MULTIPLE
A*
A*%%EC
A DSPSIZ(24 80 *DS3)
A CA03(03)
A R SFL01 SFL
A* ZONE À COCHER
A ZONCTL 1Y 0H SFLCHCCTL
A ZONE 10A O 4 10
A R CTL01 SFLCTL(SFL01)
A*%%TS SD 20231025 043531 QSECOFR REL-V7R4M0 5770-WDS
A SFLDSP
A SFLDSPCTL
A 41 SFLCLR
A 45 SFLEND(*SCRBAR *SCRBAR)
A* TAILLE DYNAMIQUE À FOURNIR
A SFLSIZ(&SFLSIZ)
A SFLPAG(0005)
A WINDOW(5 5 9 31)
A* SOUS FICHIER A SELECTION MULTIPLE
A SFLMLTCHC(&NBSEL *SLTIND)
A* LIGNE EN COURS < FOURNIT PAR LE SYSTÈME
A DEMANDE 5S 0H SFLSCROLL
A* LIGNE DE LA PAGE À AFFICHER > A FOURNIR PAR LE PROGRAMME
A LIGNE 4S 0H SFLRCDNBR(*TOP)
A* TAILLE DU SOUS FICHIER > A FOURNIR PAR LE PROGRAMME
A SFLSIZ 5S 0P
A* NOMBRE DE SELECTIONS < FOURNIT PAR LE SYSTÈME
A NBSEL 4Y 0H
A* CLÉ DU SOUS FICHIER
A CLE01 4Y 0H
A 2 1'Sous Fichier Sélection Multiple'
A DSPATR(HI)
Le RPGLE
**free
// sous fichier à choix multiple
ctl-opt DFTACTGRP(*NO) ;
dcl-f BOUTON7 WORKSTN
SFILE(sfl01:cle01) ;
dcl-s i int(10) ;
// Initialisation du sous fichier
SFLSIZ = 10;
LIGNE = 1;
cle01 = 0 ;
*in41 = *on ;
write ctl01 ;
*in41 = *off ;
// Chargement du sous fichier
cle01 = cle01+1 ;
zone = 'AAAAAAAAA' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'BBBBBBBBB' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'CCCCCCCCC' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'DDDDDDDDD' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'EEEEEEEEE' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'FFFFFFFFF' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'GGGGGGGGG' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'HHHHHHHHH' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'IIIIIIIII' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'JJJJJJJJJ' ;
Write sfl01;
cle01 = cle01+1 ;
zone = 'KKKKKKKKK' ;
Write sfl01;
// Boucle d'affichage
dou *in03 ;
exfmt ctl01 ;
if not *in03;
// Traitement des enregistrements cochés
for i = 1 to nbsel ;
readc sfl01 ;
if not %eof();
dsply zone ;
ZONCTL = 0 ;
update(e) sfl01 ;
LIGNE = demande ;
endif ;
endfor;
endif ;
enddo ;
*inlr = *on ;
Remarques:
Vous devez compiler avec l’option ENHDSP(*YES)
Pour les sélection simple , vous pouvez utiliser une alternative aux cases à cocher, SFLCSRRRN qui renvoit la clé de l’enregistrement lu sans faire un READC
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2023-10-25 06:08:352024-01-19 09:24:55Utiliser un sous fichier à cocher