//BCHJOB JOB(JSPLOWN) JOBD(NERONI2/NERONI2) OUTQ(QPRINT) + ENDSEV(60) LOG(4 00 *SECLVL) MSGQ(*USRPRF) CCSID(280) /* Open source from 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: 2016-08-23 18:10 */ /* To File : "JSPLOWN" */ /* To Library : "NERONI2" */ /* To Text : "Change Spool Owner. 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 "JSPLOWN.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:\JSPLOWN.txt" "/qsys.lib/NERONI2.lib/stringhe.file/JSPLOWN.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(JSPLOWN) 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/JSPLOWN" */ /* FACENDO ATTENZIONE ALL'ORDINE DI ESECUZIONE INDICATO NEL */ /* MEMBRO FACOLTATIVO "A.LEGGIMI", AD ESEMPIO: */ /* SBMDBJOB FILE(NERONI2/JSPLOWN) MBR(JSPLOWN.) JOBQ(QBATCH) */ /********* FINE ISTRUZIONI ****************************************************/ /* Crea la libreria. */ MKDIR DIR('/qsys.lib/NERONI2.lib') CHGLIB LIB(NERONI2) TEXT('Claudio Neroni Utility') /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP NERONI2 QGPL) /* Crea il file sorgente. */ DLTF FILE(NERONI2/JSPLOWN) CRTSRCPF FILE(NERONI2/JSPLOWN) RCDLEN(112) + TEXT('Change Spool Owner. Src') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JSPLOWN) TOFILE(NERONI2/JSPLOWN) + TOMBR(JSPLOWN) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JSPLOWN) MBR(JSPLOWN) + SRCTYPE(CMD) + TEXT('Change Spool Owner. Cmd') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JSPLOWN.) TOFILE(NERONI2/JSPLOWN) + TOMBR(JSPLOWN.) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JSPLOWN) MBR(JSPLOWN.) + SRCTYPE(CL) + TEXT('Change Spool Owner. CrtJs') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JSPLOWNC) TOFILE(NERONI2/JSPLOWN) + TOMBR(JSPLOWNC) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JSPLOWN) MBR(JSPLOWNC) + SRCTYPE(CLLE) + TEXT('Change Spool Owner. Cpp') /*----------------------------------------------------------------------------*/ //DATA FILE(JSPLOWN) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Claudio Neroni 09-10-2006 Creato. */ /* Change Spool Owner. Cmd */ CMD PROMPT('Change Spool Owner') PARM KWD(TOUSRID) TYPE(TOUSRID) PROMPT('To user') TOUSRID: ELEM TYPE(*CHAR) LEN(8) PROMPT('User + identification') ELEM TYPE(*CHAR) LEN(8) PROMPT('Address') PARM KWD(FROMUSER) TYPE(*GENERIC) DFT(*CURRENT) + SPCVAL((*CURRENT) (*ALL)) PROMPT('From user') PARM KWD(STATUS) TYPE(*CHAR) LEN(4) RSTD(*YES) + DFT(SAV) VALUES(SAV RDY HLD) + SPCVAL((*ALL)) PROMPT('Spool status') PARM KWD(FILE) TYPE(*NAME) LEN(10) DFT(*ALL) + SPCVAL((*ALL)) PROMPT('Spool file name') PARM KWD(USRDTA) TYPE(*CHAR) LEN(10) DFT(*ALL) + SPCVAL((*ALL)) PROMPT('User data') PARM KWD(JOB) TYPE(*NAME) LEN(10) DFT(*ALL) + SPCVAL((*ALL)) PROMPT('Job name') PARM KWD(OUTQ) TYPE(*NAME) LEN(10) DFT(*ALL) + SPCVAL((*ALL)) PROMPT('Output queue') PARM KWD(ACTION) TYPE(*CHAR) LEN(7) RSTD(*YES) + DFT(*SNDDLT) VALUES(*DSP *SND *SNDDLT) + PROMPT('Action to play') PARM KWD(DTAFMT) TYPE(*CHAR) LEN(8) RSTD(*YES) + DFT(*ALLDATA) VALUES(*RCDDATA *ALLDATA) + PROMPT('Data format') //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JSPLOWN.) FILETYPE(*SRC) ENDCHAR('//ENDSRC') //BCHJOB JOB(JSPLOWN.) JOBD(NERONI2/NERONI2) OUTQ(QPRINTS) + ENDSEV(60) LOG(4 00 *SECLVL) MSGQ(*USRPRF) CCSID(280) /* Claudio Neroni 09-10-2006 Creato. */ /* JSPLOWN */ /* Change Spool Owner. */ /* Cambia il proprietario degli spool. */ /* Prerequisiti: nessuno. */ /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP QGPL) ADDLIBLE LIB(NERONI2) POSITION(*AFTER QTEMP) /* Cancella il file messaggi preesistente. */ DLTMSGF MSGF(NERONI2/JSPLOWN) /* Cancella i testi d'aiuto preesistenti. */ DLTPNLGRP PNLGRP(NERONI2/JSPLOWNP) /* Cancella i logici preesistenti. */ /* Cancella i fisici preesistenti. */ DLTF FILE(NERONI2/JSPLOWN0) /* Cancella i comandi preesistenti. */ DLTCMD CMD(NERONI2/JSPLOWN) /* Cancella i programmi preesistenti. */ DLTPGM PGM(NERONI2/JSPLOWNC) /* Crea i file fisici. */ CRTPF FILE(NERONI2/JSPLOWN0) RCDLEN(198) TEXT('Change Spool + Owner. Wrkf') SIZE(*NOMAX) /* Crea i file logici. */ /* Crea i comandi. */ CRTCMD CMD(NERONI2/JSPLOWN) PGM(JSPLOWNC) SRCFILE(JSPLOWN) + HLPPNLGRP(JSPLOWNP) HLPID(CMD) PRDLIB(NERONI2) /* Duplica i comandi in QGPL. */ CRTPRXCMD CMD(QGPL/JSPLOWN) TGTCMD(NERONI2/JSPLOWN) AUT(*USE) + REPLACE(*YES) /* Crea i programmi. */ CRTBNDCL PGM(NERONI2/JSPLOWNC) SRCFILE(NERONI2/JSPLOWN) + TGTRLS(*CURRENT) DBGVIEW(*ALL) /* Crea il file messaggi. */ CRTMSGF MSGF(NERONI2/JSPLOWN) TEXT('Change Spool Owner. Msgf') /* Fotografia comandi (xxxA001). */ /* Messaggi comuni a pgm di comandi diversi (xxx0001). */ ADDMSGD MSGID(SPL0001) MSGF(NERONI2/JSPLOWN) MSG('Esaminati &1 + spoolfile. Visti &2. Spediti &3. Cancellati &4. In + errore &5.') FMT((*CHAR 9) (*CHAR 9) (*CHAR 9) (*CHAR + 9) (*CHAR 9)) ADDMSGD MSGID(SPL0002) MSGF(NERONI2/JSPLOWN) MSG('Errore + inaspettato. Controlla joblog.') /* Messaggi nei pgm del Cmd 1 (xxx0101). */ /* Messaggi nei pgm del Cmd 2 (xxx0201). */ /* Messaggi dei Cmd (xxx1001). */ /* Crea i testi d'aiuto. */ CRTPNLGRP PNLGRP(NERONI2/JSPLOWNP) SRCFILE(JSPLOWN) //ENDBCHJOB //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JSPLOWNC) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Claudio Neroni 09-10-2006 Creato. */ /* Change Spool Owner. Cpp */ /* www.neroni.it */ /* */ /* Riceve i parametri. */ PGM PARM(&TOUSRID &FROMUSER &STATUSP &FILEP + &USRDTAP &JOBP &OUTQP &ACTION &DTAFMT) /* Identificazione utente di destinazione. */ DCL VAR(&TOUSRID) TYPE(*CHAR) LEN(18) /* Utente di provenienza. */ DCL VAR(&FROMUSER) TYPE(*CHAR) LEN(10) /* Stato spool file richiesto. */ DCL VAR(&STATUSP) TYPE(*CHAR) LEN(4) /* Spool file richiesto. */ DCL VAR(&FILEP) TYPE(*CHAR) LEN(10) /* Dati utente richiesti. */ DCL VAR(&USRDTAP) TYPE(*CHAR) LEN(10) /* Lavoro richiesto. */ DCL VAR(&JOBP) TYPE(*CHAR) LEN(10) /* Coda emissione richiesta. */ DCL VAR(&OUTQP) TYPE(*CHAR) LEN(10) /* Azione richiesta. */ DCL VAR(&ACTION) TYPE(*CHAR) LEN(7) /* Formato dati. */ DCL VAR(&DTAFMT) TYPE(*CHAR) LEN(8) /* Identificazione utente di destinazione. Utente. */ DCL VAR(&TOUSRIDU) TYPE(*CHAR) LEN(8) /* Identificazione utente di destinazione. Indirizzo. */ DCL VAR(&TOUSRIDA) TYPE(*CHAR) LEN(8) /* Identificazione della riga di stampa. */ DCL VAR(&ID) TYPE(*CHAR) LEN(11) /* Spool file dalla riga di stampa. */ DCL VAR(&FILE) TYPE(*CHAR) LEN(10) /* Utente dalla riga di stampa. */ DCL VAR(&USER) TYPE(*CHAR) LEN(10) /* Lavoro dalla riga di stampa. */ DCL VAR(&JOB) TYPE(*CHAR) LEN(10) /* Numero lavoro dalla riga di stampa. */ DCL VAR(&JOBNBR) TYPE(*CHAR) LEN(6) /* Numero spool dalla riga di stampa. */ DCL VAR(&SPLNBR) TYPE(*CHAR) LEN(10) DCL VAR(&SPLNBRX) TYPE(*DEC) LEN(10) /* Stato spool file dalla riga di stampa. */ DCL VAR(&STATUS) TYPE(*CHAR) LEN(4) /* Dati utente dalla riga di stampa. */ DCL VAR(&USRDTA) TYPE(*CHAR) LEN(10) /* Coda emissione dalla riga di stampa. */ DCL VAR(&OUTQ) TYPE(*CHAR) LEN(10) /* Contatore degli spool file esaminati. */ DCL VAR(&CN1) TYPE(*DEC) LEN(9 0) DCL VAR(&CN1A) TYPE(*CHAR) LEN(9) /* Contatore degli spool file visti. */ DCL VAR(&CN2) TYPE(*DEC) LEN(9 0) DCL VAR(&CN2A) TYPE(*CHAR) LEN(9) /* Contatore degli spool file spediti. */ DCL VAR(&CN3) TYPE(*DEC) LEN(9 0) DCL VAR(&CN3A) TYPE(*CHAR) LEN(9) /* Contatore degli spool file cancellati. */ DCL VAR(&CN4) TYPE(*DEC) LEN(9 0) DCL VAR(&CN4A) TYPE(*CHAR) LEN(9) /* Contatore degli spool file in errore. */ DCL VAR(&CN5) TYPE(*DEC) LEN(9 0) DCL VAR(&CN5A) TYPE(*CHAR) LEN(9) /* Stampa su file di Work Spool File, file di transito. */ DCLF FILE(JSPLOWN0) /* Intercetta gli errori. */ MONMSG MSGID(CPF0000 MCH0000 CEE0000) EXEC(GOTO + CMDLBL(ERRORE)) /* Estrae parametri. */ CHGVAR VAR(&TOUSRIDU) VALUE(%SST(&TOUSRID 3 8)) CHGVAR VAR(&TOUSRIDA) VALUE(%SST(&TOUSRID 11 8)) /* Cancella il file di transito eventualmente preesistente. */ DLTF FILE(QTEMP/JSPLOWN0) MONMSG MSGID(CPF0000) /* Crea il file di transito. */ CRTPF FILE(QTEMP/JSPLOWN0) RCDLEN(198) TEXT('Change + spool owner. Wrkf') SIZE(*NOMAX) /* Reindirizza la stampa per manipolarla piu' facilmente. */ OVRPRTF FILE(QPRTSPLF) MAXRCDS(*NOMAX) HOLD(*YES) + SPLFNAME(JSPLOWNWRK) /* Stampa l'elenco delle stampe dell'utente richiesto. */ WRKSPLF SELECT(&FROMUSER) OUTPUT(*PRINT) /* Copia la stampa nel file di lavoro. */ CPYSPLF FILE(JSPLOWNWRK) TOFILE(QTEMP/JSPLOWN0) + SPLNBR(*LAST) /* Cancella la stampa di lavoro. */ DLTSPLF FILE(JSPLOWNWRK) SPLNBR(*LAST) /* Reindirizza la lettura del file di lavoro. */ OVRDBF FILE(JSPLOWN0) TOFILE(QTEMP/JSPLOWN0) /* Inizio lettura. */ BEG: /* Legge una riga di stampa dal file di lavoro. */ RCVF /* Se non ce ne sono altre, abbandona. */ MONMSG MSGID(CPF0864) EXEC(GOTO CMDLBL(END)) /* Estrae l'identificazione della riga. */ CHGVAR VAR(&ID) VALUE(%SST(&JSPLOWN0 1 11)) /* Se corre una riga di contorno, ricicla. */ /* ATTENZIONE. */ /* LE IDENTIFICAZIONI QUI CONSIDERATE SI RIFERISCONO AL RELEASE V5R2 */ /* E ALLA LINGUA ITALIANA. */ /* HA FUNZIONATO SENZA MODIFICHE ANCHE SU V5R4 ITALIANO. */ /* CONTROLLARE CHE SIANO EFFICACI SUL RELEASE USATO. */ /* LO STESSO VALE PER LE POSIZIONI DEI CAMPI SULLA RIGA. */ IF COND((&ID *EQ ' 5722SS1 V') *OR (&ID *EQ ' + ') *OR (&ID *EQ ' Num. ') *OR (&ID + *EQ ' * * ') *OR (&ID *EQ ' + (Nessun ') *OR (&ID *EQ ' * ')) + THEN(GOTO CMDLBL(BEG)) /* LE IDENTIFICAZIONI QUI CONSIDERATE SI RIFERISCONO AL RELEASE V7R1 */ /* E ALLA LINGUA ITALIANA. */ /* Non riesco a fare la prova completa sul 7.2 ma la stampa e' la stessa. */ IF COND((&ID *EQ ' 5770SS1 V') *OR (&ID *EQ ' + File ')) THEN(GOTO CMDLBL(BEG)) /* Estrae dalla riga il nome dello spool file. */ CHGVAR VAR(&FILE) VALUE(%SST(&JSPLOWN0 2 10)) /* Se lo spool file e' quello di lavoro, ricicla. */ IF COND(&FILE *EQ JSPLOWNWRK) THEN(GOTO + CMDLBL(BEG)) /* Conta gli spool file esaminati. */ CHGVAR VAR(&CN1) VALUE(&CN1 +1) /* Estrae dalla riga lo stato dello spool file. */ CHGVAR VAR(&STATUS) VALUE(%SST(&JSPLOWN0 46 3)) /* Se lo stato non e' quello richiesto, ricicla. */ IF COND((&STATUSP *NE *ALL) *AND (&STATUS *NE + &STATUSP)) THEN(GOTO CMDLBL(BEG)) /* Se lo spool file non e' quello richiesto, ricicla. */ IF COND((&FILEP *NE *ALL) *AND (&FILE *NE + &FILEP)) THEN(GOTO CMDLBL(BEG)) /* Estrae dalla riga i dati utente dello spool file. */ CHGVAR VAR(&USRDTA) VALUE(%SST(&JSPLOWN0 35 10)) /* Se i dati utente non sono quelli richiesti, ricicla. */ IF COND((&USRDTAP *NE *ALL) *AND (&USRDTA *NE + &USRDTAP)) THEN(GOTO CMDLBL(BEG)) /* Estrae dalla riga il lavoro dello spool file. */ CHGVAR VAR(&JOB) VALUE(%SST(&JSPLOWN0 108 10)) /* Se il lavoro non e' quello richiesto, ricicla. */ IF COND((&JOBP *NE *ALL) *AND (&JOB *NE &JOBP)) + THEN(GOTO CMDLBL(BEG)) /* Estrae dalla riga la coda di emissione dello spool file. */ CHGVAR VAR(&OUTQ) VALUE(%SST(&JSPLOWN0 126 10)) /* Se la coda emissione non e' quella richiesta, ricicla. */ IF COND((&OUTQP *NE *ALL) *AND (&OUTQ *NE + &OUTQP)) THEN(GOTO CMDLBL(BEG)) /* Estrae dalla riga l'utente dello spool file. */ CHGVAR VAR(&USER) VALUE(%SST(&JSPLOWN0 13 10)) /* Estrae dalla riga il numero dello spool file. */ CHGVAR VAR(&SPLNBR) VALUE(%SST(&JSPLOWN0 100 7)) /* Estrae dalla riga il numero lavoro dello spool file. */ CHGVAR VAR(&JOBNBR) VALUE(%SST(&JSPLOWN0 119 6)) /* Trasforma in numerico il numero dello spool file. */ CHGVAR VAR(&SPLNBRX) VALUE(&SPLNBR) /* Se richiesta l'azione di visualizzazione. */ IF COND(&ACTION *EQ *DSP) THEN(DO) /* Visualizza lo spool file. */ DSPSPLF FILE(&FILE) JOB(&JOBNBR/&USER/&JOB) + SPLNBR(&SPLNBRX) /* Se la visualizzazione fallisce, conta errore e abbandona. */ MONMSG MSGID(CPF0000 MCH0000) EXEC(DO) CHGVAR VAR(&CN5) VALUE(&CN5 +1) GOTO CMDLBL(NODSP) ENDDO /* Conta visualizzazione. */ CHGVAR VAR(&CN2) VALUE(&CN2 +1) NODSP: /* Se richiesta l'azione di visualizzazione. */ ENDDO /* Se richiesta l'azione di invio o di invio e cancellazione. */ IF COND(&ACTION *EQ *SND *OR &ACTION *EQ + *SNDDLT) THEN(DO) /* Invia lo spool file. */ SNDNETSPLF FILE(&FILE) TOUSRID((&TOUSRIDU &TOUSRIDA)) + JOB(&JOBNBR/&USER/&JOB) SPLNBR(&SPLNBRX) + DTAFMT(&DTAFMT) /* Se l'invio fallisce, conta errore e abbandona. */ MONMSG MSGID(CPF0000 MCH0000) EXEC(DO) CHGVAR VAR(&CN5) VALUE(&CN5 +1) GOTO CMDLBL(NOSND) ENDDO /* Conta invio. */ CHGVAR VAR(&CN3) VALUE(&CN3 +1) /* Se richiesta l'azione di invio e cancellazione. */ IF COND(&ACTION *EQ *SNDDLT) THEN(DO) /* Cancella lo spool file. */ DLTSPLF FILE(&FILE) JOB(&JOBNBR/&USER/&JOB) + SPLNBR(&SPLNBRX) /* Se la cancellazione riesce, la conta. */ MONMSG MSGID(CPF0000 MCH0000) EXEC(GOTO CMDLBL(NODLT)) CHGVAR VAR(&CN4) VALUE(&CN4 +1) NODLT: /* Se richiesta l'azione di invio e cancellazione. */ ENDDO NOSND: /* Se richiesta l'azione di invio o di invio e cancellazione. */ ENDDO /* Salta a Inizio lettura. */ GOTO CMDLBL(BEG) /* Fine lettura. */ END: /* Allinea a sinistra il Contatore degli spool file esaminati. */ CHGVAR VAR(&CN1A) VALUE(&CN1) ALL1: IF COND((%SST(&CN1A 1 1) *EQ '0') *AND + (%SST(&CN1A 2 1) *NE ' ')) THEN(DO) CHGVAR VAR(&CN1A) VALUE(%SST(&CN1A 2 8)) GOTO CMDLBL(ALL1) ENDDO /* Allinea a sinistra il Contatore degli spool file visti. */ CHGVAR VAR(&CN2A) VALUE(&CN2) ALL2: IF COND((%SST(&CN2A 1 1) *EQ '0') *AND + (%SST(&CN2A 2 1) *NE ' ')) THEN(DO) CHGVAR VAR(&CN2A) VALUE(%SST(&CN2A 2 8)) GOTO CMDLBL(ALL2) ENDDO /* Allinea a sinistra il Contatore degli spool file spediti. */ CHGVAR VAR(&CN3A) VALUE(&CN3) ALL3: IF COND((%SST(&CN3A 1 1) *EQ '0') *AND + (%SST(&CN3A 2 1) *NE ' ')) THEN(DO) CHGVAR VAR(&CN3A) VALUE(%SST(&CN3A 2 8)) GOTO CMDLBL(ALL3) ENDDO /* Allinea a sinistra il Contatore degli spool file cancellati. */ CHGVAR VAR(&CN4A) VALUE(&CN4) ALL4: IF COND((%SST(&CN4A 1 1) *EQ '0') *AND + (%SST(&CN4A 2 1) *NE ' ')) THEN(DO) CHGVAR VAR(&CN4A) VALUE(%SST(&CN4A 2 8)) GOTO CMDLBL(ALL4) ENDDO /* Allinea a sinistra il Contatore degli spool file in errore. */ CHGVAR VAR(&CN5A) VALUE(&CN5) ALL5: IF COND((%SST(&CN5A 1 1) *EQ '0') *AND + (%SST(&CN5A 2 1) *NE ' ')) THEN(DO) CHGVAR VAR(&CN5A) VALUE(%SST(&CN5A 2 8)) GOTO CMDLBL(ALL5) ENDDO /* Invia un messaggio di completamento. */ SNDPGMMSG MSGID(SPL0001) MSGF(JSPLOWN) MSGDTA(&CN1A + *CAT &CN2A *CAT &CN3A *CAT &CN4A *CAT + &CN5A) MSGTYPE(*COMP) /* Salta a fine. */ GOTO CMDLBL(FINE) ERRORE: /* Invia un messaggio diagnostico. */ SNDPGMMSG MSGID(SPL0002) MSGF(JSPLOWN) MSGTYPE(*DIAG) MONMSG MSGID(CPF0000 MCH0000) /* Fine. */ FINE: ENDPGM //ENDSRC //ENDBCHJOB