Je vous sollicite car je ne m’en sors pas avec mon CLP que j’ai créé pour faire des DBMON de manière automatique (je souhaite pouvoir les exécuter en HNO suivant les besoins via le JOBSCDE)
Pour cela, j’ai créé un CLP que j’appellerai avec 4 variables :
- &LIB = La bibliothèque qui va stocker les données
- &FIC = Le fichier qui va stocker les données
- &DLY = le temps d’exécution du STRDBMON
- &JOB = le nom du job à superviser (au début de mes tests, je l’avais découpé en 3 variables (numéro, user et job) mais je me dis que ce n’est pas la peine et vu que j’ai rencontré des problèmes, j’ai voulu réduire…
Je fais quelques vérifications avant de lancer la commande STRDBMON :
- L’existence de ma bibliothèque qui va recevoir le fichier de monitoring
- Si le fichier qui va recevoir les données est bien sur 6 caractères (ou moins) car je vais le suffixer de la date du jour au format mmjj
Pendant l’exécution du STRDBMON, je récupère les éventuelles erreurs qui pourraient arriver :
- CPF9898 : il me semble que cet ID de message est lié à un problème de déclaration du job à superviser ou un paramètre manquant
- CPF0000 : tout autre problème de STRDBMON
- CPI436A : pour trouver quand démarre le STRDBMON
Lors de l’exécution de mon programme via le jobscde, voici les log que je récupère :
Code : Tout sélectionner
*NONE Commande 30/08/24 11:56:05,022179 QCADRV QSYS 0421 DBMONGEN2 LIBGEN400 00AA
Message . . . . : 9500 - STRDBMON OUTFILE('DBMONTEST/MONALT0824')
JOB('*ALL/*ALL/*ALL') HOSTVAR(*SECURE) COMMENT('JOB *ALL/*ALL/*ALL
supervisé')
Puis …
Code : Tout sélectionner
CPD0078 Diagnostic 30 30/08/24 11:56:05,022202 QCAFLD QSYS 127B DBMONGEN2 LIBGEN400 00AA
Message . . . . : La valeur 'DBMONTEST/' du paramètre OUTFILE n'est pas un
nom correct.
CPD0079 Diagnostic 30 30/08/24 11:56:05,022226 QCAFLD QSYS 127B DBMONGEN2 LIBGEN400 00AA
Message . . . . : La valeur '*ALL/*ALL/' de JOB doit être un nom ou un nom
générique.
Puis… je ne reçois pas de message CPF9898 mais le message CPF0000 qui ne me décrit pas grand-chose :
Code : Tout sélectionner
*NONE Commande 30/08/24 11:56:05,022496 QCADRV QSYS 0421 DBMONGEN2 LIBGEN400 00DA
Message . . . . : 11200 - SNDPGMMSG MSGID(CPF0000) MSGF(QCPFMSG)
MSGDTA('Erreur inattendue: CPF0001 STRDBMON') TOPGMQ(*EXT) MSGTYPE(*INFO)
CPF0000 Information 00 30/08/24 11:56:05,022538 DBMONGEN2 LIBGEN400 00DA *EXT *N
Message . . . . : Texte non disponible pour le message CPF0000 du fichier
QCPFMSG.
Pourtant, j’ai bien déclaré mes variables qui vont être utilisées dans le STRDBMON :
- DCL VAR(&JOB) TYPE(*CHAR) LEN(26)
- DCL VAR(&MONOUTF) TYPE(*CHAR) LEN(25)
Si vous avez une piste, je suis preneuse
Voici le code :
Code : Tout sélectionner
100 /* Programme qui démarre un moniteur de base de données */
200 /* il peut être utilisé pour différents besoins d'analyse car */
300 /* les valeurs suivantes sont à renseigner en l'appelant : */
400 /* ----------------------------------------------------------------------- */
500 /* -> &LIB = bibliothèque qui va stocker l'analyse */
600 /* -> &FIC = fichier d'analyse (indiquer sur 6 car. max) */
700 /* -> &DLY = temps d'exécution du moniteur */
800 /* -> &JOB = nom du job */
900 /* ----------------------------------------------------------------------- */
1000 /* Valeurs utilisées dans le programme pour retourner des */
1100 /* informations lors de l'exécution du programme */
1200 /* ----------------------------------------------------------------------- */
1300 /* -> &MSGID = ID du message */
1400 /* -> &MONID = ID du moniteur */
1500 /* -> &MSGDATA = description du message */
1600 /* ----------------------------------------------------------------------- */
1700
1800 PGM parm(&LIB &FIC &DLY &JOB)
1900
2000
2100 /* ----------------------------------------------------------------------- */
2200 /* Déclaration des paramètres */
2300 /* ----------------------------------------------------------------------- */
2400 DCL VAR(&LIB) TYPE(*CHAR) LEN(10)
2500 DCL VAR(&FIC) TYPE(*CHAR) LEN(10)
2600 DCL VAR(&DLY) TYPE(*CHAR) LEN(6)
2700 DCL VAR(&JOB) TYPE(*CHAR) LEN(26)
2800 /* ----------------------------------------------------------------------- */
2900 /* Déclaration des variables de travail */
3000 /* ----------------------------------------------------------------------- */
3100 DCL VAR(&MSGID) TYPE(*CHAR) LEN(7)
3200 DCL VAR(&MSGDATA) TYPE(*CHAR) LEN(100)
3300 DCL VAR(&MSGF) TYPE(*CHAR) LEN(10)
3400 DCL VAR(&MONID) TYPE(*CHAR) LEN(10)
3500 DCL VAR(&FIC_SUB) TYPE(*CHAR) LEN(6)
3600 DCL VAR(&DATE) TYPE(*CHAR) LEN(6)
3700 DCL VAR(&MOIS) TYPE(*CHAR) LEN(2)
3800 DCL VAR(&JOUR) TYPE(*CHAR) LEN(2)
3900 DCL VAR(&JOBMONCOM) TYPE(*CHAR) LEN(50)
4000 DCL VAR(&MONOUTF) TYPE(*CHAR) LEN(25)
4100
4200 /* ----------------------------------------------------------------------- */
4300 /* Contrôle avant exécution du moniteur */
4400 /* ----------------------------------------------------------------------- */
4500
4600 /* Vérifier l'existance de la bib. recevant le moniteur (si non arrêt) */
4700 CHKOBJ &LIB *LIB
4800 MONMSG CPF9801 EXEC(DO)
4900 SNDUSRMSG MSG('Bibliothèque,' *BCAT &LIB *BCAT 'inexistante' +
5000 *BCAT 'moniteur non démarré') MSGTYPE(*INFO)
5100 RETURN
5200 ENDDO
5300
5400 /* Le fichier de monitoring entré en paramètre ne doit pas dépasser 6 */
5500 /* caractères car on va le suffixer par mmjj pour historiser les moniteurs */
5600 /* si + de 6 caractères, on arrête le moniteur */
5700 CHGVAR VAR(&FIC_SUB) VALUE(%SST(&FIC 1 6))
5800 IF COND(&FIC = &FIC_SUB) THEN(DO)
5900 GOTO PREPAMON
6000 ENDDO
6100 ELSE DO
6200 SNDPGMMSG MSG('Le fichier entré en paramètre ne doit contenir' *CAT +
6300 ' 6 caractères max car on rajoute mmjj en suffixe')
6400 RETURN
6500 ENDDO
6600
6700
6800
6900 /* ----------------------------------------------------------------------- */
7000 /* Préparation du nom de fichier qui va recevoir les données du moniteur */
7100 /* ----------------------------------------------------------------------- */
7200 PREPAMON:
7300 /* Récupérer le mois et le jour d'aujourd'hui pour pouvoir suffixer le nom */
7400 /* du fichier de monitoring avec JJMM */
7500 RTVSYSVAL SYSVAL(QDATE) RTNVAR(&DATE)
7600 CHGVAR VAR(&MOIS) VALUE(%SST(&DATE 3 2))
7700 CHGVAR VAR(&JOUR) VALUE(%SST(&DATE 5 2))
7800 CHGVAR VAR(&FIC) VALUE(&FIC *TCAT &MOIS *TCAT &JOUR)
7900
8000 /* Vérifier qu'il n'existe pas déjà un moniteur à ce nom (si oui, arrêt) */
8100 CHKOBJ &LIB/&FIC *FILE
8200 MONMSG CPF9801 EXEC(DO)
8300 GOTO DEMMON
8400 ENDDO
8500 SNDUSRMSG MSG('Moniteur' *BCAT &FIC *BCAT 'déjà existant' +
8600 *BCAT 'moniteur non démarré') MSGTYPE(*INFO)
8700 RETURN
8800 /* ----------------------------------------------------------------------- */
8900 /* Démarrage du moniteur */
9000 /* ----------------------------------------------------------------------- */
9100 DEMMON:
9200 CHGVAR (&MONOUTF) VALUE(&LIB *TCAT '/' *TCAT &FIC)
9300 CHGVAR (&JOBMONCOM) VALUE('JOB ' *CAT &JOB *BCAT 'supervisé')
9400
9500 STRDBMON OUTFILE(&MONOUTF) +
9600 JOB(&JOB) HOSTVAR(*SECURE) +
9700 COMMENT(&JOBMONCOM)
9800
9900 /* Intercepter une erreur spécifique comme CPF9898 */
10000 MONMSG CPF9898 EXEC(DO)
10100 SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) +
10200 MSGDTA('Erreur spécifique CPF9898 lors du lancement de STRDBMON') +
10300 TOPGMQ(*EXT) MSGTYPE(*INFO)
10400 RETURN
10500 ENDDO
10600
10700 /* Intercepter toutes les autres erreurs non gérées spécifiquement */
10800 MONMSG CPF0000 EXEC(DO)
10900 /* Récupérer les détails du message */
11000 RCVMSG MSGTYPE(*EXCP) MSGDTA(&MSGDATA) MSGID(&MSGID) MSGF(&MSGF)
11100 /* Traitement de l'erreur - Journalisation, notification, etc. */
11200 SNDPGMMSG MSGID(CPF0000) MSGF(QCPFMSG) +
11300 MSGDTA('Erreur inattendue:' *BCAT &MSGID *BCAT &MSGDATA) +
11400 TOPGMQ(*EXT) MSGTYPE(*INFO)
11500 RETURN
11600 ENDDO
11700
11800 /* Lecture de l'id du moniteur */
11900 /* Message CPI436A */
12000 DOUNTIL COND(&MSGID = 'CPI436A')
12100 RCVMSG MSGQ(*PGMQ) MSGDTA(&MSGDATA) MSGID(&MSGID)
12200 ENDDO
12300 CHGVAR VAR(&MONID) VALUE(%SST(&MSGDATA 29 10))
12400 SNDUSRMSG MSG('Moniteur,' *BCAT &MONID *BCAT 'démarré') MSGTYPE(*INFO)
12500
12600 /* Retardement de l'arrêt en secondes */
12700 DLYJOB DLY(&DLY)
12800 ENDDBMON JOB(*ALL) MONID(&MONID)
12900 SNDUSRMSG MSG('Moniteur, ' *BCAT &MONID *BCAT 'arrêté') MSGTYPE(*INFO)
13000
13100 ENDPGM
* * * * F I N D U S O U R C E * * * *