//BCHJOB JOB(JCALLER) 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: "DEV720" */ /* From Library: "NERONI2" */ /* Unload Time: 2016-04-29 16:33 */ /* To File : "JCALLER" */ /* To Library : "NERONI2" */ /* To Text : "Retrieve caller. 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 "JCALLER.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:\JCALLER.txt" "/qsys.lib/NERONI2.lib/stringhe.file/JCALLER.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(JCALLER) 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/JCALLER" */ /* FACENDO ATTENZIONE ALL'ORDINE DI ESECUZIONE INDICATO NEL */ /* MEMBRO FACOLTATIVO "A.LEGGIMI", AD ESEMPIO: */ /* SBMDBJOB FILE(NERONI2/JCALLER) MBR(JCALLER.) 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/JCALLER) CRTSRCPF FILE(NERONI2/JCALLER) RCDLEN(112) + TEXT('Retrieve caller. Src') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCALLER) TOFILE(NERONI2/JCALLER) + TOMBR(JCALLER) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCALLER) MBR(JCALLER) + SRCTYPE(CMD) + TEXT('Retrieve caller. Cmd') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCALLER.) TOFILE(NERONI2/JCALLER) + TOMBR(JCALLER.) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCALLER) MBR(JCALLER.) + SRCTYPE(CL) + TEXT('Retrieve caller. CrtJs') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCALLERC) TOFILE(NERONI2/JCALLER) + TOMBR(JCALLERC) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCALLER) MBR(JCALLERC) + SRCTYPE(CLLE) + TEXT('Retrieve caller. Cpp') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCALLERI) TOFILE(NERONI2/JCALLER) + TOMBR(JCALLERI) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCALLER) MBR(JCALLERI) + SRCTYPE(CMD) + TEXT('Retrieve caller. CmdInter') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCALLERP) TOFILE(NERONI2/JCALLER) + TOMBR(JCALLERP) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCALLER) MBR(JCALLERP) + SRCTYPE(PNLGRP) + TEXT('Retrieve caller. Help') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCALLERTST) TOFILE(NERONI2/JCALLER) + TOMBR(JCALLERTST) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCALLER) MBR(JCALLERTST) + SRCTYPE(CLLE) + TEXT('Retrieve caller. Test') /*----------------------------------------------------------------------------*/ //DATA FILE(JCALLER) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Retrieve caller. Cpp */ /* Claudio Neroni ??-??-???? Creato. */ /* Restituisce il nome del chiamante del chiamante */ /* o, a richiesta, del chiamante. */ /* Claudio Neroni 11-01-2016 Modificato. */ /* Introdotto il parametro KINSHIP (Parentela) per ottenere, volendo, */ /* il nome del padre invece che del nonno. */ /* */ CMD PROMPT('Retrieve caller') PARM KWD(CALLER) TYPE(*CHAR) LEN(10) RTNVAL(*YES) + MIN(1) PROMPT('Var 10: Caller Program name') PARM KWD(KINSHIP) TYPE(*CHAR) LEN(12) RSTD(*YES) + DFT(*GRANDFATHER) VALUES(*GRANDFATHER + *FATHER) PROMPT('Kinship father/grandfather') //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JCALLER.) FILETYPE(*SRC) ENDCHAR('//ENDSRC') //BCHJOB JOB(JCALLER.) JOBD(NERONI2/NERONI2) OUTQ(QPRINTS) + ENDSEV(60) LOG(4 00 *SECLVL) MSGQ(*USRPRF) CCSID(280) /* Claudio Neroni ??-??-???? Creato. */ /* JCALLER */ /* Retrieve caller. */ /* Prerequisiti: nessuno */ /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP QGPL) ADDLIBLE LIB(NERONI2) POSITION(*AFTER QTEMP) /* Cancella il file messaggi preesistente. */ DLTMSGF MSGF(NERONI2/JCALLER) /* Cancella i testi d'aiuto preesistenti. */ DLTPNLGRP PNLGRP(NERONI2/JCALLERP) /* Cancella i logici preesistenti. */ /* Cancella i fisici preesistenti. */ /* Cancella i comandi preesistenti. */ DLTCMD CMD(NERONI2/JCALLER) DLTCMD CMD(NERONI2/JCALLERI) /* Cancella i programmi preesistenti. */ DLTPGM PGM(NERONI2/JCALLERC) DLTPGM PGM(NERONI2/JCALLERTST) /* Crea i file fisici. */ /* Crea i comandi. */ CRTCMD CMD(NERONI2/JCALLER) PGM(JCALLERC) SRCFILE(JCALLER) + ALLOW(*IPGM *BPGM) HLPPNLGRP(JCALLERP) HLPID(CMD) + PRDLIB(NERONI2) CRTCMD CMD(NERONI2/JCALLERI) PGM(JCALLERC) SRCFILE(JCALLER) + HLPPNLGRP(JCALLERP) HLPID(CMD) PRDLIB(NERONI2) /* Duplica i comandi in QGPL. */ CRTPRXCMD CMD(QGPL/JCALLER) TGTCMD(NERONI2/JCALLER) AUT(*USE) + REPLACE(*YES) CRTPRXCMD CMD(QGPL/JCALLERI) TGTCMD(NERONI2/JCALLERI) AUT(*USE) + REPLACE(*YES) /* Crea i programmi. */ CRTBNDCL PGM(NERONI2/JCALLERC) SRCFILE(JCALLER) TGTRLS(*CURRENT) + DBGVIEW(*ALL) CRTBNDCL PGM(NERONI2/JCALLERTST) SRCFILE(JCALLER) TGTRLS(*CURRENT) + DBGVIEW(*ALL) /* Crea il file messaggi. */ CRTMSGF MSGF(NERONI2/JCALLER) TEXT('Retrieve caller. Msgf') /* Fotografia comandi (xxxA001). */ /* Messaggi comuni a pgm di comandi diversi (xxx0001). */ /* Messaggi nei pgm del Cmd 1 (xxx0101). */ ADDMSGD MSGID(JCA0101) MSGF(JCALLER) MSG('Chiamato da &1 a sua + volta chiamato da &2') FMT((*CHAR 10) (*CHAR 10)) ADDMSGD MSGID(JCA0102) MSGF(JCALLER) MSG('Chiamato da &1') + FMT((*CHAR 10)) ADDMSGD MSGID(JCA0191) MSGF(JCALLER) MSG('Errore imprevisto nel + comando JCALLER') SECLVL('Cerca nel log le cause del + fallimento.') /* Messaggi nei pgm del Cmd 2 (xxx0201). */ /* Messaggi dei Cmd (xxx1001). */ /* Crea i testi d'aiuto. */ CRTPNLGRP PNLGRP(NERONI2/JCALLERP) SRCFILE(JCALLER) //ENDBCHJOB //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JCALLERC) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Retrieve caller. Cpp */ /* Claudio Neroni ??-??-???? Creato. */ /* Restituisce il nome del chiamante del chiamante */ /* o, a richiesta, del chiamante. */ /* Claudio Neroni 11-01-2016 Modificato. */ /* Introdotto il parametro KINSHIP (Parentela) per ottenere, volendo, */ /* il nome del padre invece che del nonno. */ /* */ PGM PARM(&CALCALLER &KINSHIP) /* Riceve Richiesta di messaggio informativo. */ /* Restituisce Nome del programma chiamante del chiamante o */ /* Nome del programma chiamante. */ DCL VAR(&CALCALLER) TYPE(*CHAR) LEN(10) /* Riceve Parentela richiesta (Nonno o Padre). */ DCL VAR(&KINSHIP) TYPE(*CHAR) LEN(12) /* Identificazione del mittente di un messaggio. */ DCL VAR(&SENDER) TYPE(*CHAR) LEN(80) /* Nome del programma chiamante. */ DCL VAR(&CALLER) TYPE(*CHAR) LEN(10) /* Chiave di riferimento del messaggio. */ DCL VAR(&MRK) TYPE(*CHAR) LEN(4) /* Annotazione di richiesta di messaggio informativo. */ DCL VAR(&MSGRQS) TYPE(*LGL) VALUE('0') /* Intercetta tutti gli errori. */ MONMSG MSGID(CPF0000 MCH0000) EXEC(GOTO + CMDLBL(ERRORE)) /* Se richiesto messaggio informativo, lo annota. */ IF COND(&CALCALLER *EQ *MSG) THEN(CHGVAR + VAR(&MSGRQS) VALUE('1')) /* Manda un messaggio al chiamante per individuarne il nome. */ SNDPGMMSG MSG('Messaggio di comodo per + l''individuazione del programma + chiamante.') KEYVAR(&MRK) /* Riceve il messaggio appena inviato. */ RCVMSG PGMQ(*PRV) MSGTYPE(*INFO) MSGKEY(&MRK) + SENDER(&SENDER) /* Estrae il nome del programma chiamante dal parametro */ /* di identificazione del mittente messaggio. */ CHGVAR VAR(&CALLER) VALUE(%SST(&SENDER 56 10)) CHGVAR VAR(&CALCALLER) VALUE(&CALLER) /* Se richiesto il nonno invece che il padre. */ IF COND(&KINSHIP *EQ *GRANDFATHER) THEN(DO) /* Manda un messaggio al chiamante del chiamante */ /* per individuarne il nome. */ SNDPGMMSG MSG('Messaggio di comodo per + l''individuazione del programma chiamante + del chiamante.') TOPGMQ(*PRV &CALLER) + KEYVAR(&MRK) /* Riceve il messaggio appena inviato. */ RCVMSG PGMQ(*PRV &CALLER) MSGTYPE(*INFO) + MSGKEY(&MRK) SENDER(&SENDER) /* Estrae il nome del programma chiamante del chiamante dal parametro */ /* di identificazione del mittente messaggio. */ CHGVAR VAR(&CALCALLER) VALUE(%SST(&SENDER 56 10)) /* Se richiesto il nonno invece che il padre. */ ENDDO /* Se richiesto messaggio informativo, lo spedisce. */ IF COND(&MSGRQS) THEN(DO) IF COND(&KINSHIP *EQ *GRANDFATHER) + THEN(SNDPGMMSG MSGID(JCA0101) + MSGF(JCALLER) MSGDTA(&CALLER *CAT + &CALCALLER) MSGTYPE(*INFO)) ELSE CMD(SNDPGMMSG MSGID(JCA0102) MSGF(JCALLER) + MSGDTA(&CALLER) MSGTYPE(*INFO)) ENDDO /* Ritorna. */ RETURN /* Errore. */ ERRORE: /* Segnala errore imprevisto. */ SNDPGMMSG MSGID(JCA0191) MSGF(JCALLER) MSGTYPE(*DIAG) ENDPGM //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JCALLERI) FILETYPE(*SRC) ENDCHAR('//ENDSRC') CMD PROMPT('Interact Retrieve caller') PARM KWD(CALLER) TYPE(*CHAR) LEN(10) CONSTANT(*MSG) PARM KWD(KINSHIP) TYPE(*CHAR) LEN(12) RSTD(*YES) + DFT(*GRANDFATHER) VALUES(*GRANDFATHER + *FATHER) PROMPT('Kinship father/grandfather') //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JCALLERP) FILETYPE(*SRC) ENDCHAR('//ENDSRC') :PNLGRP. .*--------------------------------------------------------------------- :HELP NAME=CMD. :H3.Comando JCALLER :H2.Retrieve caller :P.Recupera il nome del programma nonno (chiamante del chiamante) o del programma padre (chiamante). :H3.Comando JCALLERI :H2.Interact Retrieve caller :P.Al solo scopo di verificare interattivamente il command processing program in comune con il comando JCALLER, non richiede la variabile di ritorno e, in luogo di quella, restituisce un messaggio informativo in log. :EHELP. .*--------------------------------------------------------------------- :HELP name='CMD/caller'. :H3.Var 10: Caller Program name (CALLER) :P.Variabile di ritorno di tipo carattere adatta a contenere il nome del programma nonno (chiamante del chiamante) o del programma padre (chiamante). :P.Valori permessi: :PARML. :PT.Variabile di 10 caratteri. :PD.La variabile e' obbligatoria. :EPARML. :EHELP. .*--------------------------------------------------------------------- :HELP name='CMD/kinship'. :H3.Kinship father/grandfather (KINSHIP) :P.Relazione di parentela richiesta rispetto al programma esecutore del comando corrente. :P.Valori permessi: :PARML. :PT.:PK DEF.*GRANDFATHER:EPK. :PD.Richiede il nome del programma nonno (chiamante del chiamante del comando corrente). :PT.*FATHER :PD.Richiede il nome del programma padre (chiamante del comando corrente). :P.In un RPG il nome del programma e' reperibile all'interno del programma stesso tramite la lettura della program status data structure. L'espediente non e' invece disponibile all'interno di un CL. Non volendo cablare un nome che potrebbe cambiare per copiatura distratta del sorgente originale o per ridenominazione dell'oggetto compilato, il valore *FATHER all'interno del presente parametro permette anche ad un CL di conoscere il proprio nome. :EPARML. :EHELP. .*--------------------------------------------------------------------- :HELP NAME='CMD/COMMAND/EXAMPLES'. Esempi per JCALLER :XH3.Esempi per JCALLER :P.:HP2.Esempio 1: Restituisce nella variabile &CALLER il nome del programma nonno (chiamante del chiamante).:EHP2. :XMP. Con i soli parametri necessari: JCALLER CALLER(&CALLER) Anche con i parametri di default: JCALLER CALLER(&CALLER) KINSHIP(*GRANDFATHER) :EXMP. :P.Questo comando permette di conoscere il nome del programma che ha chiamato il programma esecutore del comando JCALLER. :P.:HP2.Esempio 2: Restituisce nella variabile &CALLER il nome del programma padre (chiamante).:EHP2. :XMP. Con tutti i parametri, tutti necessari. JCALLER CALLER(&CALLER) KINSHIP(*FATHER) :EXMP. :P.Questo comando permette di conoscere il nome del programma esecutore del comando JCALLER. :EHELP. .*--------------------------------------------------------------------- :HELP NAME='CMD/ERROR/MESSAGES'. &MSG(CPX0005,QCPFMSG). JCALLER - Help :XH3.&MSG(CPX0005,QCPFMSG). JCALLER :P.:HP3.&MSG(CPX0006,QCPFMSG). *DIAG:EHP3. senza seguito di :HP3.*ESCAPE:EHP3. :P.A termine esecuzioe, in caso di errore imprevisto :DL COMPACT. :DT.JCA0191 :DD.&MSG(JCA0191,JCALLER,*LIBL,nosub). :EDL. :EHELP. .*--------------------------------------------------------------------- :EPNLGRP. //ENDSRC /*----------------------------------------------------------------------------*/ //DATA FILE(JCALLERTST) FILETYPE(*SRC) ENDCHAR('//ENDSRC') PGM DCL VAR(&CALLER) TYPE(*CHAR) LEN(10) JCALLER CALLER(&CALLER) KINSHIP(*GRANDFATHER) SNDPGMMSG MSG('1: Nome pgm chiamante:' *BCAT + &CALLER) CHGVAR VAR(&CALLER) VALUE(*MSG) JCALLER CALLER(&CALLER) KINSHIP(*GRANDFATHER) SNDPGMMSG MSG('2: Nome pgm chiamante:' *BCAT + &CALLER) JCALLER CALLER(&CALLER) KINSHIP(*FATHER) SNDPGMMSG MSG('3: Nome pgm chiamante:' *BCAT + &CALLER) CHGVAR VAR(&CALLER) VALUE(*MSG) JCALLER CALLER(&CALLER) KINSHIP(*FATHER) SNDPGMMSG MSG('4: Nome pgm chiamante:' *BCAT + &CALLER) JCALLERI KINSHIP(*GRANDFATHER) JCALLERI KINSHIP(*FATHER) ENDPGM //ENDSRC //ENDBCHJOB