//BCHJOB JOB(JEXECJS) 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-10-14 14:03 */ /* To File : "JEXECJS" */ /* To Library : "NERONI2" */ /* To Text : "Execute Job Stream. 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 "JEXECJS.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:\JEXECJS.txt" "/qsys.lib/NERONI2.lib/stringhe.file/JEXECJS.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(JEXECJS) 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/JEXECJS" */ /* FACENDO ATTENZIONE ALL'ORDINE DI ESECUZIONE INDICATO NEL */ /* MEMBRO FACOLTATIVO "A.LEGGIMI", AD ESEMPIO: */ /* SBMDBJOB FILE(NERONI2/JEXECJS) MBR(JEXECJS.) 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/JEXECJS) CRTSRCPF FILE(NERONI2/JEXECJS) RCDLEN(112) + TEXT('Execute Job Stream. Src') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JEXECJS) TOFILE(NERONI2/JEXECJS) + TOMBR(JEXECJS) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JEXECJS) MBR(JEXECJS) + SRCTYPE(CMD) + TEXT('Execute job stream. Cmd') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JEXECJS.) TOFILE(NERONI2/JEXECJS) + TOMBR(JEXECJS.) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JEXECJS) MBR(JEXECJS.) + SRCTYPE(CL) + TEXT('Execute job stream. CrtJs') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JEXECJSP) TOFILE(NERONI2/JEXECJS) + TOMBR(JEXECJSP) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JEXECJS) MBR(JEXECJSP) + SRCTYPE(PNLGRP) + TEXT('Execute job stream. Help') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JEXECJS1) TOFILE(NERONI2/JEXECJS) + TOMBR(JEXECJS1) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JEXECJS) MBR(JEXECJS1) + SRCTYPE(CLP) + TEXT('Execute job stream. Cpp') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JEXECJS2) TOFILE(NERONI2/JEXECJS) + TOMBR(JEXECJS2) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JEXECJS) MBR(JEXECJS2) + SRCTYPE(RPG) + TEXT('Execute job stream. ReadRcdFromSrc') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(TEST1) TOFILE(NERONI2/JEXECJS) + TOMBR(TEST1) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JEXECJS) MBR(TEST1) + SRCTYPE(CL) + TEXT('Execute Job Stream. Test 1') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(TEST2) TOFILE(NERONI2/JEXECJS) + TOMBR(TEST2) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JEXECJS) MBR(TEST2) + SRCTYPE(CL) + TEXT('Execute Job Stream. Test 2') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(TEST3) TOFILE(NERONI2/JEXECJS) + TOMBR(TEST3) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JEXECJS) MBR(TEST3) + SRCTYPE(RPGLE) + TEXT('Execute Job Stream. Test 3') /*---------------------------------------------------------------------*/ //DATA FILE(JEXECJS) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Execute job stream. */ /* Claudio Neroni 24/03/1982 Creato. */ /* */ CMD PROMPT('Execute job stream') PARM KWD(SRCFILE) TYPE(UNO) PROMPT('Source File') UNO: QUAL TYPE(*NAME) DFT(QCLSRC) QUAL TYPE(*NAME) DFT(*LIBL) SPCVAL((*LIBL)) + PROMPT('in library') PARM KWD(SRCMBR) TYPE(*NAME) PROMPT('Source Member') PARM KWD(EXCPGM) TYPE(*NAME) RSTD(*YES) DFT(QCMD) + VALUES(QCMD QCL) PROMPT('Executor if + interactive') PARM KWD(RETURN) TYPE(*CHAR) LEN(10) RSTD(*YES) + DFT(*YES) VALUES(*YES *NO) PROMPT('Return + if interactive') //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JEXECJS.) FILETYPE(*SRC) ENDCHAR('//ENDSRC') //BCHJOB JOB(JEXECJS.) JOBD(NERONI2/NERONI2) OUTQ(QPRINTS) + ENDSEV(60) LOG(4 00 *SECLVL) MSGQ(*USRPRF) /* Claudio Neroni 24/03/1982 Creato. */ /* JEXECJS */ /* Execute job stream. */ /* Accoda come richieste ed eventualmente esegue */ /* i comandi contenuti in un membro source. */ /* Prerequisiti: JRSNMSG, JRECURS */ /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP QGPL) ADDLIBLE LIB(NERONI2) POSITION(*AFTER QTEMP) /* Cancella gli oggetti preesistenti. */ DLTPGM PGM(NERONI2/JEXECJS1) DLTCMD CMD(NERONI2/JEXECJS) DLTPNLGRP PNLGRP(NERONI2/JEXECJSP) DLTMSGF MSGF(NERONI2/JEXECJS) /* Crea gli oggetti. */ CRTCLPGM PGM(NERONI2/JEXECJS1) SRCFILE(JEXECJS) OPTION(*LSTDBG) CRTRPGPGM PGM(NERONI2/JEXECJS2) SRCFILE(JEXECJS) OPTION(*LSTDBG) CRTPNLGRP PNLGRP(NERONI2/JEXECJSP) SRCFILE(JEXECJS) CRTCMD CMD(NERONI2/JEXECJS) PGM(JEXECJS1) SRCFILE(JEXECJS) + MSGF(JEXECJS) HLPPNLGRP(JEXECJSP) HLPID(CMD) + PRDLIB(NERONI2) CRTMSGF MSGF(NERONI2/JEXECJS) TEXT('Execute job stream. Msgf') /* Messaggi del Ccp. */ ADDMSGD MSGID(JEX0030) MSGF(NERONI2/JEXECJS) MSG('&1') SECLVL('TESTO + INTERO: &1') SEV(30) FMT((*CHAR 512)) ADDMSGD MSGID(JEX0054) MSGF(NERONI2/JEXECJS) MSG('Il file &2/&1 non è + di tipo source.') SECLVL('Il membro &3 del file &1 + nella libreria &2 è stato aperto per un''attività che + richiede un file source. Esso tuttavia non possiede + caratteristiche source.') FMT((*CHAR 10) (*CHAR 10) + (*CHAR 10)) ADDMSGD MSGID(JEX0055) MSGF(NERONI2/JEXECJS) MSG('Dati troncati dal + file source &2/&1.') SECLVL('Il membro &3 del file &1 + nella libreria &2 è stato aperto per un''attività che + richiede un file source. Esso possiede caratteristiche + source ma la sua lunghezza record è superiore a quella + tollerata nell''attività in corso. Il reperimento dei + dati avverrebbe col troncamento della loro parte + finale.') FMT((*CHAR 10) (*CHAR 10) (*CHAR 10)) /* Messaggi del Cmd. */ //ENDBCHJOB //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JEXECJSP) FILETYPE(*SRC) ENDCHAR('//ENDSRC') :PNLGRP. .*--------------------------------------------------------------------- :HELP NAME=CMD. :H3.Comando JEXECJS :H2.Esegue la Job Stream contenuta in un membro source. :P.Il comando permette di eseguire i comandi CL presenti all'interno di un membro sorgente scritti con il controllo di sintassi CL del SEU. :P.I comandi contenuti nel sorgente vengono inviati come messaggi di richiesta alla coda esterna del job esecutore. Se il lavoro e' interattivo, viene accodata anche la chiamata al programma esecutore dei comandi QCMD/QCL. Se il lavoro e' batch, i comandi vengono eseguiti dal QCMD/QCL gia' attivo dopo lo smaltimento delle richieste gia' pendenti. Se richiesto dal parametro RETURN, il QCMD/QCL interattivo richiamato viene chiuso da un RETURN accodato per ultimo alle richieste. :P.Se in una riga e' presente la parola JEXECJSEND, l'esecuzione dei comandi viene immediatamente abbandonata. Il comando si presta quindi ad eseguire dei comandi CL in testa ad un sorgente e ad abbandonare l'esecuzione allla riga desiderata. I comandi vengono eseguiti uno dopo l'altro senza riguardo all'esito ottenuto. In particolare il cattivo esito di un comando non impedisce l'esecuzione dei successivi. :P.Nei sorgenti di tipo CL sono spesso presenti comandi su piu' righe e ogni riga salvo l'ultima del comando spezzato termina con "+". La corrente utility per ogni riga del sorgente accoda un messaggio di richiesta che termina quindi con "+". La circostanza non da' problemi perche' QCMD/QCL risolvono di loro tale inciampo. :EHELP. .*--------------------------------------------------------------------- :HELP name='CMD/srcfile'. :H3.Source file (SRCFILE) - file :P.Nome del file sorgente in cui risiede il membro che contiene la stringa da eseguire immediatamente e non tramite sottomissione batch. :P.Valori permessi: :PARML. :PT.:PK DEF.QCLSRC:EPK.€ :PD.Il nome e' quello del contenitore standard di Control Language. :PT.nome-file-sorgente € :PD.Il file ha il nome richiesto. :EPARML. :H3.Source file (SRCFILE) - library :P.Nome della libreria in cui risiede il file. :P.Valori permessi: :PARML. :PT.:PK DEF.*LIBL:EPK.€ :PD.Il file sorgente viene cercato in lista librerie. :PT.nome-libreria :PD.Il file sorgente viene cercato nella libreria richiesta. :EPARML. :EHELP. .*--------------------------------------------------------------------- :HELP name='CMD/srcmbr'. :H3.Source member (SRCMBR) :P.Nome del membro sorgente che contiene la stringa da eseguire immediatamente e non tramite sottomissione batch. :P.Valori permessi: :PARML. :PT.nome-membro-sorgente € :PD.Il valore e' obbligatorio. :EPARML. :EHELP. .*--------------------------------------------------------------------- :HELP name='CMD/excpgm'. :H3.Executor if interactive (EXCPGM) :P.Programma esecutore dei comandi CL contenuti nel membro. :PARML. :PT.:PK DEF.QCMD:EPK. :PD.L'esecutore e' il programma gestore delle richieste nella sintassi AS400. :PT.QCL :PD.L'esecutore e' il programma gestore delle richieste nella sintassi S38 (Sistema/38). :EPARML. :EHELP. .*--------------------------------------------------------------------- :HELP name='CMD/return'. :H3.Return if interactive (RETURN) :P.Al termine dell'esecuzione dei comandi della stringa, ritorna al chiamante o no. Il parametro ha significato solo se il lavoro e' eseguito interattivamente. :P.Valori permessi: :PARML. :PT.:PK DEF.*YES:EPK. :PD.Ritorna al chiamante. :PT.*NO :PD.Non ritorna al chiamante ma accoda in joblog un messaggio di invito a premere F3 o F12. :EPARML. :EHELP. .*--------------------------------------------------------------------- :EPNLGRP. //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JEXECJS1) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Execute job stream. */ /* Claudio Neroni 24/03/1982 Creato. */ /* */ /* Accoda come richieste ed eventualmente esegue */ /* i comandi contenuti in un membro source. */ /* ATTENZIONE: il programma contiene Transfer Control, */ /* non eseguibile in CLLE. NON CONVERTIRE IN CLLE. */ /* */ PGM PARM(&FILELIB &MBR &EXCPGM &RETURN) /* Riceve File source e libreria ove risiede. */ DCL VAR(&FILELIB) TYPE(*CHAR) LEN(20) /* Riceve Membro source contenente la job stream da accodare. */ DCL VAR(&MBR) TYPE(*CHAR) LEN(10) /* Riceve Programma esecutore delle richieste interattive. */ DCL VAR(&EXCPGM) TYPE(*CHAR) LEN(10) /* Riceve Ritorna se interattivo. */ DCL VAR(&RETURN) TYPE(*CHAR) LEN(10) /* File source. */ DCL VAR(&FILE) TYPE(*CHAR) LEN(10) /* Libreria ove risiede il file source. */ DCL VAR(&LIB) TYPE(*CHAR) LEN(10) /* Record letto dal membro source. */ DCL VAR(&RECORD) TYPE(*CHAR) LEN(132) /* Caratteristica del file aperto: se source, uguale "Y". */ DCL VAR(&Y) TYPE(*CHAR) LEN(1) /* Lunghezza del primo record letto. */ DCL VAR(&LENGTH) TYPE(*DEC) LEN(9 0) /* Last record nel membro source. */ DCL VAR(&LR) TYPE(*LGL) /* Tipo del lavoro corrente. */ DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) /* Flag di fatte le attività previste sul primo record letto. */ DCL VAR(&FATTO) TYPE(*LGL) /* Dati per i messaggi. */ DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(132) /* QCMD è già presente nell'invocation stack del lavoro. */ DCL VAR(&QCMD) TYPE(*LGL) /* QCL è già presente nell'invocation stack del lavoro. */ DCL VAR(&QCL) TYPE(*LGL) /* Intercetta gli errori. */ MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(ERRORE)) /* Recupera attributi del lavoro. */ RTVJOBA TYPE(&TYPE) /* Estrae dati dalle variabili ricevute. */ CHGVAR VAR(&FILE) VALUE(%SST(&FILELIB 1 10)) CHGVAR VAR(&LIB) VALUE(%SST(&FILELIB 11 10)) /* Controlla l'esistenza del membro source contenente la job stream. */ CHKOBJ OBJ(&LIB/&FILE) OBJTYPE(*FILE) MBR(&MBR) /* Se è in corso un lavoro batch e se QCL o QCMD non sono già */ /* presenti in invocation stack, rilascia. */ IF COND((&TYPE *NE '1')) THEN(DO) JRECURS PGM(QCMD) RECURS(&QCMD) IF COND(*NOT &QCMD) THEN(DO) JRECURS PGM(QCL) RECURS(&QCL) IF COND(*NOT &QCL) THEN(DO) SNDPGMMSG MSGID(JEX0030) MSGF(JEXECJS) MSGDTA('Il + supervisore batch non è QCMD né QCL.') + MSGTYPE(*DIAG) GOTO CMDLBL(CPF0001) ENDDO ENDDO ENDDO /* Ridirige il programma di lettura dei dati source. */ OVRDBF FILE(JEXECJS) TOFILE(&LIB/&FILE) MBR(&MBR) + LVLCHK(*NO) SECURE(*YES) /* Ricicla sino ad esaurire i record del membro source. */ /* Ogni record letto viene spedito come messaggio di richiesta */ /* alla coda esterna del job. */ LOOP: CALL PGM(JEXECJS2) PARM(&RECORD &Y &LENGTH &LR) /* Solo alla prima chiamata. */ IF COND((*NOT &FATTO)) THEN(DO) CHGVAR VAR(&FATTO) VALUE('1') /* Se il file non è di tipo source, messaggia e rilascia. */ IF COND((&Y *NE Y)) THEN(DO) CHGVAR VAR(&MSGDTA) VALUE((&FILELIB *CAT &MBR)) SNDPGMMSG MSGID(JEX0054) MSGF(JEXECJS) MSGDTA(&MSGDTA) + MSGTYPE(*DIAG) GOTO CMDLBL(CPF0001) ENDDO /* Se la lunghezza record è maggiore della massima prevista, */ /* messaggia e rilascia. */ IF COND((&LENGTH *GT 144)) THEN(DO) CHGVAR VAR(&MSGDTA) VALUE((&FILELIB *CAT &MBR)) SNDPGMMSG MSGID(JEX0055) MSGF(JEXECJS) MSGDTA(&MSGDTA) + MSGTYPE(*DIAG) GOTO CMDLBL(CPF0001) ENDDO /* Segnala inizio esecuzione. */ SNDPGMMSG MSG('/* Inizio Execute Job Stream */') + TOPGMQ(*EXT) MSGTYPE(*RQS) /* Solo alla prima chiamata. */ ENDDO IF COND(&LR) THEN(GOTO CMDLBL(LOOPEND)) SNDPGMMSG MSG(&RECORD) TOPGMQ(*EXT) MSGTYPE(*RQS) GOTO CMDLBL(LOOP) LOOPEND: /* Se è in corso un lavoro interattivo. */ IF COND((&TYPE *EQ '1')) THEN(DO) /* Se richiesto ritorno dell'esecutore. */ IF COND(&RETURN *EQ *YES) THEN(DO) /* Accoda richiesta di ritorno. */ SNDPGMMSG MSG(RETURN) TOPGMQ(*EXT) MSGTYPE(*RQS) /* Accoda messaggio di invito a visualizzare joblog. */ SNDPGMMSG MSG('Visualizza la joblog per valutare + l''esito dell''esecuzione.') /* Se richiesto ritorno dell'esecutore. */ ENDDO /* Se non richiesto ritorno dell'esecutore. */ ELSE CMD(DO) /* Accoda messaggio di invito a ritornare. */ SNDPGMMSG MSG('/* Ritorna con F12 o F3 */') + TOPGMQ(*EXT) MSGTYPE(*RQS) /* Se non richiesto ritorno dell'esecutore. */ ENDDO /* Si trasferisce all'esecutore. */ TFRCTL PGM(&EXCPGM) /* Se è in corso un lavoro interattivo. */ ENDDO /* Ritorna al chiamante. */ RETURN /* In caso d'errore che lo prevede, rilascia il CPF0001. */ CPF0001: RCLRSC SNDPGMMSG MSGID(CPF0001) MSGF(QCPFMSG) MSGDTA(JEXECJS) + MSGTYPE(*ESCAPE) RETURN /* In caso d'errore, restituisce i messaggi al chiamante. */ ERRORE: JRSNMSG GOTO CMDLBL(CPF0001) ENDPGM //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JEXECJS2) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /**/ CRTDTAARA DTAARA(PROVA2/PROVA1) TYPE(*CHAR) + /**/ VALUE('Prova3') TEXT('Prova 4') /**JEXECJSEND*/ /TITLE Execute job stream. Legge record da membro source. * Claudio Neroni 24/03/1982 Creato. * * Legge un record per volta da un membro source. * Restituisce se il file è di tipo source. * Restituisce la lunghezza del primo record letto. * A fine file restituisce l'indicatore di last record. * * Claudio Neroni 13/06/1996 Modificato * Inserita la possibilità di terminare la lettura * prima della fine del membro tramite un comando * da inserire nel source (JEXECJSEND) in qualsiasi * posizione lungo la riga sulla quale deve avvenire * l'abbandono. * La modifica permette di inserire comandi CL in testa * ad un sorgente di altro genere e di abbandonare * l'esecuzione, compiuta con JEXECJS, dove più comoda. * Tutti i comandi CL avranno l'identificatore * di commento del seu ospite (al posto previsto dall'ospite) * racchiuso dai limitatori di commento CL. * Ad esempio, per questo RPG, si vedano le 3 righe * inserite in testa al membro e seguite dal * resto del sorgente così come è. * FJEXECJS IF F 144 6AI 1 DISK F KINFDS FIDS IJEXECJS NO I 13 144 RECORD IFIDS DS I 163 163 FIDSSO I B 283 2860FIDSLE I 'JEXECJSEND' C END C *ENTRY PLIST C PARM RECORD C PARM SOURCE C PARM LENGTH C PARM *INLR LR 1 C *LIKE DEFN FIDSSO SOURCE C *LIKE DEFN FIDSLE LENGTH C READ JEXECJS LR C NLR END SCAN RECORD LR C N51 DO C MOVE FIDSSO SOURCE C Z-ADDFIDSLE LENGTH C SETON 51 C END C RETRN //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(TEST1) FILETYPE(*SRC) ENDCHAR('//ENDSRC') DLYJOB DLY(3) DSPMSGD RANGE(CPE3101) DSPMSG START(*FIRST) WRKACTJOB DLYJOB DLY(4) //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(TEST2) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /*****/ DSPMSGD RANGE(CPE3101) DSPMSG START(*FIRST) JEXECJS SRCFILE(NERONI2/JEXECJS) SRCMBR(TEST1) DLYJOB DLY(5) //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(TEST3) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Esempio di CL in testa ad RPGLE per scopi di compilazione. */ /* Digitare queste specifiche con il controllo SEU CL */ /* ma poi assicurarsi che la colonna 6 sia sempre "*". */ /**/DLTPGM PGM(NERONI2/TEST3) /**/CRTBNDRPG PGM(NERONI2/TEST3) SRCFILE(NERONI2/JEXECJS) /**/SNDMSG MSG(TEST3) TOUSR(UFNERONI) /* La specifica seguente interrompe l'esecuzione del comando */ /* JEXECJS specificando la parola qui compresa */ /* tra gli asterischi in un punto qualunque della specifica. */ /*JEXECJSEND*/ /* Digitare le specifiche successive con il controllo SEU RPGLE. */ H DECEDIT('0,') DATEDIT(*DMY.) H Option(*showcpy : *expdds : *srcstmt : *nodebugio) H Debug(*YES) H FixNbr(*Zoned : *InputPacked) H Dftactgrp(*no) actgrp(*CALLER) CN01 D psds sds CN01 D psdsusr 358 367 CN01 D psdspgm *proc D PSDSUSRxx 254 263 D PSDSPGMxx 334 343 CN01 D sysdat s d CN01 D systim s t out D varp s 10 out D varu s 10 out D vard s 8 0 out D varh s 6 0 D date8 s 8 0 D date6 s 6 0 C move *date date8 C move udate date6 CN01 C eval varp=psdspgm CN01 C eval varu=psdsusr CN01 C eval sysdat=%date() CN01 C move sysdat vard CN01 C eval systim=%time() CN01 C move systim varh C seton lr //ENDSRC //ENDBCHJOB