//BCHJOB JOB(JPAUSE) JOBD(QBATCH) OUTQ(QPRINT) ENDSEV(60) + LOG(4 00 *SECLVL) MSGQ(*USRPRF) /* Open source scaricabile da www.neroni.it di Claudio Neroni */ /* SE L'USO DELLA JOB DESCRIPTION "QBATCH" TI E' IMPEDITO, */ /* UTILIZZANE UNA DIVERSA. £$§ èéòàùì */ /* From System: "IUBICSVI" */ /* From Library: "UTI" */ /* Unload Time: 2008-11-24 11:40 */ /* To File : "JPAUSE" */ /* To Library : "NERONI2" */ /* To Text : "Pause. 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 "JPAUSE.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:\JPAUSE.txt" "/qsys.lib/NERONI2.lib/stringhe.file/JPAUSE.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(JPAUSE) 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/JPAUSE" */ /* FACENDO ATTENZIONE ALL'ORDINE DI ESECUZIONE INDICATO NEL */ /* MEMBRO FACOLTATIVO "A.LEGGIMI", AD ESEMPIO: */ /* SBMDBJOB FILE(NERONI2/JPAUSE) MBR(JPAUSE.) 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/JPAUSE) CRTSRCPF FILE(NERONI2/JPAUSE) RCDLEN(112) + TEXT('Pause. Src') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JPAUSE) TOFILE(NERONI2/JPAUSE) + TOMBR(JPAUSE) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JPAUSE) MBR(JPAUSE) + SRCTYPE(CMD) + TEXT('Pause. Cmd') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JPAUSE.) TOFILE(NERONI2/JPAUSE) + TOMBR(JPAUSE.) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JPAUSE) MBR(JPAUSE.) + SRCTYPE(CL) + TEXT('Pause. CrtJs') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JPAUSEC) TOFILE(NERONI2/JPAUSE) + TOMBR(JPAUSEC) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JPAUSE) MBR(JPAUSEC) + SRCTYPE(CLLE) + TEXT('Pause. Cpp') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JPAUSEP) TOFILE(NERONI2/JPAUSE) + TOMBR(JPAUSEP) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JPAUSE) MBR(JPAUSEP) + SRCTYPE(PNLGRP) + TEXT('Pause. Help') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JPAUSETST) TOFILE(NERONI2/JPAUSE) + TOMBR(JPAUSETST) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JPAUSE) MBR(JPAUSETST) + SRCTYPE(CL) + TEXT('Pause. TestJobStream') /*---------------------------------------------------------------------*/ //DATA FILE(JPAUSE) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Pause. Cmd */ /* Claudio Neroni 22/10/1981 Creato. */ CMD PROMPT('Pause') PARM KWD(MSG) TYPE(*CHAR) LEN(109) DFT('Go or + Cancel?') EXPR(*YES) PROMPT('Inquiry + message') PARM KWD(MSGQ) TYPE(MSGQ) PROMPT('Queried message + queue') MSGQ: QUAL TYPE(*NAME) DFT(QSYSOPR) QUAL TYPE(*NAME) DFT(*LIBL) SPCVAL((*LIBL)) + PROMPT('library') PARM KWD(DFTRPY) TYPE(*CHAR) LEN(7) RSTD(*YES) + DFT(*CANCEL) VALUES(*CANCEL *GO) + PROMPT('Default replay') //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JPAUSE.) FILETYPE(*SRC) ENDCHAR('//ENDSRC') //BCHJOB JOB(JPAUSE.) JOBD(QBATCH) OUTQ(QPRINTS) ENDSEV(60) LOG(4 + 00 *SECLVL) MSGQ(*USRPRF) /* Claudio Neroni 22/10/1981 Creato. */ /* JPAUSE */ /* Pause. */ /* Prerequisiti: JAI, JRSNMSG. */ /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP QGPL) ADDLIBLE LIB(NERONI2) POSITION(*AFTER QTEMP) /* Cancella gli oggetti preesistenti. */ DLTCMD CMD(NERONI2/JPAUSE) DLTPNLGRP PNLGRP(NERONI2/JPAUSEP) DLTPGM PGM(NERONI2/JPAUSEC) DLTMSGF MSGF(NERONI2/JPAUSE) /* Crea gli oggetti. */ CRTBNDCL PGM(NERONI2/JPAUSEC) SRCFILE(JPAUSE) DBGVIEW(*ALL) CRTPNLGRP PNLGRP(NERONI2/JPAUSEP) SRCFILE(JPAUSE) CRTCMD CMD(NERONI2/JPAUSE) PGM(JPAUSEC) SRCFILE(JPAUSE) + MSGF(JPAUSE) HLPPNLGRP(JPAUSEP) HLPID(CMD) PRDLIB(NERONI2) CRTMSGF MSGF(NERONI2/JPAUSE) TEXT('Pause. Msgf') /* Messaggi del Ccp. */ ADDMSGD MSGID(JPA0001) MSGF(NERONI2/JPAUSE) MSG('(C G) &1.&2') + SECLVL('Pausa nel job &1. Il testo del messaggio + inviato dal job alla coda &3 è: "&2". Rispondi G=Go + per continuarne l''elaborazione oppure C=Cancel per + interromperla immediatamente.') SEV(70) FMT((*CHAR 10) + (*CHAR 109) (*CHAR 10)) LEN(1) VALUES(G C) SPCVAL(('g' + G) ('c' C)) DFT(C) ADDMSGD MSGID(JPA0003) MSGF(NERONI2/JPAUSE) MSG('Continua dopo + una pausa.') SECLVL('Il job &1 ha mandato alla coda &3 + un messaggio di pausa con il testo "&2" e ne ha + ricevuto una risposta di continuazione.') SEV(00) + FMT((*CHAR 10) (*CHAR 109) (*CHAR 10)) ADDMSGD MSGID(JPA0004) MSGF(NERONI2/JPAUSE) MSG('(G C) &1.&2') + SECLVL('Pausa nel job &1. Il testo del messaggio + inviato dal job alla coda &3 è: "&2". Rispondi G=Go + per continuarne l''elaborazione oppure C=Cancel per + interromperla immediatamente.') SEV(70) FMT((*CHAR 10) + (*CHAR 109) (*CHAR 10)) LEN(1) VALUES(G C) SPCVAL(('g' + G) ('c' C)) DFT(G) ADDMSGD MSGID(JPA0030) MSGF(NERONI2/JPAUSE) MSG('Risposta di + cancellazione ad una pausa.') SECLVL('Il job &1 ha + mandato alla coda &3 un messaggio di pausa con il + testo "&2" e ne ha ricevuto una cancellazione.') + SEV(30) FMT((*CHAR 10) (*CHAR 109) (*CHAR 10)) ADDMSGD MSGID(JPA0060) MSGF(NERONI2/JPAUSE) MSG('Risposta di + cancellazione ad una pausa.') SECLVL('Il job &1 ha + mandato alla coda &3 un messaggio di pausa con il + testo "&2" e ne ha ricevuto una cancellazione.') + SEV(60) FMT((*CHAR 10) (*CHAR 109) (*CHAR 10)) ADDMSGD MSGID(JPA0099) MSGF(NERONI2/JPAUSE) MSG('Risposta di + cancellazione ad una pausa.') SECLVL('Il job &1 ha + mandato alla coda &3 un messaggio di pausa con il + testo "&2" e ne ha ricevuto una cancellazione.') + SEV(99) FMT((*CHAR 10) (*CHAR 109) (*CHAR 10)) /* Messaggi del Cmd. */ /* Nessuno. */ //ENDBCHJOB //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JPAUSEC) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Pause. Cpp */ /* Claudio Neroni 22/10/1981 Creato. */ /* Manda un messaggio alla coda richiesta e attende la risposta */ /* che viene testata per "C" = Cancel e per "G" = Go. */ /* */ PGM PARM(&MSG &MSGQLIB &DFTRPY) /* Testo del messaggio. */ DCL VAR(&MSG) TYPE(*CHAR) LEN(109) /* Coda messaggi qualificata a cui segnalare. */ DCL VAR(&MSGQLIB) TYPE(*CHAR) LEN(20) /* Risposta di difetto. */ DCL VAR(&DFTRPY) TYPE(*CHAR) LEN(7) /* End severity. */ DCL VAR(&SEV) TYPE(*DEC) LEN(9 0) /* Coda messaggi a cui segnalare. */ DCL VAR(&MSGQ) TYPE(*CHAR) LEN(10) /* Libreria della coda messaggi a cui segnalare. */ DCL VAR(&LIB) TYPE(*CHAR) LEN(10) /* Risposta al messaggio di interrogazione. */ DCL VAR(&REPLY) TYPE(*CHAR) LEN(1) /* Chiave di riferimento del messaggio di interrogazione. */ DCL VAR(&MRK) TYPE(*CHAR) LEN(4) /* Identificazione del messaggio di rilascio da inviare */ /* in caso di risposta di cancellazione. */ DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) VALUE(JPA0030) /* Nome del lavoro. */ DCL VAR(&JOB) TYPE(*CHAR) LEN(10) /* Dati per i messaggi. */ DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) /* Intercetta gli errori imprevisti. */ MONMSG MSGID(CPF0000 MCH0000 CEE0000) EXEC(GOTO + CMDLBL(ERRORE)) /* Estrae parametri. */ CHGVAR VAR(&MSGQ) VALUE(%SUBSTRING(&MSGQLIB 1 10)) CHGVAR VAR(&LIB) VALUE(%SUBSTRING(&MSGQLIB 11 10)) /* Recupera informazioni sul job. */ CALL PGM(JAIRJI) PARM(&JOB &SEV) /* Compone i dati per i messaggi. */ CHGVAR VAR(&MSGDTA) VALUE((&JOB *CAT &MSG *CAT &MSGQ)) /* Se il job ha EndSeverity maggiore di 30, */ /* cambia l'identificazione del messaggio da inviare. */ IF COND(&SEV *GT 30) THEN(CHGVAR VAR(&MSGID) + VALUE(JPA0060)) /* Se il job ha EndSeverity maggiore di 60, */ /* cambia l'identificazione del messaggio da inviare. */ IF COND(&SEV *GT 60) THEN(CHGVAR VAR(&MSGID) + VALUE(JPA0099)) /* Manda alla coda un messaggio di interrogazione */ /* che possiede una risposta di difetto in accordo con */ /* il parametro risposta di difetto. */ IF COND(&DFTRPY *EQ *CANCEL) THEN(DO) SNDPGMMSG MSGID(JPA0001) MSGF(JPAUSE) MSGDTA(&MSGDTA) + TOMSGQ(&LIB/&MSGQ) MSGTYPE(*INQ) KEYVAR(&MRK) ENDDO ELSE CMD(DO) SNDPGMMSG MSGID(JPA0004) MSGF(JPAUSE) MSGDTA(&MSGDTA) + TOMSGQ(&LIB/&MSGQ) MSGTYPE(*INQ) KEYVAR(&MRK) ENDDO /* Riceve la risposta. */ RCVMSG MSGTYPE(*RPY) MSGKEY(&MRK) WAIT(*MAX) + RMV(*NO) MSG(&REPLY) /* Per C=Cancel, manda al chiamante un messaggio di rilascio */ /* di gravità 30, 60 o 99 come richiesto dalla EndSeverity. */ IF COND(&REPLY *EQ C) THEN(SNDPGMMSG + MSGID(&MSGID) MSGF(JPAUSE) + MSGDTA(&MSGDTA) MSGTYPE(*ESCAPE)) /* Per G=Go, manda al chiamante un messaggio informativo. */ IF COND(&REPLY *EQ G) THEN(SNDPGMMSG + MSGID(JPA0003) MSGF(JPAUSE) MSGDTA(&MSGDTA)) /* Ritorna. */ RETURN /* In caso d'errore imprevisto, restituisce i messaggi al chiamante, */ /* trasformando eventuali escape in diagnostici. */ ERRORE: JRSNMSG MONMSG MSGID(CPF0000) /* Rilascia con il CPF0001. */ CPF0001: SNDPGMMSG MSGID(CPF0001) MSGF(QCPFMSG) MSGDTA(JPAUSE) + MSGTYPE(*ESCAPE) MONMSG MSGID(CPF0000) ENDPGM //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JPAUSEP) FILETYPE(*SRC) ENDCHAR('//ENDSRC') :PNLGRP. .*--------------------------------------------------------------------- :HELP NAME=CMD. :H3.Comando JPAUSE :H2.Esegue una pausa nel lavoro :P.Il comando permette di arrestare l'esecuzione del lavoro in corso, interrogare una coda messaggi e, secondo la risposta ricevuta, cancellare o continuare il lavoro interrogante. :P.Normalmente il lavoro mittente è un lavoro a blocchi ma è permesso anche un interattivo. :P.Normalmente il comando viene eseguito in una stringa di lavoro a blocchi direttamente dall'interprete (QCMD) ma nulla osta al suo uso anche in un programma. :P.La risposta di cancellazione provoca un messaggio di rilascio di gravità 30, 60 o 99 appena superiore alla End Severity del lavoro interrogante. Questo perché un lavoro a blocchi termina soltanto se il rilascio che riceve ha gravità superiore alla End Severity. :H3.Messaggi di rilascio specifici che possono essere intercettati. :PC.JPA0030 Risposta di cancellazione ad una pausa. :PC.JPA0060 Risposta di cancellazione ad una pausa. :PC.JPA0099 Risposta di cancellazione ad una pausa. :EHELP. .*--------------------------------------------------------------------- :HELP name='CMD/msg'. :H3.Inquiry message (MSG) :P.Testo del messaggio di interrogazione. :P.Valori permessi: :PARML. :PT.:PK DEF.Go or Cancel?:EPK.€ :PD.Invita l'utente che legge il messaggio sulla coda interrogata a rispondere Go per continuare o Cancel per terminare il lavoro mittente del messaggio. :PT.testo-interrogativo :PD.Stringa fino a 109 caratteri formulante una domanda che sfoci in una risposta Go oppure Cancel. :EPARML. :EHELP. .*--------------------------------------------------------------------- :HELP name='CMD/msgq'. :H3.Queried message queue (MSGQ) - queue :P.Nome della coda messaggi interrogata. :P.Valori permessi: :PARML. :PT.:PK DEF.QSYSOPR:EPK.€ :PD.Coda messaggi dell'operatore di sistema. :PT.nome-coda-messaggi € :PD.Coda messaggi richiesta. :EPARML. :H3.Queried message queue (MSGQ) - library :P.Nome della libreria in cui risiede la coda messaggi. :P.Valori permessi: :PARML. :PT.:PK DEF.*LIBL:EPK.€ :PD.La coda messaggi viene cercata in lista librerie. :PT.nome-libreria :PD.La coda messaggi viene cercata nella libreria richiesta. :EPARML. :EHELP. .*--------------------------------------------------------------------- :HELP name='CMD/dftrpy'. :H3.Default replay (DFTRPY) :P.Risposta di difetto assunta nel caso di risposta automatica a cura del sistema. :P.Il parametro permette di prenotare il comportamento in situazioni non governate dall'operatore, ad esempio durante la notte con la coda operatore in default. :P.Alcuni dei casi che provocano la risposta automatica sono: :PC.  La coda messaggi è in default. :PC.  Il messaggio di interrogazione viene cancellato. :P.Valori permessi: :PARML. :PT.:PK DEF.*CANCEL:EPK.€ :PD.La risposta di difetto sarà Cancel. :PT.*GO :PD.La risposta di difetto sarà Go. :EPARML. :EHELP. .*--------------------------------------------------------------------- :EPNLGRP. //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JPAUSETST) FILETYPE(*SRC) ENDCHAR('//ENDSRC') //BCHJOB JOB(TEST30) JOBD(QBATCH) INLLIBL(QTEMP UTI QGPL) + ENDSEV(30) LOG(4 00 *SECLVL) MSGQ(*USRPRF) JPAUSE MSG('Endsev=30') //ENDBCHJOB //BCHJOB JOB(TEST60) JOBD(QBATCH) INLLIBL(QTEMP UTI QGPL) + ENDSEV(60) LOG(4 00 *SECLVL) MSGQ(*USRPRF) JPAUSE MSG('Endsev=60') //ENDBCHJOB //ENDSRC //ENDBCHJOB