Tester les paramètres en CLP

Comment traiter le passage de paramètres en CLP ?

Le principe est le suivant, les paramètres sont passés dans l’ordre et si vous utilisez la zone associée, vous devez l’avoir reçu

Voici 2 méthodes pour vous aider à tester vos paramètres :

La première solution est disponible depuis la version 7.3

Vous avez une nouvelle fonction qui est %parm

exemple

pgm (&parm1 &parm2 )
dcl &parm1 *char 10
dcl &parm2 *char 10
dcl &nbparm *dec 3
dcl &nbparma *char 3
/* test paramètre */

chgvar &nbparm %parms

/* nombre de paramètres */

if cond(&nbparm < 1) then(do)

SNDUSRMSG MSG(‘Paramètre &parm1 non reçu’) MSGTYPE(INFO)
return
enddo
if cond(&nbparm < 2) then(do)
SNDUSRMSG MSG(‘Paramètre &parm2 non reçu’) MSGTYPE(INFO)

return

enddo

/* pour afficher le nombre de paramètres */
chgvar &nbparma &nbparm
SNDUSRMSG MSG(‘Nombre de paramètres’ *bcat &nbparma ) MSGTYPE(*INFO)
endpgm

La deuxième solution est historique il faut traiter le message MCH3601

Exemple :

pgm (&parm1 &parm2 )
dcl &parm1 *char 10
dcl &parm2 *char 10
/* test paramètre /

/* si paramètres non passés on sort */

chgvar &parm1 &parm1

monmsg MCH3601 exec(do)

SNDUSRMSG MSG(‘Paramètre &parm1 non reçu’) MSGTYPE(INFO)
return
enddo
chgvar &parm2 &parm2
monmsg MCH3601 exec(do)
SNDUSRMSG MSG(‘Paramètre &parm2 non reçu’) MSGTYPE(*INFO)
return
enddo
endpgm

, Utilisation de QSYSMSG

Vous pouvez créer une file de messages supplémentaire pour les messages importants !
Elle viendra en complément de QSYSOPR

C’est la file QSYSMSG

Pour la créer

CRTMSGQ QSYS/QSYSMSG +
TEXT(‘Messages importants’)

Voici les messages qui sont envoyés dedans

CPF1269 Demande de démarrage de programme reçue sur unité &1
CPF1393 Le profil utilisateur &2 a été désactivé
CPF1397 Poste &3 mis hors fonction par sous-système &1
CPI2209 Profil utilisateur &1 supprimé car endommagé.
CPI9014 Le mot de passe reçu de l’unité &1 est incorrect.
CPI96C0 Le mot de passe protégé n’a pas pu être validé.
CPI96C1 La valeur de la variable GDS d’ouverture de session
CPI96C2 Le mot de passe utilisateur n’a pas pu être changé.
CPI96C3 Message &4 renvoyé lors d’un appel système.
CPI96C4 Le mot de passe n’est pas correct pour le profil utilisateur
CPI96C5 L’utilisateur &4 n’existe pas.
CPI96C6 Code retour &4 reçu lors de l’appel de CPI-Communication
CPI96C7 Incident système dans programme de transaction d’ouverture

Vous en avez d’autres qui seront envoyés dans les 2 files

pour des compléments regardez ICI

https://www.ibm.com/docs/en/i/7.3?topic=messages-qsysmsg-message-queue

Vous pouvez créer un watcher pour faire remonter les informations en temps réel par mail par exemple !

Exemple :

STRWCH SSNID(SUPQSYMSG)
WCHPGM(VOTREPGM)
WCHMSG(*NONE)
WCHMSGQ((QSYS/QSYSMSG))

Pour le programme regardez ici, tout est dans le passage des paramètres


https://www.ibm.com/docs/en/i/7.3?topic=collectors-i-job-watcher

, , Nombre d’accès DB d’un travail

Vous voulez avoir une idée du nombre d’entrées-sorties que génère un travail sur votre base de données.

Pour ceci, vous pouvez par exemple utiliser la comptabilité des travaux.

Pour utiliser cette fonctionnalité, vous devez la mettre en œuvre voici comment :

1 ) Créer un récepteur de journal par exemple dans qusrsys ou une de vos bibliothèques
CRTJRNRCV JRNRCV(QUSRSYS/QACGJRN)
2) Créer le journal QACGJRN
CRTJRN JRN(QSYS/QACGJRN)
JRNRCV(QUSRSYS/QACGJRN)
3) Changer la valeur système QACGLVL
CHGSYSVAL SYSVAL(QACGLVL) VALUE(‘*JOB’)

Tous les jobs démarrés à partir de ce moment seront logués

Pour analyser vous avez des postes de type JB
Le plus simple est d’utiliser un fichier modèle
Le fichier modèle qui correspond est QSYS/QAJBACG4

dupliquez le

CRTDUPOBJ OBJ(QAJBACG4)
FROMLIB(QSYS)
OBJTYPE(*FILE)
TOLIB(PLB)
NEWOBJ(WAJBACG4)

Maintenant vous pouvez le remplir en faisant un DSPJRN

DSPJRN JRN(QACGJRN)
JRNCDE((A))
ENTTYP(JB)
OUTPUT(OUTFILE) OUTFILFMT(TYPE4)
OUTFILE(PLB/WAJBACG4)

Vous pouvez alors interroger votre fichier par sql

exemple ici en se limitant au jobs interactifs :

SELECT
JAJOBH as travail,
JAUSRH as utilisateur,
JANBRH as numero,
JADBPT as acces,
JADBGT as creation,
JADBUP as mise_à_jour
FROM PLB.WAJBACG4
WHERE JATYPE = ‘I’

Remarque :
N’oubliez pas supprimer les récepteurs quand vous les avez traité
Si vous voulez arrêter la collecte
CHGSYSVAL SYSVAL(QACGLVL) VALUE(‘*NONE’)

Vous pouvez également utiliser la comptabilité des travaux pour de nombreuses autres informations, pour par exemple estimer vos volumes d’impression.

, 5 choses à faire avant de changer de version

Vous avez décidé de changer de version d’OS , voici quelques opérations auxquelles on ne pense pas toujours, mais qui peuvent vous aider en cas de problème.

1) Appliquer les PTFs définitivement


APYPTF LICPGM(ALL) APY(PERM)
vous pourrez ainsi faire le ménage et supprimer les SAVFs sans déphaser le catalogue
DLTPTF PTF(*PRMAPY)


2) Faire le ménage

Ça ne fait jamais de mal de faire un peu de place

Supprimer tout ce qui est inutile
les SAVFs

Les récepteurs
Les spools
Dans l’ifs les fichiers de travail de log etc…

Réorganiser les fichiers ayant beaucoup de d’enregistrements supprimés, méfiez vous de BRMS et des collectes de performances.

Supprimer les objets inutilisés (si nécessaire faire une sauvegarde au cas où).


3) Téléchargez PRUV, lancez le, et suivez les recommandations qu’il vous donne …

Pour télécharger c’est ici https://www-01.ibm.com/support/docview.wss?uid=nas8N1014074

Je vous conseille de télécharger la dernière version juste avant de faire votre opération.

.


4) Faire un DSPOBJD *ALL dans un fichier pour garder les dates de référence sur les objets.

Ça vous permettra d’avoir les dates d’usage, de modification etc .. de vos objets avant installation, cette dernière pouvant changer ces informations et fausser vos analyses futures.


5) Bien sur faire une SAV21 de votre système qui vous servira à redémarrer en cas de gros problèmes

Conserver cette bande vers vous jusqu’à la fin de votre opération complète !

, , Base64 en SQL avec les nouvelles fonctions de QSYS2 !

La 7.4 TR5 (et 7.3 TR11) ont apporté de nouvelles fonctions http dans QSYS2 en remplacement de celles fournies dans SYSTOOLS (cf https://www.volubis.fr/Pausecaf/PAUSECAF88.html).

Dans le même temps, nous avons droit à un refresh des fonctions utilitaires.

Parlons donc de l’encodage/décodage base64 !

Différences entre les fonctions fournies :

Les fonctions n’ont pas le même nom pour éviter toute ambiguïté :

Dans SYSTOOLS : BASE64ENCODE et BASE64DECODE

Dans QSYS2 : BASE64_ENCODE et BASE64_DECODE

L’implémentation des nouvelles fonctions (QSYS2) est basée sur Axis (en C natif), contrairement aux fonctions historiques de SYSTOOLS en Java. L’empreinte mémoire est donc bien meilleure avec les fonctions de QSYS2.

Surtout, les paramètres diffèrent : dans la version SYSTOOLS, la taille des paramètres est très limitée, et nous sommes donc sur du VARCHAR jusqu’à 4Ko maximum encodé. Les nouvelles versions utilisent des CLOB et BLOB jusqu’à 2Go !

Usages

Données caractères

On utilise régulièrement l’encodage base64 pour transmettre une authentification par profil/mot de passe, par exemple une authentification http basic.

Les deux fonctions renvoient bien sur le même résultat :

Si vous utilisez un convertisseur en ligne, vous n’obtenez pas le même résultat :

Par exemple sur https://simplycalc.com/base64-encode.php :

La raison est simple : l’encodage base64 a pour objectif d’exprimer sous forme de caractères une donnée binaire. Le paramètre en entrée des fonctions QSYS2.BASE64_ENCODE et SYSTOOLS.BASE64ENCODE sont donc un BLOB (Binary Large Object) ou un VARCHAR avec CCSID 65535 (signifie pas de conversion).

La chaine de caractères ‘toto’ est donc transmise ici en EBCDIC et c’est la valeur binaire correspondante qui est encodée en base64.

Pour être conforme au standard : convertissez les chaines de caractères en UTF-8 :

Pour décoder des données, on utilise SYSTOOLS.BASE64DECODE et QSYS2.BASE64_DECODE :

Le résultat affiché diffère.

La aussi c’est un effet de bord du changement de type de paramètre, ET de la configuration de ACS :

La fonction de SYSTOOLS étant en VARCHAR, elle est interprétée dans le CCSID du travail. La fonction de QSYS2 renvoyant un BLOB, il n’y a pas de conversion directe possible en caractères.

La valeur binaire renvoyée est bien la même. Si l’on teste en passant par un fichier :

Données binaires

L’objectif premier est tout de même de pouvoir travailler sur des valeurs binaires.

On utilise une image sur l’IFS en tant que donnée binaire à encoder. L’image fait 158Ko, une valeur très raisonnable.

Pour faciliter la démonstration, on travaille étape par étape avec des variables SQL.

Pour lire le fichier image en binaire :

Script de test :

Les résultats semblent concordants :

Mais :

C’est le problème de la longueur des paramètres des fonctions de SYSTOOLS !

Dans l’historique :

On a un SqlCode à 0 mais un SqlState en classe ‘01’ !

On décode notre image :

Les fichiers d’origine et le fichier encodé/décodé sont bien identiques !

Les nouvelles fonctions, au-delà de l’implémentation en C, nous apportent la possibilité d’encoder et décoder des « documents » (image, pdf …à) en base64. Très utile pour faire transiter des informations binaires dans nos web services par exemple !

Et la limite à 2Go semble raisonnable.

, , 5 requêtes pour contrôler vos PTFS

On ne dira jamais assez comment à quel point SQL nous simplifie la vie.
C’est d’autant plus vrai pour la gestion des correctifs

Voici 5 requêtes à garder pour vos contrôles de PTFs

1) Contrôle de la TR et de la version avec QSYS2.GROUP_PTF_INF


SELECT CURRENT SERVER CONCAT ‘ est en version ‘ CONCAT PTF_GROUP_TARGET_RELEASE
CONCAT ‘ et le niveau de TR est : ‘ CONCAT PTF_GROUP_LEVEL AS NIVEAU_DE_TECHNOLOGY_REFRESH
FROM QSYS2.GROUP_PTF_INFO WHERE PTF_GROUP_DESCRIPTION = ‘TECHNOLOGY REFRESH’
AND PTF_GROUP_STATUS = ‘INSTALLED’ ORDER BY PTF_GROUP_TARGET_RELEASE DESC
FETCH FIRST 1 ROWS ONLY

2) Contrôle des cumulatives sur le microcode et l’OS avec QSYS2.PTF_INFO

with result_ptf
as(
SELECT PTF_PRODUCT_ID , Max(PTF_IDENTIFIER) as last_ptf
FROM QSYS2.PTF_INFO
WHERE (PTF_PRODUCT_ID = ‘5770999’ and substr(PTF_IDENTIFIER , 1 , 2) = ‘TL’ ) or
(PTF_PRODUCT_ID = ‘5770SS1’ and substr(PTF_IDENTIFIER , 1 , 2) = ‘TC’ ) GROUP BY PTF_PRODUCT_ID
)
select PTF_PRODUCT_ID, date(’20’ concat substr(LAST_ptf, 3, 2) concat ‘-01-01’) +
(dec(substr(Last_PTF , 4, 3)) – 1 ) days as last_date_ptf
from result_ptf
where date(’20’ concat substr(LAST_ptf, 3, 2) concat ‘-01-01’) +
(dec(substr(Last_PTF , 4, 3)) – 1 ) days < (current_date – 6 months)

3) Contrôle si groupes à télécharger, nécessite une connexion avec SYSTOOLS.GROUP_PTF_CURRENCY


select
cast(substr(PTF_GROUP_TITLE, 1, 50) as char(50)) as Nom_groupe,
PTF_GROUP_LEVEL_AVAILABLE as niveau
from systools.group_ptf_currency
where ptf_group_level_installed <> ptf_group_level_available

4) Contrôle si groupes à appliquer, nécessite un IPL avec QSYS2.GROUP_PTF_INFO

SELECT * FROM GROUP_PTF_INFO WHERE PTF_GROUP_STATUS not in
(‘INSTALLED’, ‘RELATED GROUP’, ‘NOT APPLICABLE’))

5) Contrôle du firmware, nécessite une connexion avec SYSTOOLS.FIRMWARE_CURRENCY

SELECT * FROM SYSTOOLS.FIRMWARE_CURRENCY
WHERE FW_CURRENTFIXPACK <> FW_RECOMMENDED_UPGRADE and +
FW_RECOMMENDED_UPGRADE is not null ) with data

Remarque

Il en existe sans doute d’autres, la limite c’est votre imagination …