//BCHJOB JOB(JRQS) JOBD(NERONI2/NERONI2) OUTQ(QPRINT) + ENDSEV(60) LOG(4 00 *SECLVL) MSGQ(*USRPRF) /* 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-04-07 18:26 */ /* To File : "JRQS" */ /* To Library : "NERONI2" */ /* To Text : "Proto Request. Src ->N" */ /********* 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 "JRQS.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:\JRQS.txt" "/qsys.lib/NERONI2.lib/stringhe.file/JRQS.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(JRQS) 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/JRQS" */ /* FACENDO ATTENZIONE ALL'ORDINE DI ESECUZIONE INDICATO NEL */ /* MEMBRO FACOLTATIVO "A.LEGGIMI", AD ESEMPIO: */ /* SBMDBJOB FILE(NERONI2/JRQS) MBR(JRQS.) 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/JRQS) CRTSRCPF FILE(NERONI2/JRQS) RCDLEN(112) + TEXT('Proto Request. Src ->N') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JRQS) TOFILE(NERONI2/JRQS) + TOMBR(JRQS) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JRQS) MBR(JRQS) + SRCTYPE(CMD) + TEXT('Proto Request. Cmd') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JRQS.) TOFILE(NERONI2/JRQS) + TOMBR(JRQS.) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JRQS) MBR(JRQS.) + SRCTYPE(CL) + TEXT('Proto Request. CrtJs') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JRQSC) TOFILE(NERONI2/JRQS) + TOMBR(JRQSC) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JRQS) MBR(JRQSC) + SRCTYPE(CLLE) + TEXT('Proto Request. Cpp') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JRQSP) TOFILE(NERONI2/JRQS) + TOMBR(JRQSP) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JRQS) MBR(JRQSP) + SRCTYPE(PNLGRP) + TEXT('Proto Request. Help') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JRQSU) TOFILE(NERONI2/JRQS) + TOMBR(JRQSU) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JRQS) MBR(JRQSU) + SRCTYPE(CLLE) + TEXT('Proto Request. SampleUse') /*---------------------------------------------------------------------*/ //DATA FILE(JRQS) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Proto Request. Cmd */ /* Claudio Neroni 21-05-2014 Creato. */ CMD PROMPT('Proto Request') PARM KWD(CMD) TYPE(*CMDSTR) LEN(2000) MIN(1) + PROMPT('Command string') PARM KWD(CMT) TYPE(*CHAR) LEN(50) PROMPT('Prefix + comment') PARM KWD(TOPGMQ) TYPE(*CHAR) LEN(10) RSTD(*YES) + DFT(*PRV) VALUES(*PRV *PRVPRV *SAME) + PROMPT('To program queue') //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JRQS.) FILETYPE(*SRC) ENDCHAR('//ENDSRC') //BCHJOB JOB(JRQS.) JOBD(NERONI2/NERONI2) OUTQ(QPRINTS) ENDSEV(60) + LOG(4 00 *SECLVL) MSGQ(*USRPRF) /* Claudio Neroni 21-05-2014 Creato. */ /* JRQS */ /* Proto Request. */ /* Prerequisiti: nessuno */ /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP QGPL) ADDLIBLE LIB(NERONI2) POSITION(*AFTER QTEMP) /* Cancella gli oggetti preesistenti. */ DLTCMD CMD(NERONI2/JRQS) DLTPNLGRP PNLGRP(NERONI2/JRQSP) DLTPGM PGM(NERONI2/JRQSC) DLTPGM PGM(NERONI2/JRQSU) /* Crea i comandi. */ CRTCMD CMD(NERONI2/JRQS) PGM(JRQSC) SRCFILE(JRQS) + HLPPNLGRP(JRQSP) HLPID(CMD) PRDLIB(NERONI2) /* Duplica i comandi in QGPL. */ DLTCMD CMD(QGPL/JRQS*) CRTDUPOBJ OBJ(JRQS*) FROMLIB(NERONI2) OBJTYPE(*CMD) TOLIB(QGPL) /* Crea i programmi. */ CRTBNDCL PGM(NERONI2/JRQSC) SRCFILE(JRQS) TGTRLS(*CURRENT) + DBGVIEW(*ALL) CRTBNDCL PGM(NERONI2/JRQSU) SRCFILE(JRQS) TGTRLS(*CURRENT) + DBGVIEW(*ALL) /* Crea i testi d'aiuto. */ CRTPNLGRP PNLGRP(NERONI2/JRQSP) SRCFILE(JRQS) //ENDBCHJOB //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JRQSC) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Proto Request. Cpp */ /* Claudio Neroni 21-05-2014 Creato. */ /* Invia un comando sotto forma di richiesta */ /* al programma chiamante (detto "padre") */ /* o al programma chiamante del chiamante (detto "nonno"). */ /* Il comando chiamante permette la manipolazione */ /* del primo parametro come stringa comando, */ /* permettendo la composizione facilitata della richiesta */ /* anche facendo uso di variabili. */ /* Nato per preparare in log dei messaggi di richiesta */ /* prototipi-promemoria pronti alla duplicazione per essere */ /* eventualmente eseguiti. */ /* Claudio Neroni 02-11-2015 Modificato. */ /* Previsto come destinatario anche il bisnonno. */ PGM PARM(&CMD &CMT &TOPGMQ) /* Riceve Comando da inviare come richiesta. */ DCL VAR(&CMD) TYPE(*CHAR) LEN(2000) /* Riceve Commento con cui prefissare il comando inviato. */ DCL VAR(&CMT) TYPE(*CHAR) LEN(50) /* Riceve Coda programma destinatario. */ DCL VAR(&TOPGMQ) TYPE(*CHAR) LEN(10) /* Richiesta da inviare. */ DCL VAR(&RQS) TYPE(*CHAR) LEN(2004) /* Nome del programma chiamante (o "padre"). */ DCL VAR(&CALLER) TYPE(*CHAR) LEN(10) /* Nome del programma chiamante del chiamante (o "nonno"). */ DCL VAR(&CALCALLER) TYPE(*CHAR) LEN(10) /* Chiave del messaggio. */ DCL VAR(&MRK) TYPE(*CHAR) LEN(4) /* Identificazione del mittente di un messaggio. */ DCL VAR(&SENDER) TYPE(*CHAR) LEN(80) /* Se è richiesta la segnalazione al nonno o al bisnonno,... */ /* cerca il nome del padre. */ IF COND((&TOPGMQ *EQ *PRV) *OR (&TOPGMQ *EQ + *PRVPRV)) THEN(DO) /* Manda un messaggio al padre. */ SNDPGMMSG MSG('Messaggio di comodo per + l''individuazione del programma padre.') + KEYVAR(&MRK) /* Riceve il messaggio appena inviato rimuovendolo. */ RCVMSG PGMQ(*PRV) MSGTYPE(*INFO) MSGKEY(&MRK) + SENDER(&SENDER) /* Dal parametro SENDER, estrae il nome del padre. */ CHGVAR VAR(&CALLER) VALUE(%SUBSTRING(&SENDER 56 10)) /* Se è richiesta la segnalazione al nonno o al bisnonno,... */ ENDDO /* Se è richiesta la segnalazione al bisnonno, cerca il nome del nonno. */ IF COND(&TOPGMQ *EQ *PRVPRV) THEN(DO) /* Manda un messaggio al nonno. */ SNDPGMMSG MSG('Messaggio di comodo per + l''individuazione del programma nonno.') + TOPGMQ(*PRV (&CALLER)) KEYVAR(&MRK) /* Riceve il messaggio appena inviato rimuovendolo. */ RCVMSG PGMQ(*PRV (&CALLER)) MSGTYPE(*INFO) + MSGKEY(&MRK) SENDER(&SENDER) /* Dal parametro SENDER, estrae il nome del nonno. */ CHGVAR VAR(&CALCALLER) VALUE(%SUBSTRING(&SENDER 56 + 10)) /* Se è richiesta la segnalazione al bisnonno, cerca il nome del nonno. */ ENDDO /* Compone il messaggio di richiesta da inviare. */ CHGVAR VAR(&RQS) VALUE('/*' *TCAT &CMT *TCAT '*/' + *CAT &CMD) /* Se richiesto destinatario bisnonno, gli spedisce la richiesta. */ IF COND(&TOPGMQ *EQ *PRVPRV) THEN(SNDPGMMSG + MSG(&RQS) TOPGMQ(*PRV (&CALCALLER)) + MSGTYPE(*RQS)) /* Se richiesto destinatario nonno, gli spedisce la richiesta. */ IF COND(&TOPGMQ *EQ *PRV) THEN(SNDPGMMSG + MSG(&RQS) TOPGMQ(*PRV (&CALLER)) + MSGTYPE(*RQS)) /* Se richiesto destinatario padre, gli spedisce la richiesta. */ IF COND(&TOPGMQ *EQ *SAME) THEN(SNDPGMMSG + MSG(&RQS) MSGTYPE(*RQS)) ENDPGM //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JRQSP) FILETYPE(*SRC) ENDCHAR('//ENDSRC') :PNLGRP. .*--------------------------------------------------------------------- :HELP NAME=CMD. :H3.Comando JRQS :H2.Scrive in joblog un messaggio di richiesta inattivo ma duplicabile. :P.Il comando permette di posizionare un messaggio di richiesta duplicabile per l'esecuzione nel log visualizzato dal video comandi che lo chiama. :P.Invia un comando sotto forma di richiesta al programma chiamante (detto "padre") o al programma chiamante del chiamante (detto "nonno"). :P.Il comando corrente permette la manipolazione del primo parametro come stringa comando, permettendo la composizione facilitata della richiesta anche facendo uso di variabili. :P.Nato per preparare in log dei messaggi di richiesta prototipi-promemoria pronti alla duplicazione per essere eventualmente eseguiti. :P.Si rileva che un messaggio di richiesta viene eseguito solo se inviato alla coda esterna (*EXT). Il comando JRQS non manda niente alla coda esterna. :P.Si riporta un esempio d'uso del corrente comando, presente anche nei sorgenti. :XMP. /* Proto Request. SampleUse */ /* Claudio Neroni 23-05-2014 Creato. */ /* Esempio d'uso di JRQS. */ /* Può essere chiamato dal video comandi per provare l'esito. */ PGM CHGLIBL LIBL(QTEMP NERONI2 QGPL) JRQS CMD(WRKOBJPDM LIB(NERONI2) OBJTYPE(*FILE) + OBJATR(*SRC)) CMT('Abc') ENDPGM :EXMP. :P.Chiamata l'esecuzione dal video comandi si ottiene il sequente log. :XMP. > call jrqsu > /*Abc*/WRKOBJPDM LIB(NERONI2) OBJTYPE(*FILE) OBJATR(*SRC) :EXMP. :P.Per duplicare ed eseguire il messaggio di richiesta, premere F9, eventualmente dopo aver posizionato il cursore 5250 sul messaggio. :EHELP. .*--------------------------------------------------------------------- :HELP name='CMD/cmd'. :H3.Command (CMD) :P.Stringa comando da sottomettere come richiesta disattiva ma duplicabile. :P.Valori permessi: :PARML. :PT.stringa-comando-eseguibile :PD.Il valore è obbligatorio. :P.Il parametro deve contenere un comando valido e formalmente eseguibile. Se JRQS è usato all'interno di un programma CLP o CLLE, nella stringa possono essere presenti anche le variabili :HP2."&variabile":EHP2. tipiche dei programmi in control language. Al momento dell'esecuzione verranno sostituite con il valore attuale della variabile rappresentata. :P.Il messaggio di richiesta viene corredato di un prefisso "/**/" utile a distinguerlo dagli altri comandi fotografati in job log. Il prefisso è un commento ed è indifferente al momento dell'esecuzione. Tra i due asterischi viene posizionata l'eventuale stringa di commento proveniente dal parametro :HP2.CMT:EHP2.. :EPARML. :EHELP. .*--------------------------------------------------------------------- :HELP name='CMD/cmt'. :H3.Prefix Comment (CMT) :P.Comando Prefisso. :P.Valori permessi: :PARML. :PT.stringa-commento :PD.Il parametro è facoltativo e viene inserito in testa al comando sottomesso all'interno dei delimitatori di commento. :EPARML. :EHELP. .*--------------------------------------------------------------------- :HELP name='CMD/topgmq'. :H3.To Program Queue (TOPGMQ) :P.Destinatario del messaggio di richiesta. :P.Valori permessi: :PARML. :PT.:PK DEF.*PRV:EPK. :PD.La richiesta viene inviata al programma chiamante del chiamante, detto altrimenti "nonno". :P.Questa scelta è utile se il corrente comando è usato all'interno di un altro programma. Quando JRQS verrà chiamato da un video comandi, il messaggio di richiesta sarà visibile a fine esecuzione su quello stesso video comandi. :PT.*PRVPRV :PD.La richiesta viene inviata al programma chiamante del chiamante del chiamante, detto altrimenti "bisnonno". :P.Rispetto alla scelta *PRV si risale a monte di una posizione nella lista di chiamata dei programmi. :PT.*SAME :PD.La richiesta viene inviata al programma chiamante, detto altrimenti "padre". :P.Questa scelta è utile se il corrente comando è usato direttamente da un video comandi. In tal caso il messaggio di richiesta sarà visibile a fine esecuzione su quello stesso video comandi. L'opzione :HP2.*SAME:EHP2. è prevista per completezza ma non se ne vede uso. :EPARML. :EHELP. .*--------------------------------------------------------------------- :EPNLGRP. //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JRQSU) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Proto Request. SampleUse */ /* Claudio Neroni 23-05-2014 Creato. */ /* Esempio d'uso di JRQS. */ /* Può essere chiamato dal video comandi per provare l'esito. */ PGM CHGLIBL LIBL(QTEMP NERONI2 QGPL) JRQS CMD(WRKOBJPDM LIB(NERONI2) OBJTYPE(*FILE) + OBJATR(*SRC)) CMT('Abc') ENDPGM //ENDSRC //ENDBCHJOB