, Comment gérer facilement vos filtres de développement dans RDI ?

Voici 2 solutions :

La première solution la plus connue est de définir un filtre au niveau des objets.
En prenant par exemple les fichiers commençant par Q

Une fois ouvert vous avez

Vous devez ouvrir tous vos fichiers sources !

Il y a une deuxième méthode
Vous devez créer le filtre pour le premier fichier source

Ensuite vous pouvez ajouter une nouvelle chaine de filtre, répétez l’opération autant de fois que nécessaire.

Vous obtenez une vue ou vous avez tous vos sources à la suite

Dans la deuxième solution, vous pouvez être plus fin en utilisant des noms génériques de membres, vous pouvez également indiquer des bibliothèques différentes pour vos fichiers.

, , Comment retrouver le label de bande ?

Vous voulez connaitre le label qui est actuellement monté sur une unité de bande !

Rappel

Pourquoi c’est très important de gérer les noms de labels ?


D’abord pour des questions d’organisation c’est mieux d’avoir LUNDI, MARDI, MERCRE etc.. ou HEBDO1 , MOIS1 que XXXXX1.
Mais l’autre raison est qu’en faisant correspondre le volume à une bande physique, on peut avoir des statistiques qui peuvent par exemple vous indiquer qu’une bande est altérée !
C’est en utilisant la commande PRTERRLOG ou par SST que vous pouvez avoir ces informations

exemple dans un scripte SQL

cl:PRTERRLOG TYPE(VOLSTAT) OUTPUT(OUTFILE)
OUTFILE(QTEMP/ERRLOG)
VOLTYPE(3580) — a trouver sur l’unité
VOLSTATTYP(*SESSION) ;

SELECT SPHMSR, SPSNAM, SPLDAT, SPLTIM, substr(SPKVID, 1, 6) as vol ,
SPVOPR, SPVOPW, SPVOTR, SPVOTW FROM qtemp/ERRLOG

Vous pouvez tester pour savoir si le volume monté est le bon par la commande suivante :

CHKTAP DEV(nomdevice) VOL(nomvolume)
monmsg (CPF6720 CPF6772)

CPF6720 Volume &2 incorrect sur unité &1.
CPF6772 Le volume chargé sur l’unité &1 ne peut pas être traité.

Mais vous ne connaissez pas le volume qui est monté à cet instant

Voici 3 méthodes pour connaitre le volume monté sur une bande

La première méthode, consiste à lire le message envoyé par le chktap

         CHKTAP     DEV(&DEV)                                 
         RCVMSG     MSGTYPE(*COMP) RMV(*YES) MSGDTA(&MSGDTA) +
                      MSGID(&MSGID) 
if cond(&msgid = 'CPC6778') then(do)                              
               chgvar &vol %sst(&msgdta 11 6)  
 enddo                           

C’est la plus simple des méthodes à mettre à en œuvre .

La deuxième méthode, consiste à lire la sortie d’une dsptap

/* declaration du fichier système pour la compile / 
dclf qsys/QATADOF 
/ génération du fichier avec un enreg  /
 DSPTAP DEV(&dev )            + 
        SEQNBR(FIRST ONLY)  + 
        OUTPUT(OUTFILE)      + 

        OUTFILE(QTEMP/WATADOF)  

/*Substitution pour lire le fichier généré */

OVRDBF FILE(QATADOF)          +

       TOFILE(QTEMP/WATADOF)  + 

       LVLCHK(NO)    
/ lecture du fichier /       
RCVF
/ traitement des informations /
 chgvar &vol %sst(&RDVOLL 5 6) 
/Arret de la Substitution  */

DLTOVR FILE(QATADOF)

Cette méthode est un peu plus lourde, à utiliser plutôt si on veut d’autres informations, voir description du fichier qsys/QATADOF

Le DSPTAP peut être également utilisé, pour connaitre le contenu d’une bande, pour effectuer des recherches

La troisième solution c’est par l’api QTARTLBL

/* déclarations nécessaires l’appel de QTARTLBL */

         DCL        VAR(&RCV) TYPE(*CHAR) LEN(220)              
         DCL        VAR(&RCVLEN) TYPE(*CHAR) LEN(4) +           
                      VALUE(X'000000DC')                        
         DCL        VAR(&FORMAT) TYPE(*CHAR) LEN(8) +           
                      VALUE('RLBL0100')                         
         DCL        VAR(&DEV) TYPE(*CHAR) LEN(10)               
         DCL        VAR(&REQQUAL) TYPE(*CHAR) LEN(44) +         
                      VALUE('      *ALL             *FIRST    + 
                      *ONLY     0')                             
         DCL        VAR(&REQQUALLEN) TYPE(*CHAR) LEN(4) +       
                      VALUE(X'0000002C')                        
         DCL        VAR(&ERR) TYPE(*CHAR) LEN(256)              
/* appel de l'api QTARTLBL /
CALL       PGM(QTARTLBL) PARM(&RCV &RCVLEN &FORMAT +
             &DEV    &REQQUAL &REQQUALLEN &ERR)
/ lecture du volume ou en cas d'erreur envoi du message CPFXXXX */
if cond(%sst(&err 09 7) *eq ' ') then(do)
chgvar &vol %sst(&rcv 29 6)
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('Le +
volume sur l''unité, ' *BCAT &DEV *BCAT +
'est' BCAT &VOL) MSGTYPE(COMP)
return
enddo
else do
SNDPGMMSG MSGID(CPF9898) MSGF(QCPFMSG) MSGDTA('Erreur +
sur l''unité, ' *BCAT &DEV *BCAT 'MSGID:' +
BCAT %SST(&ERR 09 7)) MSGTYPE(COMP)
chgvar &vol 'ERREUR'
return
enddo

C’est une bonne méthode, mais elle peut être un plus compliquée à mettre en oeuvre dans mon cas j’ai simplifié au maximum

En résumé :

Voila, vous savez maintenant lire le nom du volume monté sur votre bande, après il faut prendre la décision en cas de volume erroné.

La règle restant « il vaut mieux une sauvegarde sur le mauvais volume, que pas de sauvegarde du tout !

La deuxième règle, c’est une bande qui comporte des erreurs doit être automatiquement retirée des bandes actives.

Si vous avez des structures plus grosses vous utiliseriez BRMS qui vous simplifiera votre gestion

, , Migrer les jobs de Job scheduler vers Advanced job scheduler.

Rappel :

Sur l’IBMi il existe un scheduler standard celui qui se cache derrière la commande WRKJOBSCDE.
Il est très rudimentaire, vous n’avez pas d’historique ni de dépendance travaux.
C’est un unique objet, QDFTJOBSCD de type *JOBSCD qui est stocké dans la bibliothèque QUSRSYS.
C’est le travail QSYSSCD qui tourne dans QCTL


QCTL QSYS SBS 0,0
QSYSSCD QPGMR BCH 0,0 PGM-QEZSCNEP


Attention vous devez le sauvegarder par SAVOBJ par exemple, vous pouvez également l’envoyer sur une autre machine et le restaurer par un RSTOBJ

IBM propose un autre produit qui s’appelle job scheduler advanced c’est le produit 5770JS1, il est payant, mais il permet de faire beaucoup plus de choses !
Pour y accéder en mode 5250 ==>GO JS, sinon vous pouvez y accéder par l’interface web de navigator for i
Son paramétrage est composé de fichiers qui sont stockés dans la bibliothèque QUSRIJS

Voici, comment reprendre les travaux de job scheduler vers advanced job scheduler, si vous choisissez de passer du premier vers le deuxième

La première méthode si vous avez peu de commandes dans le scheduler !


Go cmdjs

Option 5

Option 7

Option 8 en face de chaque job à migrer_

Ça produit une commande de ce type
ADDJOBJS JOB(nomjob)               
         SCDCDE(DAILY)                
         TIME(1815)                    
         DAY(MON *TUE *WED THU)      
         TEXT('Votre texte')     
         CMD(CALL PGM(<lib/pgm))
         RCYACN(SBMRLS)               
         JOBD(USRPRF)                 
         JOBQ(QGPL/QS36EVOKE)          
         USER(SYSTEM)                  
         MSGQ(USRPRF)      

Si vous désirez automatiser cette opération.

Attention le job scheduler standard n’est pas composé de fichiers contrairement à advanced job scheduler qui lui en est composé

Par exemple pour AJS :
Job actuellement planifiés : select * from QUSRIJS/QAIJSMST where JMSTS <> ‘*HELD’
Historique : select * from QUSRIJS/QAIJSHST
Mais heureusement SQL as a service a résolu ce problème en créant une vue qui vous permet d’accéder aux job planifiés dans job scheduler !
select * from QSYS2.SCHEDULED_JOB_INFO
pour limiter aux jobs actifs
SELECT * FROM QSYS2.SCHEDULED_JOB_INFO
where status <> ‘HELD’


Il vous suffit donc de lire cette vue et pour chaque ligne de faire un
ADDJOBJS en adaptant les paramètres

Conseil :

Commencer par une ou 2 commandes et n’écrivez pas directement dans les fichiers de JSA. mais faites un ADDJOBJS