//BCHJOB JOB(JABSENT) JOBD(NERONI2/NERONI2) OUTQ(QPRINT) + ENDSEV(60) LOG(4 00 *SECLVL) MSGQ(*USRPRF) /* Open source scaricabile da www.neroni.it */ /* LA JOB DESCRIPTION "NERONI2/NERONI2" DEVE PREESISTERE. PUO' ESSERE */ /* IDENTICA A QBATCH E PUO' ESSERE SOSTITUITA DA QBATCH O SIMILE. */ /* From System: "S65D69DA" */ /* From Library: "NERONI2" */ /* Unload Time: 2014-05-15 14:57 */ /* To File : "JABSENT" */ /* To Library : "NERONI2" */ /* To Text : "Signal absence. Src" */ /********* INIZIO ISTRUZIONI *******************************************/ /* LE SUCCESSIVE ISTRUZIONI PERMETTONO DI RICARICARE I SORGENTI. */ /* 1) DA UN VIDEO COMANDI DELL'AS400 RICEVENTE */ /* CREARE UN FILE SORGENTE DI LUNGHEZZA RECORD 112: */ /* CRTSRCPF FILE(NERONI2/STRINGHE) RCDLEN(112) */ /* 2) SPOSTARE IL FILE "JABSENT.txt" NELL'INDIRIZZARIO */ /* DI UN PC CONNESSO IN RETE CON L'AS400 RICEVENTE */ /* (AD ES.: "c:\"). */ /* 3) DAL VIDEO COMANDI DEL PC CHIAMARE FTP: */ /* ftp nomeas400 */ /* 4) DIGITARE UTENTE E PASSWORD. */ /* 5) ESEGUIRE IL COMANDO DI COPIA DA FILE PC A MEMBRO AS400: */ /* put "c:\JABSENT.txt" "/qsys.lib/NERONI2.lib/stringhe.file/JABSENT.mbr" */ /* 6) ABBANDONARE FTP: */ /* quit */ /* 7) DA UN VIDEO COMANDI DELL'AS400 RICEVENTE */ /* ESEGUIRE LA STRINGA COPIATA NEL MEMBRO SORGENTE: */ /* SBMDBJOB FILE(NERONI2/STRINGHE) MBR(JABSENT) JOBQ(QBATCH) */ /* LE SUCCESSIVE ISTRUZIONI PERMETTONO DI CREARE L'UTILITY. */ /* 8) DA UN VIDEO COMANDI DELL'AS400 RICEVENTE */ /* ESEGUIRE LA STRINGA O LE STRINGHE SORGENTE DI TIPO SEU "CL" */ /* (IL CUI NOME TERMINA SEMPRE CON ".") */ /* PRESENTI NEL FILE RICARICATO "NERONI2/JABSENT" */ /* FACENDO ATTENZIONE ALL'ORDINE DI ESECUZIONE INDICATO NEL */ /* MEMBRO FACOLTATIVO "A.LEGGIMI", AD ESEMPIO: */ /* SBMDBJOB FILE(NERONI2/JABSENT) MBR(JABSENT.) JOBQ(QBATCH) */ /********* FINE ISTRUZIONI *********************************************/ /* Crea la libreria. */ MKDIR DIR('/qsys.lib/NERONI2.lib') CHGLIB LIB(NERONI2) TEXT('Utility di Claudio Neroni') /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP NERONI2 QGPL) /* Crea il file sorgente. */ DLTF FILE(NERONI2/JABSENT) CRTSRCPF FILE(NERONI2/JABSENT) RCDLEN(112) + TEXT('Signal absence. Src') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JABSENT) TOFILE(NERONI2/JABSENT) + TOMBR(JABSENT) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JABSENT) MBR(JABSENT) + SRCTYPE(RPGLE) + TEXT('Signal absence. Signal') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JABSENT.) TOFILE(NERONI2/JABSENT) + TOMBR(JABSENT.) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JABSENT) MBR(JABSENT.) + SRCTYPE(CL) + TEXT('Signal absence. CrtJs') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JABSENTT) TOFILE(NERONI2/JABSENT) + TOMBR(JABSENTT) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JABSENT) MBR(JABSENTT) + SRCTYPE(CLLE) + TEXT('Signal absence. Test') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JABSENT1) TOFILE(NERONI2/JABSENT) + TOMBR(JABSENT1) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JABSENT) MBR(JABSENT1) + SRCTYPE(CLLE) + TEXT('Signal absence. Completion') /*---------------------------------------------------------------------*/ //DATA FILE(JABSENT) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /TITLE Segnala la propria mancanza. * * RPG JABSENT. * * Segnala al video o alla joblog la propria mancanza. * * In realtà, per svolgere la propria funzione di segnalazione, * il programma viene duplicato assumendo il nome di un * programma previsto ma non ancora pronto. * Tramite la lettura della propria program status data structure * il programma è sempre in grado di conoscere il proprio * nome e così di segnalare l'assenza del programma titolare. * * I 40 parametri di ingresso, del tutto inutilizzati, * servono soltanto a renderlo richiamabile anche da un * programma che passi al modulo mancante il massimo * numero permesso di parametri. * H DECEDIT(',') DATEDIT(*YMD.) D §M S 1 DIM(132) Dati messaggio D PSDS SDS D PGM 334 343 D LIB 81 90 D JOB 244 253 D USR 254 263 D AA 276 277 D MM 278 279 D GG 280 281 D HH 282 283 D PP 284 285 D SS 286 287 C *ENTRY PLIST C PARM N01 1 C PARM N02 1 C PARM N03 1 C PARM N04 1 C PARM N05 1 C PARM N06 1 C PARM N07 1 C PARM N08 1 C PARM N09 1 C PARM N10 1 C PARM N11 1 C PARM N12 1 C PARM N13 1 C PARM N14 1 C PARM N15 1 C PARM N16 1 C PARM N17 1 C PARM N18 1 C PARM N19 1 C PARM N20 1 C PARM N21 1 C PARM N22 1 C PARM N23 1 C PARM N24 1 C PARM N25 1 C PARM N26 1 C PARM N27 1 C PARM N28 1 C PARM N29 1 C PARM N30 1 C PARM N31 1 C PARM N32 1 C PARM N33 1 C PARM N34 1 C PARM N35 1 C PARM N36 1 C PARM N37 1 C PARM N38 1 C PARM N39 1 C PARM N40 1 * Predispone la chiusura del programma. * Questa istruzione prima della chiamata a JABSENT1 che * in alcuni casi manda un rilascio al padre del programma corrente: * se il programma corrente non fosse in LR, non terminerebbe e, * pur non essendo in lista di chiamata, darebbe errore di recursione * in caso di nuova chiamata! Probabile follia di sistema. C SETON LR C MOVEA PGM §M(1) C MOVEA LIB §M(11) C MOVEA JOB §M(21) C MOVEA USR §M(31) C MOVEA GG §M(41) C MOVE '/' §M(43) C MOVEA MM §M(44) C MOVEA '/' §M(46) C MOVEA AA §M(47) C MOVEA HH §M(49) C MOVEA ':' §M(51) C MOVEA PP §M(52) C MOVEA ':' §M(54) C MOVEA SS §M(55) C CALL 'JABSENT1' 50 C PARM §M I Dati mess C RETURN //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JABSENT.) FILETYPE(*SRC) ENDCHAR('//ENDSRC') //BCHJOB JOB(JABSENT.) JOBD(NERONI2/NERONI2) OUTQ(QPRINTS) + ENDSEV(60) LOG(4 00 *SECLVL) MSGQ(*USRPRF) /* Claudio Neroni 08/12/2000 Creato. */ /* JABSENT */ /* Signal absence. */ /* Prerequisiti: JDSPMSG */ /* Segnala l'assenza di un programma di cui si sostituisce */ /* l'oggetto eseguibile con un duplicato rinominato di JABSENT. */ /* Per funzionare deve essere in lista librerie il pgm JABSENT1. */ /* Il pgm JABSENTT serve a testare il comportamento di JABSENT. */ /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP QGPL) ADDLIBLE LIB(NERONI2) POSITION(*AFTER QTEMP) /* Cancella gli oggetti preesistenti. */ DLTPGM PGM(NERONI2/JABSENT ) DLTPGM PGM(NERONI2/JABSENT1) DLTPGM PGM(NERONI2/JABSENTT) DLTMSGF MSGF(NERONI2/JABSENT) /* Crea gli oggetti. */ CRTBNDRPG PGM(NERONI2/JABSENT) SRCFILE(JABSENT) TEXT('ŠSignals its + absence€') DBGVIEW(*ALL) CRTBNDCL PGM(NERONI2/JABSENT1) SRCFILE(JABSENT) DBGVIEW(*ALL) CRTBNDCL PGM(NERONI2/JABSENTT) SRCFILE(JABSENT) DBGVIEW(*ALL) CRTMSGF MSGF(NERONI2/JABSENT) TEXT('Signal absence. Msgf') /* Messaggi del Ccp. */ ADDMSGD MSGID(JAB0001) MSGF(NERONI2/JABSENT) MSG('Il programma + richiesto &2/&1 non esiste.') SECLVL('Tu, utente &4 + seduto al terminale &3 il giorno &5 alle ore &6, hai + chiesto l''esecuzione di una funzione prevista dal + programmatore ma mancante dell''adeguato + programma di controllo. +   Il programma è in preparazione o in manutenzione. +   Se la funzione ti è + indispensabile, fallo presente al programmatore. +   Se il programmatore non ti ascolta, lamentati per via + gerarchica. +   Se la richiesta è dettata da pura curiosità, + premi‚ENTR€e dimentica.') + FMT((*CHAR 10) (*CHAR 10) + (*CHAR 10) (*CHAR 10) (*CHAR 8) (*CHAR 8)) ADDMSGD MSGID(JAB0002) MSGF(NERONI2/JABSENT) MSG('Il programma + richiesto &2/&1 non esiste.') SECLVL('Tu, utente &4 + del lavoro batch &3 il giorno &5 alle ore &6, hai + chiesto l''esecuzione di una funzione prevista dal + programmatore ma ancora mancante dell''adeguato + programma di controllo. Se la funzione ti è + indispensabile, fallo presente al programmatore. Se il + programmatore non ti ascolta, lamentati per via + gerarchica. Se la richiesta è dettata da pura + curiosità, dimentica.') FMT((*CHAR 10) (*CHAR 10) + (*CHAR 10) (*CHAR 10) (*CHAR 8) (*CHAR 8)) //ENDBCHJOB //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JABSENTT) FILETYPE(*SRC) ENDCHAR('//ENDSRC') PGM DOWHILE COND('1') CALL PGM(JABSENT) MONMSG MSGID(CPF0000) EXEC(LEAVE) ENDDO ENDPGM //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JABSENT1) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* */ /* CLP JABSENT1. */ /* */ /* Completa la segnalazione di programma mancante. */ /* */ PGM PARM(&MSGDTA) /* Dati per i messaggi. */ DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) /* Tipo del lavoro corrente. */ DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) /* Chiave del messaggio. */ DCL VAR(&MRK) TYPE(*CHAR) LEN(4) /* Identificazione del mittente di un messaggio. */ DCL VAR(&SENDER) TYPE(*CHAR) LEN(80) /* Programma chiamante. */ DCL VAR(&CALLER) TYPE(*CHAR) LEN(10) /* Intercetta gli errori imprevisti. */ MONMSG MSGID(CPF0000 MCH0000) EXEC(GOTO CMDLBL(FINE)) /* Recupera gli attributi del lavoro. */ RTVJOBA TYPE(&TYPE) /* Se è in corso un lavoro interattivo. */ IF COND(&TYPE = '1') THEN(DO) /* Chiama la visualizzazione del messaggio per l'utente interattivo.*/ JDSPMSG MSGID(JAB0001) MSGF(JABSENT) MSGDTA(&MSGDTA) /* Se intercetta il messaggio di notifica eventualmente */ /* restituito dal video. */ MONMSG MSGID(JEX0030) EXEC(DO) /* Chiama Subroutine Escape Message. */ CALLSUBR SUBR(ESCMSG) /* End. */ ENDDO /* End. */ ENDDO /* Se è in corso un lavoro batch. */ ELSE CMD(DO) /* Manda un messaggio in job log. */ SNDPGMMSG MSGID(JAB0002) MSGF(JABSENT) MSGDTA(&MSGDTA) + TOPGMQ(*EXT) /* Manda un messaggio alla coda apposita. */ SNDPGMMSG MSGID(JAB0002) MSGF(JABSENT) MSGDTA(&MSGDTA) + TOMSGQ(JABSENT) /* Se la spedizione fallisce. */ MONMSG MSGID(CPF0000) EXEC(DO) /* Manda un messaggio al log. */ SNDPGMMSG MSGID(JAB0002) MSGF(JABSENT) MSGDTA(&MSGDTA) + TOMSGQ(*HSTLOG) MONMSG MSGID(CPF0000) /* End. */ ENDDO /* Chiama Subroutine Escape Message. */ CALLSUBR SUBR(ESCMSG) /* End. */ ENDDO /* Label di fine programma. */ FINE: RETURN /* Subroutine Escape Message. */ SUBR SUBR(ESCMSG) /* Cerca il nome del programma padre. */ /* Manda un messaggio al padre e lo riceve rimuovendolo. */ /* Quindi, dal parametro opportuno, estrae il nome del ricevente. */ SNDPGMMSG MSG('Messaggio di comodo per + l''individuazione del programma padre.') + KEYVAR(&MRK) RCVMSG PGMQ(*PRV) MSGTYPE(*INFO) MSGKEY(&MRK) + SENDER(&SENDER) CHGVAR VAR(&CALLER) VALUE(%SST(&SENDER 56 10)) /* Manda un rilascio al padre del chiamante. */ SNDPGMMSG MSGID(CPF0001) MSGF(QCPFMSG) + MSGDTA('Abort!') TOPGMQ(*PRV (&CALLER)) + MSGTYPE(*ESCAPE) ENDSUBR ENDPGM //ENDSRC //ENDBCHJOB