Dans la dernière TR est apparue une nouveauté très intéressante « API RSE », c’est un ensemble d’API REST fournies avec votre système d’exploitation au travers du serveur ADMIN5.
Ces APIs sont utilisables depuis le web et permettent de lancer des commandes, accéder à l’IFS, de lancer de requêtes SQL…
Ce service ne fonctionne qu’en TLS vous devrez donc le sécuriser par l’administration http ://Votre_systeme:2001/HTTPAdmin
Vous devez ensuite le démarrer s’il ne l’est pas c’est le serveur ADMIN5
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2023-06-27 07:16:592023-06-27 07:17:00Débuter avec API RSE
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2023-06-18 09:58:322023-06-20 13:43:02Offrez une indexation à votre IBMi avec OMNIFIND
Vous allez devoir comparer les niveaux installés sur les 2 systèmes. Voici comment le faire simplement :
Vous devrez faire une extraction des éléments sur le système à comparer par exemple
create table gaia.remote_ptf as ( select * from QSYS2.GROUP_PTF_INFO ) with data
Vous envoyez le fichier sur la machine cible
select a.PTF_GROUP_NAME, a.PTF_GROUP_LEVEL, b.PTF_GROUP_LEVEL from QSYS2.GROUP_PTF_INFO a join gaia.remote_ptf b on A.PTF_GROUP_NAME = B.PTF_GROUP_NAME
pour n’avoir que les différences
select distinct substr(a.PTF_GROUP_NAME, 1, 30) , a.PTF_GROUP_LEVEL, b.PTF_GROUP_LEVEL from QSYS2.GROUP_PTF_INFO a join gaia.remote_ptf b on A.PTF_GROUP_NAME = B.PTF_GROUP_NAME where a.PTF_GROUP_LEVEL <> b.PTF_GROUP_LEVEL
Attention vous avez 2 niveaux de groupe dans le fichier, il faudrait améliorer le script en prenant un max pour avoir le plus haut sur les 2 systèmes
Exemple :
with LCL (PTF_GROUP_NAME, PTF_GROUP_LEVEL) as ( SELECT substr(PTF_GROUP_NAME, 1, 20), max(PTF_GROUP_LEVEL) FROM QSYS2.GROUP_PTF_INFO GROUP BY PTF_GROUP_NAME ), RMT (PTF_GROUP_NAME, PTF_GROUP_LEVEL) as ( SELECT substr(PTF_GROUP_NAME, 1, 20), max(PTF_GROUP_LEVEL) FROM gaia.remote_ptf GROUP BY PTF_GROUP_NAME ) select A.PTF_GROUP_NAME, A.PTF_GROUP_LEVEL, B.PTF_GROUP_LEVEL from LCL A join RMT B on A.PTF_GROUP_NAME = B.PTF_GROUP_NAME
Pour les PTF unitaires
Vous avez la vue QSYS2.PTF_INFO, vous pouvez également utiliser un DSPPTF en OUTFILE
Vous allez devoir trouver les PTF manquantes
Vous devrez faire une extraction des éléments sur le système à comparer par exemple
create table gaia.remote_ptf1 as ( select * from QSYS2.PTF_INFO ) with data
Vous envoyez le fichier sur la machine cible
Pour avoir les PTF qui manquent sur le remote :
SELECT a.PTF_PRODUCT_ID, a.PTF_IDENTIFIER FROM QSYS2.PTF_INFO a exception join gaia.remote_ptf1 b on a.PTF_PRODUCT_ID = b.PTF_PRODUCT_ID and a.PTF_IDENTIFIER = b.PTF_IDENTIFIER
Si voulez les PTF qui manquent sur la source, le plus simple est de changer l’ordre des fichiers :
SELECT a.PTF_PRODUCT_ID, a.PTF_IDENTIFIER FROM gaia.remote_ptf1 a exception join QSYS2.PTF_INFO b on a.PTF_PRODUCT_ID = b.PTF_PRODUCT_ID and a.PTF_IDENTIFIER = b.PTF_IDENTIFIER
Remarque :
Vous pouvez utiliser une connexion DRDA pour comparer vos fichiers sans les envoyer, si c’est paramétré chez vous exemple : select distinct substr(a.PTF_GROUP_NAME, 1, 30) , a.PTF_GROUP_LEVEL, b.PTF_GROUP_LEVEL from QSYS2.GROUP_PTF_INFO a join .QSYS2.GROUP_PTF_INFO b on A.PTF_GROUP_NAME = B.PTF_GROUP_NAME where a.PTF_GROUP_LEVEL <> b.PTF_GROUP_LEVEL
Vous avez des outils comme ARE qui permettent de faire ce type d’opération
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2023-06-06 07:37:372023-08-11 16:46:43Comparer les PTF de 2 systèmes
Il existe plusieurs solutions pour faire du CSV, la plus connue c’est en utilisant la commande CPYTOIMPF, mais vous pouvez générer directement un fichier CSV en utilisant SQL, voici un petit tutoriel pour vous aider :
Vous devrez utiliser les procédures QSYS2.IFS_WRITE*
Voici un exemple qui comporte la génération du fichier, l’ajout d’un entête et la génération des listes de détail. Nous avons choisi de faire sans délimiteur et avec « ; » comme séparateur. Le fichier obtenu est directement lisible par Excel.
Si vous voulez un délimiteur voici une variante sur les select avec » comme délimiteur
Pour les entêtes de ligne :
LINE => ‘ »Les_options » ; « Les_commandes »‘)
Pour les lignes de détail, on enlève les blancs :
select ‘ »‘ concat trim(option) concat ‘ » ; « ‘ concat trim(command) concat ‘ »‘ as option_txt from qgpl.qauoopt
BEGIN
-- Créér ou remplacer le fichier dans l'IFS
CALL QSYS2.IFS_WRITE_UTF8(PATH_NAME =>'les_options_pdm.csv',
LINE => '',
OVERWRITE => 'REPLACE',
END_OF_LINE => 'NONE');
-- Mettre l'entête de colonne
CALL QSYS2.IFS_WRITE_UTF8(PATH_NAME =>'les_options_pdm.csv',
LINE => 'Les_options ; Les_commandes');
-- Ecriture d'une ligne obtenue dans le select
FOR select option concat ';' concat command as option_txt from qgpl.qauoopt DO
CALL QSYS2.IFS_WRITE_UTF8(PATH_NAME => 'les_options_pdm.csv',
LINE => option_txt);
END FOR;
END;
Dans cet exemple, on a utilisé la procédure QSYS2.IFS_WRITE_UTF8 pour générer le fichier directement en UNICODE et éviter les problèmes de CCSID, c’est le sens de l’histoire …
Nous n’avons pas précisé de répertoire. Le fichier est créé dans le répertoire par défaut de l’utilisateur, en principe /home/<user>
.
Conclusion :
C’est une solution simple et efficace qui permet de générer un fichier sans passer par un fichier intermédiaire en DB2.
Si vos zones sont numériques vous devrez les convertir par la fonction CHAR()
https://www.gaia.fr/wp-content/uploads/2022/08/IMG-20200712-WA0017.jpg1024768Ana Ramirez/wp-content/uploads/2017/05/logogaia.pngAna Ramirez2023-05-26 21:00:552023-08-11 16:49:29Faire un CSV avec SQL
Il est difficile de déboguer un watcher parce qu’on ne maitrise pas son lancement.
Voici une méthode en utilisant RDI, qui va vous permet de le faire :
Trouver le nom du programme à analyser :
WRKWCH WCH(*ALL) :
5 pour le détail
Dans RDI, clic droit sur le programme à déboguer => débogage ou couverture de code (entrée de service) => définir un point d’entrée de service
Le message d’affiche :
Pour tester, on peut simuler un traitement qui va planter. Dans notre cas, on fait un call d’un programme qui n’existe pas, et donc ça va faire un plantage dans QSYSOPR.
SBMJOB CMD(CALL PGM(GAIA/ERREURA))
JOB(ERREURA)
JOBQ(QSYSNOMAX)
Une fois le programme a été lancé, sur RDI s’affichera le message suivant :
Cliquer sur « Afficher *LISTING »
Pour avancer d’un pas on peut utiliser la touche F5 ou en cliquant sur la flèche :
Pour afficher les valeurs des variables il suffit de passer la souris sur le nom de la variable :
Conclusion : c’est une solution simple pour déboguer un watcher ou un programme dont vous ne maitrisez pas le lancement.
Le programme doit être compilé avec le source.
Vous devrez avoir le droit pour faire ce type d’opération. Soit au niveau de profil, soit par les fonctions usages.
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2023-05-20 08:21:172023-05-20 08:21:18Informations sur les SAVF
Il est possible que vous ayez un effet de bord sur les fichiers téléchargés par FTP ou SFTP par exemple dans vos cpyfrmstmf ou cpyfrmimpf vous avez un plantage.
Les fichiers étaient jusqu’ici encodés en CCSID = 819 et maintenant par défaut, ils sont encodés en CCSID = 1208
https://www.gaia.fr/wp-content/uploads/2017/02/team3.png600600Pierre-Louis BERTHOIN/wp-content/uploads/2017/05/logogaia.pngPierre-Louis BERTHOIN2023-05-12 14:04:002023-05-13 09:42:42Migration en V7R4 et IFS
Premier test sur les fonctions géospatiales, elles sont désormais intégrées à DB2
Vous pouvez indiquer les coordonnées GPS d’un lieu dans une zone, et vous pourrez ensuite faire des calculs, de distance , de superficie, etc …
C’est des zones de type QSYS2.ST_POINT, par exemple pour indiquer des coordonnées GPS, mais vous pouvez également indiquer des formes comme des lignes ou des polygones ..
Voici un premier exemple
— Création table des salariés avec leur lieu de travail
create table GDATA.SALARIE (ID int, NOM varchar(30), PRENOM varchar(30), MAISON QSYS2.ST_POINT, TRAVAIL QSYS2.ST_POINT);
— Insertion dans la table des informations Vous pouvez les trouver ici les coordonnées GPS: https://www.coordonnees-gps.fr/
le gouvernement mais également à disposition un site
INSERT INTO GDATA.DOCTEUR VALUES(3, ‘Docteur3’, ‘Paris’, QSYS2.ST_POINT(‘point (48.8532238 2.3678865)’)
) ;
— Je veux les docteurs à moins de 10 km du domicile du salarié
Select b.nomdoc, b.ville, st_distance(a.maison , b.cabinet) as distance from gdata.salarie a , gdata.docteur b where st_distance(a.maison , b.cabinet) < 10000 ;
Le résultat
Conclusions :
Il y a des fonctions beaucoup plus poussées, et on imagine bien le type d’application qu’on pourra faire, donc on peut prévoir dès à présent une zone de géolocalisation dans des fichiers clients qu’on va créer, voir modifier .
Quand un travail démarre, il crée dans la log système un message CPF1124 et un message CPF1164 quand il se termine.
C’est comme ca qu’on sait qu’un job à tourné
Mais attention, Il existe des travaux pour lesquels les messages CPF1124 et CPF1164 ne sont pas logués dans QHST : il s’agit des SPAWN jobs.
Les travaux QP0ZSPWP & QP0ZSPWT en sont de bons exemples.
Spawn batch jobs : https://www.ibm.com/docs/en/i/7.4?topic=jobs-spawn-batch
Spawn est une fonction qui crée un nouveau processus de travail (processus enfant) qui hérite de nombreux attributs du processus appelant (processus parent). Un nouveau programme est spécifié et commence à s’exécuter dans le processus enfant. Lorsque vous lancez un travail par lots, vous utilisez un travail parent pour transmettre des arguments et des variables d’environnement au travail enfant. L’API spawn() utilise des travaux batch immédiats, des travaux pré-démarrés ou des travaux batch pré-démarrés.