//BCHJOB JOB(JWAJ) 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: 2019-11-18 12:47 */ /* To File : "JWAJ" */ /* To Library : "NERONI2" */ /* To Text : "Work active jobs outfile. 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 "JWAJ.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:\JWAJ.txt" "/qsys.lib/NERONI2.lib/stringhe.file/JWAJ.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(JWAJ) 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/JWAJ" */ /* FACENDO ATTENZIONE ALL'ORDINE DI ESECUZIONE INDICATO NEL */ /* MEMBRO FACOLTATIVO "A.LEGGIMI", AD ESEMPIO: */ /* SBMDBJOB FILE(NERONI2/JWAJ) MBR(JWAJ.) 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/JWAJ) CRTSRCPF FILE(NERONI2/JWAJ) RCDLEN(112) + TEXT('Work active jobs outfile. Src') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JWAJ) TOFILE(NERONI2/JWAJ) + TOMBR(JWAJ) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JWAJ) MBR(JWAJ) + SRCTYPE(CMD) + TEXT('Work active jobs outfile. Cmd') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JWAJ.) TOFILE(NERONI2/JWAJ) + TOMBR(JWAJ.) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JWAJ) MBR(JWAJ.) + SRCTYPE(CL) + TEXT('Work active jobs outfile. CrtJs') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JWAJC) TOFILE(NERONI2/JWAJ) + TOMBR(JWAJC) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JWAJ) MBR(JWAJC) + SRCTYPE(CLLE) + TEXT('Work active jobs outfile. Cpp') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JWAJD) TOFILE(NERONI2/JWAJ) + TOMBR(JWAJD) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JWAJ) MBR(JWAJD) + SRCTYPE(RPGLE) + TEXT('Work active jobs outfile. Exe') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JWAJP) TOFILE(NERONI2/JWAJ) + TOMBR(JWAJP) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JWAJ) MBR(JWAJP) + SRCTYPE(PNLGRP) + TEXT('Work active jobs outfile. Help') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JWAJQ) TOFILE(NERONI2/JWAJ) + TOMBR(JWAJQ) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JWAJ) MBR(JWAJQ) + SRCTYPE(CMD) + TEXT('Work active jobs query. Cmd') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JWAJQC) TOFILE(NERONI2/JWAJ) + TOMBR(JWAJQC) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JWAJ) MBR(JWAJQC) + SRCTYPE(CLLE) + TEXT('Work active jobs query. Cpp') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JWAJQCT1) TOFILE(NERONI2/JWAJ) + TOMBR(JWAJQCT1) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JWAJ) MBR(JWAJQCT1) + SRCTYPE(RPGLE) + TEXT('Work active jobs query. RpgTest1') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JWAJQCT2) TOFILE(NERONI2/JWAJ) + TOMBR(JWAJQCT2) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JWAJ) MBR(JWAJQCT2) + SRCTYPE(RPGLE) + TEXT('Work active jobs query. RpgTest2') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JWAJQI) TOFILE(NERONI2/JWAJ) + TOMBR(JWAJQI) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JWAJ) MBR(JWAJQI) + SRCTYPE(CMD) + TEXT('Work active jobs query. CmdInter') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JWAJQP) TOFILE(NERONI2/JWAJ) + TOMBR(JWAJQP) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JWAJ) MBR(JWAJQP) + SRCTYPE(PNLGRP) + TEXT('Work active jobs query. Help') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JWAJQT1) TOFILE(NERONI2/JWAJ) + TOMBR(JWAJQT1) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JWAJ) MBR(JWAJQT1) + SRCTYPE(CLLE) + TEXT('Work active jobs query. Test1') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JWAJQT2) TOFILE(NERONI2/JWAJ) + TOMBR(JWAJQT2) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JWAJ) MBR(JWAJQT2) + SRCTYPE(CLLE) + TEXT('Work active jobs query. Test2') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JWAJ1) TOFILE(NERONI2/JWAJ) + TOMBR(JWAJ1) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JWAJ) MBR(JWAJ1) + SRCTYPE(PF) + TEXT('Work active jobs outfile. OutFile') /*----------------------------------------------------------------------------*/ /* Member: JWAJ Sys:S65D69DA Lib:NERONI2 Tim:2019-11-18 12:47 */ //DATA FILE(JWAJ) FILETYPE(*SRC) ENDCHAR('//STPSRC') /* Claudio Neroni 18-02-2009 Creato. */ /* JWAJ */ /* Work active jobs outfile. Cmd */ /* Elenca lavori attivi. Cmd */ /* */ CMD PROMPT('Work active jobs outfile') PARM KWD(TYPE) TYPE(*CHAR) LEN(1) RSTD(*YES) + DFT(*) VALUES(* A B I M R S W X) + PROMPT('Job type') PARM KWD(JOBNAM) TYPE(*GENERIC) LEN(10) DFT(*ALL) + SPCVAL((*ALL)) PROMPT('Job name') PARM KWD(JOBUSR) TYPE(*GENERIC) LEN(10) DFT(*ALL) + SPCVAL((*ALL)) PROMPT('Job user') PARM KWD(CURUSR) TYPE(*GENERIC) LEN(10) DFT(*ALL) + SPCVAL((*ALL)) PROMPT('Current user') PARM KWD(OUTFILE) TYPE(OUTFILE) PROMPT('Output + file') OUTFILE: QUAL TYPE(*NAME) DFT(JWAJT) QUAL TYPE(*NAME) DFT(QTEMP) MIN(0) PROMPT('in + library') PARM KWD(REFPGM) TYPE(*NAME) LEN(10) DFT(*CPP) + SPCVAL((*CPP)) EXPR(*YES) + PROMPT('Reference program for messages') //STPSRC /*----------------------------------------------------------------------------*/ /* Member: JWAJ. Sys:S65D69DA Lib:NERONI2 Tim:2019-11-18 12:47 */ //DATA FILE(JWAJ.) FILETYPE(*SRC) ENDCHAR('//STPSRC') //BCHJOB JOB(JWAJ.) JOBD(NERONI2/NERONI2) OUTQ(QPRINTS) ENDSEV(60) + LOG(4 00 *SECLVL) MSGQ(*USRPRF) CCSID(280) /* Claudio Neroni 18-02-2009 Creato. */ /* JWAJ */ /* Work active jobs outfile. CrtJs */ /* Elenca lavori attivi. CrtJs */ /* Prerequisiti: JRSNMSG, JCPYCLR */ /* */ /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP QGPL) ADDLIBLE LIB(NERONI2) POSITION(*AFTER QTEMP) /* Cancella il file messaggi preesistente. */ DLTMSGF MSGF(NERONI2/JWAJ) /* Cancella i testi d'aiuto preesistenti. */ DLTPNLGRP PNLGRP(NERONI2/JWAJP) DLTPNLGRP PNLGRP(NERONI2/JWAJQP) /* Cancella i logici preesistenti. */ /* Cancella i fisici preesistenti. */ DLTF FILE(NERONI2/JWAJ1) /* Cancella i comandi preesistenti da NERONI2. */ DLTCMD CMD(NERONI2/JWAJ) DLTCMD CMD(NERONI2/JWAJQ) DLTCMD CMD(NERONI2/JWAJQI) /* Cancella i comandi preesistenti da QGPL. */ DLTCMD CMD(QGPL/JWAJ) DLTCMD CMD(QGPL/JWAJQ) DLTCMD CMD(QGPL/JWAJQI) /* Cancella i programmi preesistenti. */ DLTPGM PGM(NERONI2/JWAJC) DLTPGM PGM(NERONI2/JWAJD) DLTPGM PGM(NERONI2/JWAJQC) DLTPGM PGM(NERONI2/JWAJQT1) DLTPGM PGM(NERONI2/JWAJQT2) DLTPGM PGM(NERONI2/JWAJQCT1) DLTPGM PGM(NERONI2/JWAJQCT2) /* Crea i file fisici. */ CRTPF FILE(NERONI2/JWAJ1) SRCFILE(JWAJ) SIZE(*NOMAX) /* Crea e riempie test file. */ /* Crea i file logici. */ /* Crea i comandi. */ CRTCMD CMD(NERONI2/JWAJ) PGM(NERONI2/JWAJC) SRCFILE(JWAJ) + HLPPNLGRP(JWAJP) HLPID(JWAJ) PRDLIB(NERONI2) CRTCMD CMD(NERONI2/JWAJQ) PGM(NERONI2/JWAJQC) SRCFILE(JWAJ) + ALLOW(*BPGM *IPGM) HLPPNLGRP(JWAJQP) HLPID(JWAJQ) + PRDLIB(NERONI2) CRTCMD CMD(NERONI2/JWAJQI) PGM(NERONI2/JWAJQC) SRCFILE(JWAJ) + ALLOW(*ALL) HLPPNLGRP(JWAJQP) HLPID(JWAJQ) + PRDLIB(NERONI2) /* Duplica i comandi in QGPL. */ CRTPRXCMD CMD(QGPL/JWAJ) TGTCMD(NERONI2/JWAJ) CRTPRXCMD CMD(QGPL/JWAJQ) TGTCMD(NERONI2/JWAJQ) CRTPRXCMD CMD(QGPL/JWAJQI) TGTCMD(NERONI2/JWAJQI) /* Crea i programmi. */ CRTBNDCL PGM(NERONI2/JWAJC) SRCFILE(JWAJ) TGTRLS(*CURRENT) + DBGVIEW(*ALL) CRTBNDCL PGM(NERONI2/JWAJQC) SRCFILE(JWAJ) TGTRLS(*CURRENT) + DBGVIEW(*ALL) CRTBNDRPG PGM(NERONI2/JWAJD) SRCFILE(JWAJ) DBGVIEW(*ALL) + TGTRLS(*CURRENT) CRTBNDCL PGM(NERONI2/JWAJQT1) SRCFILE(JWAJ) TGTRLS(*CURRENT) + DBGVIEW(*ALL) CRTBNDCL PGM(NERONI2/JWAJQT2) SRCFILE(JWAJ) TGTRLS(*CURRENT) + DBGVIEW(*ALL) CRTBNDRPG PGM(NERONI2/JWAJQCT1) SRCFILE(JWAJ) DBGVIEW(*ALL) + TGTRLS(*CURRENT) CRTBNDRPG PGM(NERONI2/JWAJQCT2) SRCFILE(JWAJ) DBGVIEW(*ALL) + TGTRLS(*CURRENT) /* Crea il file messaggi. */ CRTMSGF MSGF(NERONI2/JWAJ) TEXT('Work active jobs outfile. Msgf') /* Fotografia comandi (xxxA001). */ /* Testi personabilizzabili. (xxxB001). */ /* Messaggi comuni a pgm di comandi diversi (xxx0001). */ ADDMSGD MSGID(JWA0091) MSGF(NERONI2/JWAJ) MSG('La variabile + ACTIVE contiene "&1"') FMT((*CHAR 4)) /* Messaggi nei pgm del Cmd 1 (xxx0101). */ ADDMSGD MSGID(JWA0191) MSGF(NERONI2/JWAJ) MSG('Creato in &1/&2 + l''elenco dei lavori attivi di tipo "&3"') FMT((*CHAR + 10) (*CHAR 10) (*CHAR 1)) /* Messaggi nei pgm del Cmd 2 (xxx0201). */ ADDMSGD MSGID(JWA0291) MSGF(NERONI2/Jwaj) MSG('Il lavoro &1 + dell''utente &2 e'' ATTIVO') FMT((*CHAR 10) (*CHAR 10)) ADDMSGD MSGID(JWA0292) MSGF(NERONI2/JWAJ) MSG('Il lavoro &1 + dell''utente &2 NON e'' attivo') FMT((*CHAR 10) (*CHAR + 10)) /* Messaggi dei Cmd (xxx1001). */ /* Crea i testi d'aiuto. */ CRTPNLGRP PNLGRP(NERONI2/JWAJP) SRCFILE(JWAJ) CRTPNLGRP PNLGRP(NERONI2/JWAJQP) SRCFILE(JWAJ) /* Salva i sorgenti del tool. */ JWEBSAV //ENDBCHJOB //STPSRC /*----------------------------------------------------------------------------*/ /* Member: JWAJC Sys:S65D69DA Lib:NERONI2 Tim:2019-11-18 12:47 */ //DATA FILE(JWAJC) FILETYPE(*SRC) ENDCHAR('//STPSRC') /* Claudio Neroni 18-02-2009 Creato. */ /* JWAJC */ /* Work active jobs outfile. Cpp */ /* Elenca lavori attivi. Cpp */ /* */ PGM PARM(&TYPE &JOBNAM &JOBUSR &CURUSR &OUTFILE + &REFPGM) /* Riceve Tipo lavoro. */ DCL VAR(&TYPE) TYPE(*CHAR) LEN(1) /* Riceve Nome job generico. */ DCL VAR(&JOBNAM) TYPE(*CHAR) LEN(10) /* Riceve Nome utente generico. */ DCL VAR(&JOBUSR) TYPE(*CHAR) LEN(10) /* Riceve Nome utente corrente generico. */ DCL VAR(&CURUSR) TYPE(*CHAR) LEN(10) /* Riceve Nome qualificato del file di emissione. */ DCL VAR(&OUTFILE) TYPE(*CHAR) LEN(20) DCL VAR(&OUTFILEN) TYPE(*CHAR) LEN(10) DCL VAR(&OUTFILEL) TYPE(*CHAR) LEN(10) /* Riceve Programma di riferimento per i messaggi. */ DCL VAR(&REFPGM) TYPE(*CHAR) LEN(10) DCL VAR(&REFPGM2) TYPE(*CHAR) LEN(10) /* Prenotazione del CPF0001. */ DCL VAR(&CPF0001) TYPE(*LGL) /* Intercetta gli errori. */ MONMSG MSGID(CPF0000 MCH0000 CEE0000) EXEC(GOTO + CMDLBL(ERRORE)) /* Se ricevuto programma di riferimento messaggi, lo usa. */ /* Altrimenti assume il default. */ IF COND(%ADDR(&REFPGM) *NE *NULL) THEN(CHGVAR + VAR(&REFPGM2) VALUE(&REFPGM)) ELSE CMD(CHGVAR VAR(&REFPGM2) VALUE(*CPP)) /* Se richiesto *CPP (Command Processing Program) come programma */ /* di riferimento dei messaggi, assume il nome del programma corrente. */ IF COND(&REFPGM2 *EQ *CPP) THEN(DO) JCALLER CALLER(&REFPGM2) KINSHIP(*FATHER) ENDDO /* Estrae parametri. */ CHGVAR VAR(&OUTFILEN) VALUE(%SST(&OUTFILE 1 10)) CHGVAR VAR(&OUTFILEL) VALUE(%SST(&OUTFILE 11 10)) /* Crea il file di emissione. */ JCPYCLR FROMFILE(JWAJ1) TOFILE(&OUTFILEL/&OUTFILEN) /* Ridirige la scrittura sul file di emissione. */ OVRDBF FILE(JWAJ1) TOFILE(&OUTFILEL/&OUTFILEN) /* Chiama il riempimento del file di emissione. */ CALL PGM(JWAJD) PARM(&TYPE &JOBNAM &JOBUSR &CURUSR) /* Messaggia per esito felice. */ SNDPGMMSG MSGID(JWA0191) MSGF(JWAJ) MSGDTA(&OUTFILEL + *CAT &OUTFILEN *CAT &TYPE) TOPGMQ(*PRV + (&REFPGM2)) /* Prepara la chiamata di un query per esplorare il risultato. */ JRQT CMD(RUNQRY QRYFILE((&OUTFILEL/&OUTFILEN)) + RCDSLT(*YES)) REFPGM(&REFPGM2) MONMSG MSGID(CPF0000 MCH0000) /* Salta all'esecuzione delle attivitā finali. */ GOTO CMDLBL(RCLRSC) /* Label di esecuzione delle attivitā finali. */ RCLRSC: /* Riacquisisce le risorse. */ RCLRSC MONMSG MSGID(CPF0000 MCH0000) /* Se richiesto, rilascia il CPF0001. */ IF COND(&CPF0001) THEN(DO) SNDPGMMSG MSGID(CPF0001) MSGF(QCPFMSG) MSGDTA(JWAJ) + MSGTYPE(*ESCAPE) MONMSG MSGID(CPF0000 MCH0000) ENDDO /* Ritorna. */ RETURN /* Label di errore. */ ERRORE: /* Restituisce i messaggi al chiamante, */ /* trasformando eventuali escape in diagnostici. */ JRSNMSG RMV(*NO) MONMSG MSGID(CPF0000 MCH0000) /* Label di prenotazione del CPF0001. */ CPF0001: /* Prenota il CPF0001. */ CHGVAR VAR(&CPF0001) VALUE('1') MONMSG MSGID(CPF0000 MCH0000) /* Salta alle attivitā finali. */ GOTO CMDLBL(RCLRSC) ENDPGM //STPSRC /*----------------------------------------------------------------------------*/ /* Member: JWAJD Sys:S65D69DA Lib:NERONI2 Tim:2019-11-18 12:47 */ //DATA FILE(JWAJD) FILETYPE(*SRC) ENDCHAR('//STPSRC') * Claudio Neroni 18-02-2009 Creato. * JWAJD * Work active jobs outfile. Exe * Elenca lavori attivi. Exe * *--------------------------------------------------------------------------------------------- H dftactgrp(*no) *--------------------------------------------------------------------------------------------- * Output file. Fjwaj1 o e disk *--------------------------------------------------------------------------------------------- * API error data structure D ERRC0100 Ds Qualified D BytPrv 10i 0 Inz( %Size( ERRC0100 )) D BytAvl 10i 0 D MsgId 7 D null1 1 D MsgDta 128 * Global constants D NUM_ZON c 2 D CHAR_NLS c 4 D SORT_ASC c '1' * Global variables D KeyDtaVal s 32 D Idx s 10i 0 * List API parameters D LstApi Ds Qualified Inz D RtnRcdNbr 10i 0 Inz( 1 ) D NbrFldRtn 10i 0 Inz( %Elem( LstApi.KeyFld )) D KeyFld 10i 0 Dim( 10 ) * Job information D OLJB0200 Ds 512 Qualified D JobId 26 D JobNam 10 Overlay( JobId: 1 ) D UsrPrf 10 Overlay( JobId: 11 ) D JobNbr 6 Overlay( JobId: 21 ) D JobIdInt 16 D Status 10 D JobTyp 1 D JobSub 1 D null1 2 D JobInfSts 1 D null2 3 D Data 128 * Job information key fields D KeyDta Ds Qualified D JobQue_q 20 D JobPty 1 D SbsNam_q 20 D ActJobSts 4 D CurUsr 10 D JobEntDts 13 D JobEntDat 7 Overlay( JobEntDts: 1 ) D JobEntTim 6 Overlay( JobEntDts: 8 ) D JobTypE 10i 0 D RunPty 10i 0 D JobQueSts 10 D SbmJob_q 26 D SbmJobNam 10 Overlay( SbmJob_q: 1 ) D SbmJobUsr 10 Overlay( SbmJob_q: 11 ) D SbmJobNbr 6 Overlay( SbmJob_q: 21 ) * Key information D KeyInf Ds Qualified D FldNbrRtn 10i 0 D KeyStr 20 Dim( %Elem( LstApi.KeyFld )) D FldInfLen 10i 0 Overlay( KeyStr: 1 ) D KeyFld 10i 0 Overlay( KeyStr: 5 ) D DtaTyp 1 Overlay( KeyStr: 9 ) D null1 3 Overlay( KeyStr: 10 ) D DtaLen 10i 0 Overlay( KeyStr: 13 ) D DtaOfs 10i 0 Overlay( KeyStr: 17 ) * Sort information D SrtInf Ds Qualified D NbrKeys 10i 0 Inz( 0 ) D SrtStr 12 Dim( 4 ) D KeyFldOfs 10i 0 Overlay( SrtStr: 1 ) D KeyFldLen 10i 0 Overlay( SrtStr: 5 ) D KeyFldTyp 5i 0 Overlay( SrtStr: 9 ) D SrtOrd 1 Overlay( SrtStr: 11 ) D Rsv 1 Overlay( SrtStr: 12 ) * List information D LstInf Ds Qualified D RcdNbrTot 10i 0 D RcdNbrRtn 10i 0 D Handle 4 D RcdLen 10i 0 D InfSts 1 D Dts 13 D LstSts 1 D null1 1 D InfLen 10i 0 D Rcd1 10i 0 D null2 40 * Selection information D OLJS0200 Ds Qualified D JobNam 10 Inz( '*ALL' ) D UsrPrf 10 Inz( '*ALL' ) D JobNbr 6 Inz( '*ALL' ) D JobTyp 1 D null1 1 D OfsPriSts 10i 0 Inz( 108 ) D NbrPriSts 10i 0 Inz( 2 ) D OfsActSts 10i 0 Inz( 128 ) D NbrActSts 10i 0 Inz( 0 ) D OfsJbqSts 10i 0 Inz( 136 ) D NbrJbqSts 10i 0 Inz( 0 ) D OfsJbqNam 10i 0 Inz( 146 ) D NbrJbqNam 10i 0 Inz( 1 ) D OfsCurUsr 10i 0 Inz( 166 ) D NbrCurUsr 10i 0 Inz( 0 ) D OfsSvrTyp 10i 0 Inz( 176 ) D NbrSvrTyp 10i 0 Inz( 0 ) D OfsActSbs 10i 0 Inz( 206 ) D NbrActSbs 10i 0 Inz( 0 ) D OfsMemPool 10i 0 Inz( 216 ) D NbrMemPool 10i 0 Inz( 0 ) D OfsJobTypE 10i 0 Inz( 220 ) D NbrJobTypE 10i 0 Inz( 0 ) D OfsJobNamQ 10i 0 Inz( 228 ) D NbrJobNamQ 10i 0 Inz( 0 ) * D PriSts 10 Dim( 2 ) D ActSts 4 Dim( 2 ) D JbqSts 10 Dim( 1 ) D JbqNam 20 Dim( 1 ) D CurUsr 10 Dim( 1 ) D SvrTyp 30 Dim( 1 ) D ActSbs 10 Dim( 1 ) D MemPool 10i 0 Dim( 1 ) D JobTypE 10i 0 Dim( 1 ) D JobNamQ 26 Dim( 1 ) * Open list of jobs D LstJobs Pr ExtPgm( 'QGYOLJOB' ) D RcvVar 65535 Options( *VarSize ) D RcvVarLen 10i 0 Const D FmtNam 8 Const D RcvVarDfn 65535 Options( *VarSize ) D RcvDfnLen 10i 0 Const D LstInf 80 D NbrRcdRtn 10i 0 Const D SrtInf 1024 Const Options( *VarSize ) D JobSltInf 1024 Const Options( *VarSize ) D JobSltLen 10i 0 Const D NbrFldRtn 10i 0 Const D KeyFldRtn 10i 0 Const Options( *VarSize ) Dim( 32 ) D Error 1024 Options( *VarSize ) D JobSltFmt 8 Const Options( *NoPass ) D ResStc 1 Const Options( *NoPass ) D GenRtnDta 32 Options( *NoPass: *VarSize ) D GenRtnDtaLn 10i 0 Const Options( *NoPass ) * Get open list entry D GetOplEnt Pr ExtPgm( 'QGYGTLE' ) D RcvVar 65535 Options( *VarSize ) D RcvVarLen 10i 0 Const D Handle 4 Const D LstInf 80 D NbrRcdRtn 10i 0 Const D RtnRcdNbr 10i 0 Const D Error 1024 Options( *VarSize ) * Close list D CloseLst Pr ExtPgm( 'QGYCLST' ) D Handle 4 Const D Error 1024 Options( *VarSize ) * Copy memory D memcpy Pr * ExtProc( '_MEMMOVE' ) D MemOut * Value D MemInp * Value D MemSiz 10u 0 Value *--------------------------------------------------------------------------------------------- D OKCUR s n D II s 3 0 D CNT s like(WAJSEQ) *--------------------------------------------------------------------------------------------- * Scambia parametri. C *entry plist * Job Type. C parm pptyp 1 * Job Name. C parm ppnam 10 * Job User. C parm ppusr 10 * Current User. C parm PPCUR 10 *--------------------------------------------------------------------------------------------- /Free eval OLJS0200.JobTyp = pptyp; eval OLJS0200.JobNam = ppnam; eval OLJS0200.UsrPrf = ppusr; ExSr BldJobLst; *InLr = *On; Return; //------------------------------------------------------------------------------------------- BegSr BldJobLst; ExSr InzApiPrm; LstApi.RtnRcdNbr = 1; LstJobs( OLJB0200 : %Size( OLJB0200 ) : 'OLJB0200' : KeyInf : %Size( KeyInf ) : LstInf : -1 : SrtInf : OLJS0200 : %Size( OLJS0200 ) : LstApi.NbrFldRtn : LstApi.KeyFld : ERRC0100 : 'OLJS0200' ); If ERRC0100.BytAvl = *Zero And LstInf.RcdNbrTot > *Zero; ExSr PrcLstEnt; DoW LstInf.RcdNbrTot > LstApi.RtnRcdNbr; LstApi.RtnRcdNbr += 1; GetOplEnt( OLJB0200 : %Size( OLJB0200 ) : LstInf.Handle : LstInf : 1 : LstApi.RtnRcdNbr : ERRC0100 ); If ERRC0100.BytAvl > *Zero; Leave; EndIf; ExSr PrcLstEnt; EndDo; EndIf; CloseLst( LstInf.Handle: ERRC0100 ); EndSr; //------------------------------------------------------------------------------------------- BegSr PrcLstEnt; Clear KeyDta; For Idx = 1 To KeyInf.FldNbrRtn; KeyDtaVal = %SubSt( OLJB0200 : KeyInf.DtaOfs(Idx) + 1 : KeyInf.DtaLen(Idx) ); Select; When KeyInf.KeyFld(Idx) = 0101; KeyDta.ActJobSts = KeyDtaVal; When KeyInf.KeyFld(Idx) = 0305; KeyDta.CurUsr = KeyDtaVal; When KeyInf.KeyFld(Idx) = 0402; KeyDta.JobEntDts = KeyDtaVal; When KeyInf.KeyFld(Idx) = 1004; KeyDta.JobQue_q = KeyDtaVal; When KeyInf.KeyFld(Idx) = 1005; KeyDta.JobPty = %subst(KeyDtaVal:2:1); if KeyDta.JobPty = x'00'; KeyDta.JobPty = *blank; endif; When KeyInf.KeyFld(Idx) = 1016; memcpy( %Addr( KeyDta.JobTypE ) : %Addr( KeyDtaVal ) : %Size( KeyDta.JobTypE ) ); When KeyInf.KeyFld(Idx) = 1802; memcpy( %Addr( KeyDta.RunPty ) : %Addr( KeyDtaVal ) : %Size( KeyDta.RunPty ) ); When KeyInf.KeyFld(Idx) = 1903; KeyDta.JobQueSts = KeyDtaVal; When KeyInf.KeyFld(Idx) = 1904; KeyDta.SbmJob_q = KeyDtaVal; When KeyInf.KeyFld(Idx) = 1906; KeyDta.SbsNam_q = KeyDtaVal; EndSl; EndFor; ExSr PutLstEnt; EndSr; //------------------------------------------------------------------------------------------- BegSr PutLstEnt; WAJSEQ = WAJSEQ + 1; WAJNAM = OLJB0200.JobNam; WAJUSR = OLJB0200.UsrPrf; WAJNUM = OLJB0200.JobNbr; WAJTYP = OLJB0200.JobTyp; WAJSUB = OLJB0200.JobSub; WAJSTA = OLJB0200.Status; Select; When OLJB0200.Status = '*ACTIVE'; WAJAJS = KeyDta.ActJobSts; When OLJB0200.Status = '*JOBQ'; WAJAJS = KeyDta.JobQueSts; Other; WAJAJS = *Blanks; EndSl; WAJJPT = KeyDta.JobPty; /End-Free C z-add KeyDta.RunPty rp 2 0 /Free WAJRPT = %editc(rp:'Z'); WAJEND = KeyDta.JobEntDat; WAJENT = KeyDta.JobEntTim; Select; When OLJB0200.Status = '*ACTIVE'; WAJCUR = KeyDta.CurUsr; When OLJB0200.Status = '*JOBQ'; WAJCUR = OLJB0200.UsrPrf; Other; WAJCUR = OLJB0200.UsrPrf; EndSl; WAJSNA = KeyDta.SbmJobNam; WAJSUS = KeyDta.SbmJobUsr; WAJSNU = KeyDta.SbmJobNbr; OKCUR = *off; // Assume utente corrente da scartare dou 1=1; // Esegue validazione utente corrente if PPCUR = '*ALL'; // Se scelti tutti gli utenti correnti OKCUR = *on; // Annota utente corrente ok leave; // Abbandona endif; // End II = %scan('*':PPCUR); // Cerca asterisco nel nome scelto if II = *zero; // Se asterisco manca if WAJCUR = PPCUR; // Se utente corrente e' quello scelto OKCUR = *on; // Annota utente corrente ok endif; // End leave; // Abbandona endif; // End if II = 1; // Se asterisco e' in prima posizione leave; // Abbandona. endif; // End if %subst(WAJCUR:1:II-1) = // Se inizio utente corrente e' uguale a %subst(PPCUR:1:II-1); // inizio utente cercato OKCUR = *on; // Annota utente corrente ok leave; // Abbandona endif; // End enddo; // End if OKCUR; // Se utente corrente ok if PPCUR <> '*ALL'; // Se NON scelti tutti gli utenti correnti CNT += 1; // Incrementa contatore WAJSEQ = CNT; // Usa contatore come numero di sequenza endif; // End write waj; // Scrive record endif; // End EndSr; //------------------------------------------------------------------------------------------- BegSr InzApiPrm; OLJS0200.PriSts(1) = '*ACTIVE'; OLJS0200.PriSts(2) = '*JOBQ'; OLJS0200.JbqNam(1) = *blank; SrtInf.NbrKeys = 4; SrtInf.KeyFldOfs(1) = 43; SrtInf.KeyFldLen(1) = %Size( OLJB0200.Status ); SrtInf.KeyFldTyp(1) = CHAR_NLS; SrtInf.SrtOrd(1) = SORT_ASC; SrtInf.Rsv(1) = x'00'; SrtInf.KeyFldOfs(2) = 61; SrtInf.KeyFldLen(2) = %Size( KeyDta.JobQue_q ); SrtInf.KeyFldTyp(2) = CHAR_NLS; SrtInf.SrtOrd(2) = SORT_ASC; SrtInf.Rsv(2) = x'00'; SrtInf.KeyFldOfs(3) = 81; SrtInf.KeyFldLen(3) = %Size( KeyDta.JobPty ); SrtInf.KeyFldTyp(3) = CHAR_NLS; SrtInf.SrtOrd(3) = SORT_ASC; SrtInf.Rsv(3) = x'00'; SrtInf.KeyFldOfs(4) = 21; SrtInf.KeyFldLen(4) = %Size( OLJB0200.JobNbr ); SrtInf.KeyFldTyp(4) = NUM_ZON; SrtInf.SrtOrd(4) = SORT_ASC; SrtInf.Rsv(4) = x'00'; LstApi.KeyFld(1) = 1004; LstApi.KeyFld(2) = 1005; LstApi.KeyFld(3) = 0402; LstApi.KeyFld(4) = 1906; LstApi.KeyFld(5) = 0101; LstApi.KeyFld(6) = 0305; LstApi.KeyFld(7) = 1016; LstApi.KeyFld(8) = 1802; LstApi.KeyFld(9) = 1903; LstApi.KeyFld(10) = 1904; EndSr; //------------------------------------------------------------------------------------------- /End-Free //STPSRC /*----------------------------------------------------------------------------*/ /* Member: JWAJP Sys:S65D69DA Lib:NERONI2 Tim:2019-11-18 12:47 */ //DATA FILE(JWAJP) FILETYPE(*SRC) ENDCHAR('//STPSRC') :PNLGRP. :IMPORT NAME='*' PNLGRP=JPNL. .*------------------------------------------------------------------------------ :HELP NAME=JWAJ. .*------------------ :H2.Cmd JWAJ Work active jobs outfile > Elenca lavori attivi :P.https://www.neroni.it/NERONI2/JWAJ.NERONI2.HTML :P.Scarica in un file di emissione l'elenco dei lavori attivi completo o scegliendo per tipo, nome, utente lavoro e utente corrente. :P.L'elenco lavori ottenuto senza fare uso dei quattro parametri di parzializzazione ha una corrispondenza riga per riga con l'elenco video ottenibile dalla contemporanea esecuzione del comando :HP2.WRKACTJOB:EHP2. "Work with active jobs", dopo la scelta F14=Include. :P.L'elenco lavori ottenuto facendo uso dei parametri di parzializzazione li soddisfa invece tutti in relazione "and". :P.Il reperimento dell'elenco avviene tramite le API di sistema a cio' delegate. In particolare la :HP2.QGYOLJOB:EHP2. "Open List of Jobs". :P.Il programma di interfaccia verso l'API e' stato ricavato da materiale di Carsten Flensburg recuperato al link :PC.https://apimymymy.wordpress.com :PC.Una successiva verifica (16-11-2019) del link non ha permesso di ritrovare tale materiale ma solo info similari. .*------------------ :EHELP. .*------------------------------------------------------------------------------ :HELP name='JWAJ/TYPE'. :H2.Job type (TYPE) > Tipo lavoro :P.Tipo dei lavori attivi da elencare. :P.:HP3.Valori permessi::EHP3. :PARML. :PT.:PK DEF.*:EPK. :PD.Saranno elencati tutti i tipi di lavoro. :PT.A :PD.Saranno elencati solo i lavori di autostart. :PT.B :PD.Saranno elencati solo i lavori batch. :PT.I :PD.Saranno elencati solo i lavori interattivi. :PT.M :PD.Saranno elencati solo i lavori monitor di sottosistema. :PT.R :PD.Saranno elencati solo i lavori di spool di lettura. :PT.S :PD.Saranno elencati solo i lavori di sistema. :PT.W :PD.Saranno elencati solo i lavori di spool di scrittura. :PT.X :PD.Saranno elencati solo i lavori di sistema SCPF. :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP name='JWAJ/JOBNAM'. :H2.Job name (JOBNAM) > Nome lavoro :P.Nome dei lavori attivi da elencare. :P.:HP3.Valori permessi::EHP3. :PARML. :PT.nome-lavoro :PD.Solo i lavori col nome richiesto e che soddisfano le altre scelte saranno elencati. :PT.nome-lavoro-generico :PD.Solo i lavori col nome generico richiesto e che soddisfano le altre scelte saranno elencati. :EPARML. :P.:HP3.Valori speciali::EHP3. :PARML. :PT.:PK DEF.*ALL:EPK. :PD.Tutti i lavori che soddisfano le altre scelte saranno elencati a prescindere dal nome lavoro. :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP name='JWAJ/JOBUSR'. :H2.Job user (JOBUSR) > Utente lavoro :P.Nome utente lavoro dei lavori attivi da elencare. :P.:HP3.Valori permessi::EHP3. :PARML. :PT.nome-utente :PD.Solo i lavori con l'utente lavoro richiesto e che soddisfano le altre scelte saranno elencati. :PT.nome-utente-generico :PD.Solo i lavori con l'utente lavoro generico richiesto e che soddisfano le altre scelte saranno elencati. :EPARML. :P.:HP3.Valori speciali::EHP3. :PARML. :PT.:PK DEF.*ALL:EPK. :PD.Tutti i lavori che soddisfano le altre scelte saranno elencati a prescindere dal nome utente lavoro. :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP name='JWAJ/CURUSR'. :H2.Current user (CURUSR) > Utente corrente :P.Nome utente corrente dei lavori attivi da elencare. :P.:HP3.Valori permessi::EHP3. :PARML. :PT.nome-utente :PD.Solo i lavori con l'utente corrente richiesto e che soddisfano le altre scelte saranno elencati. :PT.nome-utente-generico :PD.Solo i lavori con l'utente corrente generico richiesto e che soddisfano le altre scelte saranno elencati. :EPARML. :P.:HP3.Valori speciali::EHP3. :PARML. :PT.:PK DEF.*ALL:EPK. :PD.Tutti i lavori che soddisfano le altre scelte saranno elencati a prescindere dal nome utente corrente. :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP name='JWAJ/OUTFILE'. :H2.Output file (OUTFILE) - name > File di emissione - nome :P.Il nome individua il file fisico ricevente dei dati scaricati dal sistema tramite API. :P.Se il file di emissione manca, viene creato. Se esiste viene sostituito. :P.:HP3.Valori permessi::EHP3. :PARML. :PT.nome-file-di-emissione :PD.Nome del file di emissione. :EPARML. :P.:HP3.Valori speciali::EHP3. :PARML. :PT.:PK DEF.JWAJT:EPK. :PD.Nome di default del file di emissione. :EPARML. .*---------- :H2.Output file (OUTFILE) - library > File di emissione - libreria :P.Nome della libreria in cui risiedera' il file di emissione. :P.:HP3.Valori permessi::EHP3. :PARML. :PT.nome-libreria-di-emissione :PD.Il file di emissione verra' creato nella libreria richiesta. :EPARML. :P.:HP3.Valori speciali::EHP3. :PARML. :PT.:PK DEF.QTEMP:EPK. :PD.Nome di default della libreria di emissione. :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP name='JWAJ/refpgm'. :IMHELP NAME='refpgm'. :EHELP. .*------------------------------------------------------------------------------ :HELP NAME='JWAJ/COMMAND/EXAMPLES'. .*---------- :XH2.Esempi d'uso del comando JWAJ Work active jobs outfile :P.:HP3.Esempio 1: Scarica l'elenco di tutti i lavori attivi sul sistema:EHP3. :P.Si chiama il comando senza parametri o con tutti i default e si ottiene il seguente log: :XMP. :HP2. > JWAJ :EHP2. oppure, con tutti i default: :HP2. > JWAJ TYPE(*) JOBNAM(*ALL) JOBUSR(*ALL) CURUSR(*ALL) OUTFILE(QTEMP/JWAJT) REFPGM(*CPP) :EHP2. Creato in QTEMP/JWAJT l'elenco dei lavori attivi di tipo "*" > /**/RUNQRY QRYFILE((QTEMP/JWAJT)) RCDSLT(*YES) :EXMP. :P.Si osservi il messaggio di invito alla visualizzazione del risultato. .*---------- :P.:HP3.Esempio 2: Scarica nel file INTER l'elenco dei lavori attivi e interattivi dell'utente NERONI:EHP3. :P.Si chiama il comando e si ottiene il seguente log. :XMP. :HP2. > JWAJ TYPE(I) JOBUSR(NERONI) OUTFILE(INTER) :EHP2. Creato in QTEMP/INTER l'elenco dei lavori attivi di tipo "I" > /**/RUNQRY QRYFILE((QTEMP/INTER)) RCDSLT(*YES) :EXMP. :P.Si riporta uno stralcio del query che si ottiene eseguendo il messaggio di invito alla visualizzazione del risultato. :XMP. :HP2. List Job Job Job Job Job Job Actv Job sequ name user number typ sub status stat pty :EHP2. 1 N1NERO NERONI 595306 I *ACTIVE DSPW 5 2 N2NERO NERONI 595307 I *ACTIVE RUN 5 :HP2. Run Enter Enter Current Submitter Submitter Submtr pty date time user name user number :EHP2. 20 1170711 100609 NERONI 20 1170711 100726 NERONI :EXMP. .*---------- :EHELP. .*------------------------------------------------------------------------------ :HELP NAME='JWAJ/ERROR/MESSAGES'. .*------------------ :XH2.Messaggi del comando JWAJ Work active jobs outfile .*------------------ :XH2.Messaggi di rilascio nel comando :DL COMPACT. :EDL. .*------------------ :XH2.Messaggi informativi :DL COMPACT. :EDL. .*------------------ :XH2.Messaggi di completamento :DL COMPACT. :DT.JWA0191:DD.&MSG(JWA0191,JWAJ,*LIBL,nosub). :EDL. .*------------------ :XH2.Messaggi di stato :DL COMPACT. :EDL. .*------------------ :XH2.Messaggi diagnostici seguiti da rilascio :DL COMPACT. :EDL. .*------------------ :EHELP. .*------------------------------------------------------------------------------ :EPNLGRP. //STPSRC /*----------------------------------------------------------------------------*/ /* Member: JWAJQ Sys:S65D69DA Lib:NERONI2 Tim:2019-11-18 12:47 */ //DATA FILE(JWAJQ) FILETYPE(*SRC) ENDCHAR('//STPSRC') /* Claudio Neroni 13-03-2015 Creato. */ /* JWAJQ */ /* Work active jobs query. Cmd */ /* Interroga elenco lavori attivi. Cmd */ /* */ CMD PROMPT('Work active jobs query') PARM KWD(JOBNAM) TYPE(*GENERIC) LEN(10) DFT(*ALL) + SPCVAL((*ALL)) PROMPT('Job name') PARM KWD(JOBUSR) TYPE(*GENERIC) LEN(10) DFT(*ALL) + SPCVAL((*ALL)) PROMPT('Job user') PARM KWD(ACTIVE) TYPE(*CHAR) LEN(4) RTNVAL(*YES) + MIN(1) PROMPT('Active + *YES/*NO 4') PARM KWD(REFPGM) TYPE(*NAME) LEN(10) DFT(*CPP) + SPCVAL((*CPP)) EXPR(*YES) + PROMPT('Reference program for messages') //STPSRC /*----------------------------------------------------------------------------*/ /* Member: JWAJQC Sys:S65D69DA Lib:NERONI2 Tim:2019-11-18 12:47 */ //DATA FILE(JWAJQC) FILETYPE(*SRC) ENDCHAR('//STPSRC') /* Claudio Neroni 13-03-2015 Creato. */ /* JWAJQC */ /* Work active jobs query. Cpp */ /* Interroga elenco lavori attivi. Cpp */ /* */ PGM PARM(&JOBNAM &JOBUSR &ACTIVE &REFPGM) /* Riceve Nome job generico. */ DCL VAR(&JOBNAM) TYPE(*CHAR) LEN(10) /* Riceve Nome utente generico. */ DCL VAR(&JOBUSR) TYPE(*CHAR) LEN(10) /* Riceve il Modo richiesto. */ /* Restituisce se Il job č attivo (*YES/*NO). */ DCL VAR(&ACTIVE) TYPE(*CHAR) LEN(4) /* Riceve Programma di riferimento per i messaggi. */ DCL VAR(&REFPGM) TYPE(*CHAR) LEN(10) DCL VAR(&REFPGM2) TYPE(*CHAR) LEN(10) /* Modo richiesto. */ DCL VAR(&MODE) TYPE(*CHAR) LEN(4) /* Messaggio. */ DCL VAR(&MSG) TYPE(*CHAR) LEN(512) /* Numero record nell'elenco dei lavori attivi. */ DCL VAR(&NBRCURRCD) TYPE(*DEC) LEN(10 0) /* Se ricevuto programma di riferimento messaggi, lo usa. */ /* Altrimenti assume il default. */ IF COND(%ADDR(&REFPGM) *NE *NULL) THEN(CHGVAR + VAR(&REFPGM2) VALUE(&REFPGM)) ELSE CMD(CHGVAR VAR(&REFPGM2) VALUE(*CPP)) /* Se richiesto *CPP (Command Processing Program) come programma */ /* di riferimento dei messaggi, assume il nome del programma corrente. */ IF COND(&REFPGM2 *EQ *CPP) THEN(DO) JCALLER CALLER(&REFPGM2) KINSHIP(*FATHER) ENDDO /* Salva il modo richiesto. */ CHGVAR VAR(&MODE) VALUE(&ACTIVE) /* Assume che il job non sia attivo. */ CHGVAR VAR(&ACTIVE) VALUE(*NO) /* Scarica l'elenco dei lavori attivi. */ JWAJ JOBNAM(&JOBNAM) JOBUSR(&JOBUSR) REFPGM(&REFPGM2) /* Recupera il numero di lavori attivi che soddisfano la ricerca. */ RTVMBRD FILE(QTEMP/JWAJT) NBRCURRCD(&NBRCURRCD) /* Se ci sono lavori, annota presenti lavori attivi. */ IF COND(&NBRCURRCD *GT 0) THEN(CHGVAR + VAR(&ACTIVE) VALUE(*YES)) /* Se richiesto, manda un messaggio. */ /* Punta il file messaggi perche' il pgm puo' essere chiamato da QGPL */ /* senza cmd di cappello e quindi senza production library. */ IF COND(&MODE *EQ *MSG) THEN(DO) IF COND(&ACTIVE *EQ *YES) THEN(DO) SNDPGMMSG MSGID(JWA0291) MSGF(NERONI2/JWAJ) + MSGDTA(&JOBNAM *CAT &JOBUSR) TOPGMQ(*PRV + (&REFPGM2)) ENDDO ELSE CMD(DO) SNDPGMMSG MSGID(JWA0292) MSGF(NERONI2/JWAJ) + MSGDTA(&JOBNAM *CAT &JOBUSR) TOPGMQ(*PRV + (&REFPGM2)) ENDDO ENDDO /* Fine. */ ENDPGM: ENDPGM //STPSRC /*----------------------------------------------------------------------------*/ /* Member: JWAJQCT1 Sys:S65D69DA Lib:NERONI2 Tim:2019-11-18 12:47 */ //DATA FILE(JWAJQCT1) FILETYPE(*SRC) ENDCHAR('//STPSRC') * Legge il proprio nome programma. D PSDS sds D PGM 334 343 * Prenota chiusura. C seton lr * Riceve i parametri da passare. C *entry plist C parm JOBUSR C parm JOBNAM JWAJQC* Esempio di chiamata di "Work active jobs query". JWAJQC call 'JWAJQC' Work act jobs query JWAJQC parm JOBUSR 10 I Job user JWAJQC parm JOBNAM 10 I Job name JWAJQC parm ACTIVE 4 I *MSG / O *YES-*NO * Segnala il risultato. C call 'JMSG2' Send info msg C parm 'JWA0091' JMSGI 7 I Msg identification C parm 'JWAJ' JMSGF 10 I Msg file C parm ACTIVE JMSGD 512 I Msg data C parm PGM JMSGR 10 I Reference program //STPSRC /*----------------------------------------------------------------------------*/ /* Member: JWAJQCT2 Sys:S65D69DA Lib:NERONI2 Tim:2019-11-18 12:47 */ //DATA FILE(JWAJQCT2) FILETYPE(*SRC) ENDCHAR('//STPSRC') * Legge il proprio nome programma. D PSDS sds D PGM 334 343 * Prenota chiusura. C seton lr * Riceve i parametri da passare. C *entry plist C parm JOBUSR C parm JOBNAM JWAJQC* Esempio di chiamata di "Work active jobs query". JWAJQC call 'JWAJQC' Work act jobs query JWAJQC parm JOBUSR 10 I Job user JWAJQC parm JOBNAM 10 I Job name JWAJQC parm '*MSG' ACTIVE 4 I *MSG / O *YES-*NO JWAJQC parm PGM REFPGM 10 I Reference program * Segnala il risultato. C call 'JMSG2' Send info msg C parm 'JWA0091' JMSGI 7 I Msg identification C parm 'JWAJ' JMSGF 10 I Msg file C parm ACTIVE JMSGD 512 I Msg data C parm PGM JMSGR 10 I Reference program //STPSRC /*----------------------------------------------------------------------------*/ /* Member: JWAJQI Sys:S65D69DA Lib:NERONI2 Tim:2019-11-18 12:47 */ //DATA FILE(JWAJQI) FILETYPE(*SRC) ENDCHAR('//STPSRC') /* Claudio Neroni 13-03-2015 Creato. */ /* JWAJQ */ /* Work active jobs query. CmdInter */ /* Interroga elenco lavori attivi. CmdInter */ /* */ CMD PROMPT('Work active jobs query inter') PARM KWD(JOBNAM) TYPE(*GENERIC) LEN(10) DFT(*ALL) + SPCVAL((*ALL)) PROMPT('Job name') PARM KWD(JOBUSR) TYPE(*GENERIC) LEN(10) DFT(*ALL) + SPCVAL((*ALL)) PROMPT('Job user') PARM KWD(ACTIVE) TYPE(*CHAR) LEN(4) CONSTANT(*MSG) PARM KWD(REFPGM) TYPE(*CHAR) LEN(10) CONSTANT(*CPP) //STPSRC /*----------------------------------------------------------------------------*/ /* Member: JWAJQP Sys:S65D69DA Lib:NERONI2 Tim:2019-11-18 12:47 */ //DATA FILE(JWAJQP) FILETYPE(*SRC) ENDCHAR('//STPSRC') :PNLGRP. :IMPORT NAME='*' PNLGRP=JPNL. .*------------------------------------------------------------------------------ :HELP NAME=JWAJQ. .*------------------ :H2.Cmd JWAJQ Work active jobs query > Interroga elenco lavori attivi :P.https://www.neroni.it/NERONI2/JWAJQ.NERONI2.HTML :P.:HP2.JWAJQ:EHP2. Restituisce una variabile attivo/non attivo. :H2.Cmd JWAJQI Work active jobs query inter > Interroga elenco lavori attivi interattivo :P.https://www.neroni.it/NERONI2/JWAJQI.NERONI2.HTML :P.:HP2.JWAJQI:EHP2. Restituisce un messaggio informativo attivo/non attivo. :P.Esamina l'elenco lavori attivi cercando nome lavoro e utente lavoro che soddisfano i parametri di ricerca. :P.Il reperimento dell'elenco da esaminare e la sua parzializzazione per nome e utente avvengono tramite il comando :HP2.JWAJ:EHP2. "Work active jobs outfile". :P.La presenza di record nel file di emissione del comando JWAJ parametrizzato permette di dichiarare "lavori attivi", l'assenza "lavori non attivi". .*------------------ :EHELP. .*------------------------------------------------------------------------------ :HELP name='JWAJQ/JOBNAM'. :H2.Job name (JOBNAM) > Nome lavoro :P.Nome dei lavori attivi da valutare. :P.:HP3.Valori permessi::EHP3. :PARML. :PT.nome-lavoro :PD.Solo i lavori col nome richiesto e che soddisfano le altre scelte saranno valutati. :PT.nome-lavoro-generico :PD.Solo i lavori col nome generico richiesto e che soddisfano le altre scelte saranno valutati. :EPARML. :P.:HP3.Valori speciali::EHP3. :PARML. :PT.:PK DEF.*ALL:EPK. :PD.Tutti i lavori che soddisfano le altre scelte saranno valutati a prescindere dal nome lavoro. :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP name='JWAJQ/JOBUSR'. :H2.Job user (JOBUSR) > Utente lavoro :P.Nome utente dei lavori attivi da valutare. :P.:HP3.Valori permessi::EHP3. :PARML. :PT.utente-lavoro :PD.Solo i lavori con l'utente richiesto e che soddisfano le altre scelte saranno valutati. :PT.utente-generico :PD.Solo i lavori con l'utente generico richiesto e che soddisfano le altre scelte saranno valutati. :EPARML. :P.:HP3.Valori speciali::EHP3. :PARML. :PT.:PK DEF.*ALL:EPK. :PD.Tutti i lavori che soddisfano le altre scelte saranno valutati a prescindere dal nome utente. :EPARML. :EHELP. .*------------------------------------------------------------------------------ :HELP name='JWAJQ/ACTIVE'. :H2.Active *YES/*NO 4 (ACTIVE) > Attivo :P.Parametro obbligatorio restituito in una variabile di 4 caratteri. :P.Il valori restituiti possono essere: :XMP. :HP2.*YES:EHP2. se un lavoro soddisfacente la ricerca e' attivo sul sistema; :HP2.*NO :EHP2. se NESSUN lavoro soddisfacente la ricerca e' attivo sul sistema. :EXMP. :EHELP. .*------------------------------------------------------------------------------ :HELP name='JWAJQ/refpgm'. :IMHELP NAME='refpgm'. :EHELP. .*------------------------------------------------------------------------------ :HELP NAME='JWAJQ/COMMAND/EXAMPLES'. .*---------- :XH2.Esempi d'uso del comando JWAJQ Work active jobs query :P.:HP3.Esempio 1: Esamina lavori con il comando JWAJQ:EHP3. :P.Si abbia il seguente sorgente JWAJQT1, presente anche tra i sorgenti del tool. :XMP. PGM PARM(&JOBNAM &JOBUSR) DCL VAR(&JOBNAM) TYPE(*CHAR) LEN(10) DCL VAR(&JOBUSR) TYPE(*CHAR) LEN(10) DCL VAR(&ACTIVE) TYPE(*CHAR) LEN(4) JWAJQ JOBNAM(&JOBNAM) JOBUSR(&JOBUSR) ACTIVE(&ACTIVE) SNDPGMMSG MSGID(JWA0091) MSGF(NERONI2/JWAJ) + MSGDTA(&ACTIVE) ENDPGM :EXMP. :P.Si chiama il programma di test che simula l'uso del comando JWAJQ e si ottiene il seguente log. :XMP. :HP2. > CALL PGM(JWAJQT1) PARM(*ALL NERONI) :EHP2. La variabile ACTIVE contiene "*YES" :HP2. > CALL PGM(JWAJQT1) PARM(*ALL MANCA) :EHP2. La variabile ACTIVE contiene "*NO" :EXMP. :P.Si osservi il contenuto della variabile di ritorno ACTIVE, evidenziato dall'apposito messaggio di servizio. .*---------- :P.:HP3.Esempio 2: Esamina lavori con il comando JWAJQI:EHP3. :P.Si chiama il comando JWAJQI e si ottiene il seguente log. :XMP. :HP2. > JWAJQI JOBNAM(*ALL) JOBUSR(NERONI) :EHP2. Creato in QTEMP/JWAJT l'elenco dei lavori attivi di tipo "*" > /**/RUNQRY QRYFILE((QTEMP/JWAJT)) RCDSLT(*YES) Il lavoro *ALL dell'utente NERONI e' ATTIVO :HP2. > JWAJQI JOBNAM(*ALL) JOBUSR(MANCA) :EHP2. Creato in QTEMP/JWAJT l'elenco dei lavori attivi di tipo "*" > /**/RUNQRY QRYFILE((QTEMP/JWAJT)) RCDSLT(*YES) Il lavoro *ALL dell'utente MANCA NON e' attivo :EXMP. :P.I messaggi di risposta rispecchiano lo stato dei lavori indagati. :P.Si osservi il messaggio /**/RUNQRY di invito alla visualizzazione dell'elenco dei lavori che hanno contribuito alla formulazione della risposta. .*---------- :P.:HP3.Esempio 3: Esamina lavori con il programma JWAJQC:EHP3. :P.Il command processing program JWAJQC eseguito dai comandi JWAJQ e JWAJQI e' costruito in modo da permettere anche la chiamata mediante call, in specie da un rpgle. La documentazione della call viene inserita qui perche' la posizione e' intuitiva e mnemonica. :P.Il programma JWAJQC e' presente anche in QGPL per permetterne la chiamata anche senza NERONI2 in lista librerie. :P.Prima variante: ritorna la variabile ma nessun messaggio. :P.Il programma di esempio chiamata documenta in log il valore della variabile. :P.Si abbia il seguente sorgente JWAJQCT1, presente anche tra i sorgenti del tool. :XMP. * Legge il proprio nome programma. D PSDS sds D PGM 334 343 * Prenota chiusura. C seton lr * Riceve i parametri da passare. C *entry plist C parm JOBUSR C parm JOBNAM JWAJQC* Esempio di chiamata di "Work active jobs query". JWAJQC call 'JWAJQC' Work act jobs query JWAJQC parm JOBUSR 10 I Job user JWAJQC parm JOBNAM 10 I Job name :HP2. JWAJQC parm ACTIVE 4 I *MSG / O *YES-*NO :EHP2. * Segnala il risultato. C call 'JMSG2' Send info msg C parm 'JWA0091' JMSGI 7 I Msg identification C parm 'JWAJ' JMSGF 10 I Msg file C parm ACTIVE JMSGD 512 I Msg data C parm PGM JMSGR 10 I Reference program :EXMP. :P.Si chiama il programma JWAJQCT1 e si ottiene il seguente log. :XMP. :HP2. > CALL PGM(JWAJQCT1) PARM(*ALL NERONI) :EHP2. La variabile ACTIVE contiene "*YES" :HP2. > CALL PGM(JWAJQCT1) PARM(*ALL MANCA) :EHP2. La variabile ACTIVE contiene "*NO" :EXMP. :P.Si osservi il contenuto della variabile di ritorno ACTIVE, evidenziato dall'apposito messaggio di servizio. .*---------- :P.:HP3.Esempio 4: Esamina lavori con il programma JWAJQC:EHP3. :P.Variante dell'esempio 3: ritorna la variabile, i messaggi del comando JWAJ e un messaggio di esito congruente con il contenuto della variabile. :P.Il programma di esempio chiamata documenta in log il valore della variabile. :P.Si abbia il seguente sorgente JWAJQCT2, presente anche tra i sorgenti del tool. I programmi JWAJQCT1 e JWAJQCT2 differiscono tra loro solo per le istruzioni evidenziate in entrambi. :XMP. * Legge il proprio nome programma. D PSDS sds D PGM 334 343 * Prenota chiusura. C seton lr * Riceve i parametri da passare. C *entry plist C parm JOBUSR C parm JOBNAM JWAJQC* Esempio di chiamata di "Work active jobs query". JWAJQC call 'JWAJQC' Work act jobs query JWAJQC parm JOBUSR 10 I Job user JWAJQC parm JOBNAM 10 I Job name :HP2. JWAJQC parm '*MSG' ACTIVE 4 I *MSG / O *YES-*NO JWAJQC parm PGM REFPGM 10 I Reference program :EHP2. * Segnala il risultato. C call 'JMSG2' Send info msg C parm 'JWA0091' JMSGI 7 I Msg identification C parm 'JWAJ' JMSGF 10 I Msg file C parm ACTIVE JMSGD 512 I Msg data C parm PGM JMSGR 10 I Reference program :EXMP. :P.Si chiama il programma JWAJQCT2 e si ottiene il seguente log. :XMP. :HP2. > CALL PGM(JWAJQCT2) PARM(*ALL NERONI) :EHP2. Creato in QTEMP/JWAJT l'elenco dei lavori attivi di tipo "*" > /**/RUNQRY QRYFILE((QTEMP/JWAJT)) RCDSLT(*YES) Il lavoro *ALL dell'utente NERONI e' ATTIVO La variabile ACTIVE contiene "*YES" :HP2. > CALL PGM(JWAJQCT2) PARM(*ALL MANCA) :EHP2. Creato in QTEMP/JWAJT l'elenco dei lavori attivi di tipo "*" > /**/RUNQRY QRYFILE((QTEMP/JWAJT)) RCDSLT(*YES) Il lavoro *ALL dell'utente MANCA NON e' attivo La variabile ACTIVE contiene "*NO" :EXMP. :P.I messaggi di risposta rispecchiano lo stato dei lavori indagati. Si osservi il contenuto della variabile di ritorno ACTIVE, evidenziato dall'apposito messaggio di servizio. .*---------- :EHELP. .*------------------------------------------------------------------------------ :HELP NAME='JWAJQ/ERROR/MESSAGES'. .*------------------ :XH2.Messaggi del comando JWAJQ Work active jobs query .*------------------ :XH2.Messaggi di rilascio nel comando :DL COMPACT. :EDL. .*------------------ :XH2.Messaggi informativi :DL COMPACT. :EDL. .*------------------ :XH2.Messaggi di completamento :DL COMPACT. :DT.JWA0291:DD.&MSG(JWA0291,JWAJ,*LIBL,nosub). :DT.JWA0292:DD.&MSG(JWA0292,JWAJ,*LIBL,nosub). :EDL. .*------------------ :XH2.Messaggi di stato :DL COMPACT. :EDL. .*------------------ :XH2.Messaggi diagnostici seguiti da rilascio :DL COMPACT. :EDL. .*------------------ :EHELP. .*------------------------------------------------------------------------------ :EPNLGRP. //STPSRC /*----------------------------------------------------------------------------*/ /* Member: JWAJQT1 Sys:S65D69DA Lib:NERONI2 Tim:2019-11-18 12:47 */ //DATA FILE(JWAJQT1) FILETYPE(*SRC) ENDCHAR('//STPSRC') PGM PARM(&JOBNAM &JOBUSR) DCL VAR(&JOBNAM) TYPE(*CHAR) LEN(10) DCL VAR(&JOBUSR) TYPE(*CHAR) LEN(10) DCL VAR(&ACTIVE) TYPE(*CHAR) LEN(4) JWAJQ JOBNAM(&JOBNAM) JOBUSR(&JOBUSR) ACTIVE(&ACTIVE) SNDPGMMSG MSGID(JWA0091) MSGF(NERONI2/JWAJ) + MSGDTA(&ACTIVE) ENDPGM //STPSRC /*----------------------------------------------------------------------------*/ /* Member: JWAJQT2 Sys:S65D69DA Lib:NERONI2 Tim:2019-11-18 12:47 */ //DATA FILE(JWAJQT2) FILETYPE(*SRC) ENDCHAR('//STPSRC') PGM PARM(&JOBNAM &JOBUSR) DCL VAR(&JOBNAM) TYPE(*CHAR) LEN(10) DCL VAR(&JOBUSR) TYPE(*CHAR) LEN(10) DCL VAR(&ACTIVE) TYPE(*CHAR) LEN(4) VALUE(*MSG) JWAJQ JOBNAM(&JOBNAM) JOBUSR(&JOBUSR) + ACTIVE(&ACTIVE) REFPGM(JWAJQT2) SNDPGMMSG MSGID(JWA0091) MSGF(NERONI2/JWAJ) + MSGDTA(&ACTIVE) ENDPGM //STPSRC /*----------------------------------------------------------------------------*/ /* Member: JWAJ1 Sys:S65D69DA Lib:NERONI2 Tim:2019-11-18 12:47 */ //DATA FILE(JWAJ1) FILETYPE(*SRC) ENDCHAR('//STPSRC') * Claudio Neroni 18-02-2009 Creato. * JWAJ * Work active jobs outfile. Outfile * Elenca lavori attivi. Outfile * A R WAJ A TEXT('Work active jobs outfile') A WAJSEQ 9 0 A COLHDG('List' + A 'sequence') A WAJNAM 10 A COLHDG('Job' + A 'name') A WAJUSR 10 A COLHDG('Job' + A 'user') A WAJNUM 6 A COLHDG('Job' + A 'number') A WAJTYP 1 A COLHDG('Job' + A 'typ') A TEXT('Job type') A WAJSUB 1 A COLHDG('Job' + A 'sub') A TEXT('Job subtype') A WAJSTA 10 A COLHDG('Job' + A 'status') A WAJAJS 4 A COLHDG('Actv' + A 'stat') A TEXT('Active job status') A WAJJPT 1 A COLHDG('Job' + A 'pty') A TEXT('Job priority') A WAJRPT 2 A COLHDG('Run' + A 'pty') A TEXT('Run priority') A WAJEND 7 A COLHDG('Enter' + A 'date') A WAJENT 6 A COLHDG('Enter' + A 'time') A WAJCUR 10 A COLHDG('Current' + A 'user') A WAJSNA 10 A COLHDG('Submitter' + A 'name') A WAJSUS 10 A COLHDG('Submitter' + A 'user') A WAJSNU 6 A COLHDG('Submtr' + A 'number') A TEXT('Submitter number') //STPSRC //ENDBCHJOB