[Résolu]Automatisation STRDBMON

IBM i, configuration, commandes, ...
Répondre
AGL
Messages : 16
Enregistré le : ven. 15 sept. 2023, 08:33:28

[Résolu]Automatisation STRDBMON

Message par AGL »

Bonjour,

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é')                                                                               
    Quand il passe à la ligne 9500, mes variables sont donc bien entrées dans la commande

    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.      

      Je ne comprends pas ces messages CPD0078 et CPD0079. C’est comme si le programme tronquait les valeurs des variables OUTFILE et JOB à 10 caractères !

      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.                                                                                 
      
        Mon programme s’arrête ensuite avec le RETURN de la ligne 11500…

        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  * * * *
        Modifié en dernier par AGL le lun. 02 sept. 2024, 14:16:37, modifié 1 fois.
        Aurore

        nbonnet
        Messages : 214
        Enregistré le : mar. 11 sept. 2018, 08:20:13
        Localisation : Lyon

        Re: Automatisation STRDBMON

        Message par nbonnet »

        Bonjour,

        Je pense que c'est le formatage de la commande :

        Code : Tout sélectionner

        STRDBMON OUTFILE('DBMONTEST/MONALT0824')
                           JOB('*ALL/*ALL/*ALL') HOSTVAR(*SECURE) COMMENT('JOB *ALL/*ALL/*ALL supervisé')
        Sans les cotes :

        Code : Tout sélectionner

        STRDBMON OUTFILE(DBMONTEST/MONALT0824)
                           JOB(*ALL/*ALL/*ALL) HOSTVAR(*SECURE) COMMENT('JOB *ALL/*ALL/*ALL supervisé')    
        Nathanaël

        AGL
        Messages : 16
        Enregistré le : ven. 15 sept. 2023, 08:33:28

        Re: Automatisation STRDBMON

        Message par AGL »

        Bonjour Nathanaël,

        Merci pour la réponse rapide.
        En fait dans mon JOBSCDE j'avais fait ceci :

        Code : Tout sélectionner

         Commande à exécuter  . . . . . .   CALL PGM(LIBGEN400/DBMONGEN2) PARM(('DBMONTEST') ('MONALT') (300) ('*ALL/*ALL/*ALL'))  


        Si je modifie en retirant les cotes :

        Code : Tout sélectionner

         Commande à exécuter  . . . . . .   CALL PGM(LIBGEN400/DBMONGEN2) PARM((DBMONTEST) (MONALT) (300) (*ALL/*ALL/*ALL))                                           
         
        Je ne peux pas enregistrer ce jobscde car j'ai le message suivant :

        Code : Tout sélectionner

        Message . . . . :   Nom qualifié incorrect pour le paramètre PARM.          
        Cause . . . . . : Un nom qualifié a été indiqué pour un paramètre, alors    
          qu'une seule valeur était admise.                                         
        Que faire . . . : Effectuez l'une des opérations suivantes :                
            -- Retirez la barre oblique.                                            
            -- Si vous définissez une variable de langage avec une barre oblique,   
          placez la valeur entre apostrophes.                                       
            -- Si vous définissez une expression numérique, dans laquelle une       
          constante numérique est divisée par une variable, entrez un blanc avant la
          barre oblique.    


        Et finalement, quand je découpais le job en 3 (en distinguant chaque variable numéro, job et user en paramètre + en reconstruisant le job dans le programme) j'avais également le message d'erreur indiqué dans mon message initial à savoir que les logs m'indiquait des valeurs de variable sur 10 caractères :/
        Aurore

        AGL
        Messages : 16
        Enregistré le : ven. 15 sept. 2023, 08:33:28

        Re: Automatisation STRDBMON

        Message par AGL »

        Re Nathanaël,

        Pour être sûre que je ne me suis pas trompée dans mes premiers tests, j'ai revu mon programme pour découper le job avec son numéro, son user et le nom du job de manière à utiliser le CALL PGM sans barre oblique pour tester sans les cotes :

        Code : Tout sélectionner

        CALL PGM(LIBGEN400/DBMONGEN4) PARM((DBMONTEST) (TESTAU) (300) (*ALL) (*ALL) (QZDASOINIT))
        et j'ai le même problème. Dans les logs, il indique bien que ma commande est celle-ci (il récupère bien les variables )) :

        Code : Tout sélectionner

        *NONE      Commande                     30/08/24  14:46:30,006763  QCADRV       QSYS        0421     DBMONGEN4   LIBGEN400   00BF
                                             Message . . . . :    10100 - [b]STRDBMON OUTFILE('DBMONTEST/TESTAU0824')                       
                                               JOB('*ALL/*ALL/QZDASOINIT') HOSTVAR(*SECURE) COMMENT('JOB                                 
                                               *ALL/*ALL/QZDASOINIT supervisé')[/b]  


        Mais j'ai ensuite les messages suivant :

        Code : Tout sélectionner

        CPD0078    Diagnostic              30   30/08/24  14:46:30,006797  QCAFLD       QSYS        127B     DBMONGEN4   LIBGEN400   00BF
                                             Message . . . . :   [b]La valeur 'DBMONTEST/' du paramètre OUTFILE n'est pas un                
                                               nom correct[/b].                                                                              
        CPD0079    Diagnostic              30   30/08/24  14:46:30,006818  QCAFLD       QSYS        127B     DBMONGEN4   LIBGEN400   00BF
                                             Message . . . . :   [b]La valeur '*ALL/*ALL/' de JOB doit être un nom ou un nom                
                                               générique[/b].                                                                                
        
        et j'ai encore le CPF0000 qui s'affiche :

        Code : Tout sélectionner

        CPF0000    Information             00   30/08/24  14:46:30,007205  DBMONGEN4    LIBGEN400   00EF     *EXT                    *N  
                                             Message . . . . :   Texte non disponible pour le message CPF0000 du fichier                 
                                               QCPFMSG.              
        Aurore

        nbonnet
        Messages : 214
        Enregistré le : mar. 11 sept. 2018, 08:20:13
        Localisation : Lyon

        Re: Automatisation STRDBMON

        Message par nbonnet »

        C'est bien au niveau de la commande STRDBMON qu'il faut enlever les cotes dans le paramètre JOB
        Nathanaël

        AGL
        Messages : 16
        Enregistré le : ven. 15 sept. 2023, 08:33:28

        Re: Automatisation STRDBMON

        Message par AGL »

        Oui je comprends bien mais je ne vois pas comment retirer des cotes dans le CLP alors que je ne les ai moi-même pas mise (ni dans le programme source, ni dans le CALL PGM que je fais dans le JOBSCDE).

        Je vais continuer mes tests.
        Le dernier que j'ai fait est assez étrange.

        les 2 variables qui posent problème dans le STRDBMON(&MONOUTF pour la valeur OUTFILE et &JOB pour JOB) semblent vraiment être dû au nombre de caractère et non aux cotes.

        J'ai fait cette modification (juste pour &MONOUTF) : j'ai mis des guillemets pour tester :

        Code : Tout sélectionner

        STRDBMON   OUTFILE('"' *TCAT &MONOUTF *TCAT '"')
                   JOB(&JOB) HOSTVAR(*SECURE)           
                   COMMENT(&JOBMONCOM)                  
        
        L'erreur n'est plus la même pour l'OUTFILE : il ne me dit plus que la valeur doit être un nom ou nom générique mais que la valeur de la variable a plus de 10 caractères (d'ailleurs il compte le premier guillemet comme étant un caractère). C'est comme si dans mon CHGVAR (&MONOUTF) VALUE(&LIB *TCAT '/' *TCAT &FIC), il changeait la longueur de la variable &MONOUTF comme étant celle de &LIB ou de &FIC

        Pour rappel, voici la déclaration de mes variables :

        Code : Tout sélectionner

        DCL VAR(&MONOUTF) TYPE(*CHAR) LEN(25)
        DCL VAR(&LIB) TYPE(*CHAR) LEN(10)
        DCL VAR(&FIC) TYPE(*CHAR) LEN(10)
        je mets le nouveau message d'erreur reçu :

        Code : Tout sélectionner

        CPD0074    Diagnostic              30   30/08/24  16:12:35,007479  QCAFLD       QSYS        127B     DBMONGEN4   LIBGEN400   00C8 
                                             Message . . . . :   La valeur '"DBMONTEST' de OUTFILE comporte plus de 10                    
                                               caractères.   
        Aurore

        nbonnet
        Messages : 214
        Enregistré le : mar. 11 sept. 2018, 08:20:13
        Localisation : Lyon

        Re: Automatisation STRDBMON

        Message par nbonnet »

        Le code suivant fonctionne :

        Code : Tout sélectionner

        pgm parm(&lib &file &jobnum &jobuser &jobname)
        
        dcl &lib *char 10
        dcl &file *char 10
        dcl &jobnum *char 6
        dcl &jobuser *char 10
        dcl &jobname *char 10
        dcl &comment *char 50
        
        chgvar &comment value('JOB ' *bcat &jobnum *tcat '/' *tcat &jobuser *tcat +
                         '/' *tcat &jobname *bcat 'supervisé')
        STRDBMON OUTFILE(&lib/&file) +
                 JOB(&jobnum/&jobuser/&jobname) HOSTVAR(*SECURE) +
                 COMMENT(&comment)
        
        endpgm
        Cela génère toujours des cotes autour du numéro de job mais la commande est fonctionnelle
        Pour les paramètres composites, il est nécessaire d'avoir plusieurs variables (1 par valeur unitaire)
        Nathanaël

        AGL
        Messages : 16
        Enregistré le : ven. 15 sept. 2023, 08:33:28

        Re: Automatisation STRDBMON

        Message par AGL »

        Bonjour Nathanaël,
        Effectivement, c'était aussi simple que ça... ! Merci beaucoup !

        j'ai un autre petit soucis maintenant.
        Je souhaite indiquer dans le lancement de mon programme dans le scheduler, la durée du moniteur. J'ai donc déclaré une variable pour avoir la durée en seconde du moniteur comme ceci :

        Code : Tout sélectionner

        DCL VAR(&DLY) TYPE(*DEC) LEN(6 0)
        Le call de mon programme :
        CALL PGM(LIBGEN400/DBMONGEN4) PARM((DBMONTEST) (TESTAL) (300) (*ALL) (QUSER) (*ALL))

        Après mon STRBMON et après les vérifications que je fais lors du lancement de la commande, je fais ceci ( j'arrête le moniteur avec l'ID que j'ai récupéré plus haut après le temps imparti):

        Code : Tout sélectionner

        DLYJOB     DLY(&DLY)
        ENDDBMON   JOB(*ALL) MONID(&MONID)
        SNDUSRMSG  MSG('Moniteur, ' *BCAT &MONID *BCAT 'arrêté') MSGTYPE(*INFO)
        Le moniteur démarre bien mais j'ai ce message dans les logs :

        Code : Tout sélectionner

         13000 - SNDUSRMSG MSG('Moniteur, 4343452017 démarré') MSGTYPE(*INFO)   
         13600 - DLYJOB /* Paramètres non reproduits en raison de la gravité des
          erreurs. */                      
        La valeur décimale indiquée pour le paramètre DLY est incorrecte.   
        Erreur trouvée dans la commande DLYJOB.                             
        Erreur. CPF0001 non intercepté par DBMONGEN4 à la spécif 13600, inst
          X'012A'.                                                          
        Message CPF0001 reçu par DBMONGEN4 à l'instruction 13600. (C D I R)  


        Si je change mon call comme ceci (en mettant le délai entre guillemet) :

        Code : Tout sélectionner

        CALL PGM(LIBGEN400/DBMONGEN4) PARM((DBMONTEST) (TESTAL) ([b]"300"[/b]) (*ALL) (QUSER) (*ALL))
        Message comme quoi je n'ai pas de valeur

        Code : Tout sélectionner

        13600 - DLYJOB /* Paramètres non reproduits en raison de la gravité des erreurs. */                                                           
        La valeur décimale indiquée pour le paramètre DLY est incorrecte.   
        Erreur trouvée dans la commande DLYJOB.                             
        Erreur. CPF0001 non intercepté par DBMONGEN4 à la spécif 13600, inst
          X'012A'.    


        Si je change la déclaration de la variable &DLY comme étant un *CHAR et que j'enlève les guillemets dans l'appel du programme :

        Code : Tout sélectionner

        DCL VAR(&DLY) TYPE(*CHAR) LEN(6)

        Code : Tout sélectionner

        CALL PGM(LIBGEN400/DBMONGEN4) PARM((DBMONTEST) (TESTAL) (300) (*ALL) (QUSER) (*ALL))
        Erreur suivante :

        Code : Tout sélectionner

        13600 - DLYJOB DLY(X'000000030000')
        La valeur '██████    ' du paramètre DLY doit être numérique.
        Erreur trouvée dans la commande DLYJOB.                              
        Erreur. CPF0001 non intercepté par DBMONGEN4 à la spécif 13600, inst 
          X'012A'.  


        Je modifie le call en mettant le délai entre guillemets :

        Code : Tout sélectionner

        CALL PGM(LIBGEN400/DBMONGEN4) PARM((DBMONTEST) (TESTAL) ("300") (*ALL) (QUSER) (*ALL))


        Erreur suivante :

        Code : Tout sélectionner

        13600 - DLYJOB DLY("300")                                   
        La valeur '"300"     ' du paramètre DLY doit être numérique.
        Erreur trouvée dans la commande DLYJOB.                              
        Erreur. CPF0001 non intercepté par DBMONGEN4 à la spécif 13600, inst 
          X'012A'.                                                           
        Message CPF0001 reçu par DBMONGEN4 à l'instruction 13600. (C D I R)        



        J'ai donc voulu passer par une variable temporaire (&DLYD) :

        Code : Tout sélectionner

        DCL VAR(&DLY) TYPE(*CHAR) LEN(6)
        DCL VAR(&DLYD) TYPE(*DEC) LEN(6 0)
        Puis :

        Code : Tout sélectionner

        SNDUSRMSG  MSG('valeur DLY avant modif: ' *CAT &DLY)
        CHGVAR (&DLY) VALUE(%TRIM(&DLY))
        SNDUSRMSG  MSG('valeur DLY après modif: ' *CAT &DLY)
        CHGVAR (&DLYD) VALUE(&DLY)
        DLYJOB     DLY(&DLY)              
        ENDDBMON   JOB(*ALL) MONID(&MONID)
        Et le call :

        Code : Tout sélectionner

        CALL PGM(LIBGEN400/DBMONGEN4) PARM((DBMONTEST) (TESTAL) (300) (*ALL) (QUSER) (*ALL))
        message d'erreur :
        13100 - SNDUSRMSG
        MSG(X'A5819385A49940C4D3E84081A58195A34094968489867A40000000030000')
        valeur DLY avant modif: ██████

        et il reste bloqué la dessus...

        Je m'y perds et ça se trouve ce n'est pas grand chose avec cette histoire de valeur décimale...

        Une piste ?
        Aurore

        nbonnet
        Messages : 214
        Enregistré le : mar. 11 sept. 2018, 08:20:13
        Localisation : Lyon

        Re: Automatisation STRDBMON

        Message par nbonnet »

        Par défaut, la commande CALL transmet les numériques en 15 dont 5.

        Essayez avec :

        Code : Tout sélectionner

        CALL PGM(LIBGEN400/DBMONGEN4)
             PARM((DBMONTEST) (TESTAL) (300 (*DEC 6 0)) (*ALL) (QUSER) (*ALL))
        Modifié en dernier par nbonnet le mer. 04 sept. 2024, 09:29:37, modifié 1 fois.
        Nathanaël

        AGL
        Messages : 16
        Enregistré le : ven. 15 sept. 2023, 08:33:28

        Re: Automatisation STRDBMON

        Message par AGL »

        Nathanaël,

        Tout fonctionne !
        Un grand merci pour votre patience et rapidité de réponse :)

        Même s'il doit être possible de l'optimiser, je mets le code corrigé et l'appel de programme dans le scheduler si ça intéresse quelqu'un :

        Exemple de l'appel du programme dans le scheduler :

        Code : Tout sélectionner

        CALL PGM(LIBGEN400/DBMONGEN4) PARM((DBMONTEST) (TESTAL) (300 (*DEC 6 0)) (*ALL) (QUSER) (*ALL))
        qui correspond aux paramètres déclarés dans le PGM comme ceci :

        Code : Tout sélectionner

        PGM parm(&LIB &FIC &DLY &JOBNUM &JOBUSR &JOBNOM)
        Code entier :

        Code : Tout sélectionner

        /*              -> &JOBNOM = NOM DU JOB                                       */
        /*   -----------------------------------------------------------------------  */
        /*            Valeurs utilisées dans le programme pour retourner des          */
        /*                informations lors de l'exécution du programme               */
        /*   -----------------------------------------------------------------------  */
        /*              -> &MSGID = ID du message                                     */
        /*              -> &MONID = ID du moniteur                                    */
        /*              -> &MSGDATA  = description du message                         */
         /*             -> &MSGF = détail du message récupéré dans les msg d'erreurs  */
        /*              -> &FIC_SUB = utilisé pour faire un TRIM de &FIC              */
        /*              -> &DATE = date du jour récupérée                             */
        /*              -> &MOIS = mois de la date du jour (extrait de &DATE)         */
        /*              -> &JOUR = jour de la date du jour (extrait de &DATE)         */
        /*              -> &JOBMONCOM = commentaire du job monitoré dans STRDBMON     */
        /*   -----------------------------------------------------------------------  */
                                                                                        
        PGM parm(&LIB &FIC &DLY &JOBNUM &JOBUSR &JOBNOM)                                
                                                                                        
        /*   -----------------------------------------------------------------------  */
        /* Déclaration des paramètres */                                                
        /*   -----------------------------------------------------------------------  */
          DCL VAR(&LIB) TYPE(*CHAR) LEN(25)                                             
          DCL VAR(&FIC) TYPE(*CHAR) LEN(25)                                             
          DCL VAR(&DLY) TYPE(*DEC) LEN(6 0)                                             
          DCL VAR(&JOBNUM) TYPE(*CHAR) LEN(6)                                           
          DCL VAR(&JOBNOM) TYPE(*CHAR) LEN(10)                                          
          DCL VAR(&JOBUSR) TYPE(*CHAR) LEN(10)                                          
        /*   -----------------------------------------------------------------------  */
        /* Déclaration des variables de travail */                                      
        /*   -----------------------------------------------------------------------  */
          DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)                                     
          DCL        VAR(&MSGDATA)  TYPE(*CHAR) LEN(100)                                
          DCL        VAR(&MSGF)    TYPE(*CHAR) LEN(10)                                  
          DCL        VAR(&MONID)  TYPE(*CHAR) LEN(10)                                   
          DCL        VAR(&FIC_SUB) TYPE(*CHAR) LEN(6)                                   
          DCL        VAR(&DATE) TYPE(*CHAR) LEN(6)                                      
          DCL        VAR(&MOIS) TYPE(*CHAR) LEN(2)                                      
          DCL        VAR(&JOUR) TYPE(*CHAR) LEN(2)                                      
          DCL        VAR(&JOBMONCOM) TYPE(*CHAR) LEN(50)                                
        /*   -----------------------------------------------------------------------  */
        /* Contrôle avant exécution du moniteur */                                      
        /*   -----------------------------------------------------------------------  */
                                                                                        
        /* Vérifier l'existance de la bib. recevant le moniteur (si non arrêt)        */
            CHKOBJ &LIB  *LIB                                                           
               MONMSG CPF9801 EXEC(DO)                                                  
                     SNDUSRMSG  MSG('Bibliothèque,' *BCAT &LIB *BCAT 'inexistante'  +   
                                *BCAT 'moniteur non démarré') MSGTYPE(*INFO)            
                                RETURN                                                  
               ENDDO                                                                    
                                                                                        
        /* Le fichier de monitoring entré en paramètre ne doit pas dépasser 6         */
        /* caractères car on va le suffixer par mmjj pour historiser les moniteurs    */
        /* si + de 6 caractères, on arrête le moniteur                                */
            CHGVAR VAR(&FIC_SUB) VALUE(%SST(&FIC 1 6))                                  
               IF COND(&FIC = &FIC_SUB) THEN(DO)                                        
                   GOTO PREPAMON                                                        
                 ENDDO                                                                  
                 ELSE DO                                                                
                   SNDPGMMSG MSG('Le fichier entré en paramètre ne doit contenir' *CAT + 
                   ' 6 caractères max car on rajoute mmjj en suffixe')                   
                     RETURN                                                              
               ENDDO                                                                     
                                                                                         
                                                                                         
                                                                                         
        /*  -----------------------------------------------------------------------   */ 
        /*  Préparation du nom de fichier qui va recevoir les données du moniteur */     
        /*  -----------------------------------------------------------------------   */ 
        PREPAMON:                                                                        
        /* Récupérer le mois et le jour d'aujourd'hui pour pouvoir suffixer le nom    */ 
        /* du fichier de monitoring avec JJMM                                         */ 
             RTVSYSVAL SYSVAL(QDATE) RTNVAR(&DATE)                                       
             CHGVAR VAR(&MOIS) VALUE(%SST(&DATE 3 2))                                    
             CHGVAR VAR(&JOUR) VALUE(%SST(&DATE 5 2))                                    
             CHGVAR VAR(&FIC) VALUE(&FIC *TCAT &MOIS *TCAT &JOUR)                        
                                                                                         
        /* Vérifier qu'il n'existe pas déjà un moniteur à ce nom (si oui, arrêt)      */ 
            CHKOBJ &LIB/&FIC *FILE                                                       
               MONMSG CPF9801 EXEC(DO)                                                  
                  GOTO DEMMON                                                           
               ENDDO                                                                    
                      SNDUSRMSG  MSG('Moniteur' *BCAT &FIC *BCAT 'déjà existant'  +     
                                 *BCAT 'moniteur non démarré') MSGTYPE(*INFO)           
                                 RETURN                                                 
        /*  -----------------------------------------------------------------------   */
        /* Démarrage du moniteur                                                     */ 
        /*  -----------------------------------------------------------------------   */
        DEMMON:                                                                         
           CHGVAR (&JOBMONCOM) VALUE('JOB ' *BCAT &JOBNUM *TCAT '/' *TCAT &JOBUSR +     
                  *TCAT '/' *TCAT &JOBNOM *BCAT 'supervisé')                            
                                                                                        
           STRDBMON OUTFILE(&LIB/&FIC) +                                                
                    JOB(&JOBNUM/&JOBUSR/&JOBNOM) HOSTVAR(*SECURE) +                     
                    COMMENT(&JOBMONCOM)                                                 
        /* Intercepter une erreur spécifique comme CPF9898 */                           
           MONMSG CPF9898 EXEC(DO)                                                      
           SNDPGMMSG  MSGID(CPF9898) MSGF(QCPFMSG)                                  +   
                MSGDTA('Erreur spécifique CPF9898 lors du lancement de STRDBMON')   +   
                TOPGMQ(*EXT) MSGTYPE(*INFO)                                          
            RETURN                                                                   
           ENDDO                                                                     
                                                                                     
        /* Intercepter toutes les autres erreurs non gérées spécifiquement */        
           MONMSG CPF0000 EXEC(DO)                                                   
             /* Récupérer les détails du message */                                  
              RCVMSG MSGTYPE(*EXCP) MSGDTA(&MSGDATA) MSGID(&MSGID) MSGF(&MSGF)       
             /* Traitement de l'erreur - Journalisation, notification, etc. */       
              SNDPGMMSG  MSGID(CPF0000) MSGF(QCPFMSG)                             +  
                MSGDTA('Erreur inattendue:' *BCAT &MSGID *BCAT &MSGDATA)            +
                TOPGMQ(*EXT) MSGTYPE(*INFO)                                          
              RETURN                                                                 
           ENDDO                                                                     
                                                                                     
           /* Lecture de l'id du moniteur  */                                        
           /* Message  CPI436A             */                                        
             DOUNTIL    COND(&MSGID = 'CPI436A')                                     
                        RCVMSG   MSGQ(*PGMQ) MSGDTA(&MSGDATA) MSGID(&MSGID)          
             ENDDO      
             CHGVAR     VAR(&MONID) VALUE(%SST(&MSGDATA 29 10))                        
             SNDUSRMSG  MSG('Moniteur,' *BCAT &MONID *BCAT 'démarré') MSGTYPE(*INFO)   
           /* Retardement de l'arrêt en secondes */                                    
             DLYJOB     DLY(&DLY)                                                      
             ENDDBMON   JOB(*ALL) MONID(&MONID)                                        
             SNDUSRMSG  MSG('Moniteur, ' *BCAT &MONID *BCAT 'arrêté') MSGTYPE(*INFO)   
                                                                                       
        ENDPGM  
        Aurore

        Répondre