//BCHJOB JOB(JRTVMSGQ) 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: 2015-06-09 18:04 */ /* To File : "JRTVMSGQ" */ /* To Library : "NERONI2" */ /* To Text : "Retrieve Messages Queue. 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 "JRTVMSGQ.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:\JRTVMSGQ.txt" "/qsys.lib/NERONI2.lib/stringhe.file/JRTVMSGQ.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(JRTVMSGQ) 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/JRTVMSGQ" */ /* FACENDO ATTENZIONE ALL'ORDINE DI ESECUZIONE INDICATO NEL */ /* MEMBRO FACOLTATIVO "A.LEGGIMI", AD ESEMPIO: */ /* SBMDBJOB FILE(NERONI2/JRTVMSGQ) MBR(JRTVMSGQ.) 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/JRTVMSGQ) CRTSRCPF FILE(NERONI2/JRTVMSGQ) RCDLEN(112) + TEXT('Retrieve Messages Queue. Src') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JRTVMSGQ) TOFILE(NERONI2/JRTVMSGQ) + TOMBR(JRTVMSGQ) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JRTVMSGQ) MBR(JRTVMSGQ) + SRCTYPE(CMD) + TEXT('Retrieve Messages Queue. Cmd') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JRTVMSGQ.) TOFILE(NERONI2/JRTVMSGQ) + TOMBR(JRTVMSGQ.) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JRTVMSGQ) MBR(JRTVMSGQ.) + SRCTYPE(CL) + TEXT('Retrieve Messages Queue. Cjs') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JRTVMSGQC) TOFILE(NERONI2/JRTVMSGQ) + TOMBR(JRTVMSGQC) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JRTVMSGQ) MBR(JRTVMSGQC) + SRCTYPE(CLLE) + TEXT('Retrieve Messages Queue. Cpp') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JRTVMSGQD) TOFILE(NERONI2/JRTVMSGQ) + TOMBR(JRTVMSGQD) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JRTVMSGQ) MBR(JRTVMSGQD) + SRCTYPE(RPGLE) + TEXT('Retrieve Messages Queue. WrtOutFile') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JRTVMSGQP) TOFILE(NERONI2/JRTVMSGQ) + TOMBR(JRTVMSGQP) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JRTVMSGQ) MBR(JRTVMSGQP) + SRCTYPE(PNLGRP) + TEXT('Retrieve Messages Queue. Help') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JRTVMSGQ1) TOFILE(NERONI2/JRTVMSGQ) + TOMBR(JRTVMSGQ1) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JRTVMSGQ) MBR(JRTVMSGQ1) + SRCTYPE(PF) + TEXT('Retrieve Messages Queue. OutFile') /*---------------------------------------------------------------------*/ //DATA FILE(JRTVMSGQ) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Retrieve Messages Queue. Cmd */ /* Claudio Neroni 07/06/2015 Creato. */ CMD PROMPT('Retrieve Messages Queue') PARM KWD(MSGQ) TYPE(MSGQ) MIN(1) PROMPT('Messages + Queue') MSGQ: QUAL TYPE(*NAME) QUAL TYPE(*NAME) DFT(*LIBL) SPCVAL((*LIBL)) + PROMPT('library') PARM KWD(OUTFILE) TYPE(OUTFILE) PROMPT('Output + File') OUTFILE: QUAL TYPE(*NAME) DFT(JRTVMSGQ1T) QUAL TYPE(*NAME) DFT(QTEMP) MIN(0) PROMPT('library') //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JRTVMSGQ.) FILETYPE(*SRC) ENDCHAR('//ENDSRC') //BCHJOB JOB(JRTVMSGQ.) JOBD(NERONI2/NERONI2) OUTQ(QPRINTS) + ENDSEV(60) LOG(4 00 *SECLVL) MSGQ(*USRPRF) /* Claudio Neroni 08/06/2015 Creato. */ /* JRTVMSGQ. */ /* Retrieve Messages Queue. Cjs */ /* Prerequisiti: JCPYCLR, JRSNMSG. JDECCHA */ /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP QGPL) ADDLIBLE LIB(NERONI2) POSITION(*AFTER QTEMP) /* Cancella gli oggetti preesistenti. */ DLTCMD CMD(NERONI2/JRTVMSGQ) DLTPNLGRP PNLGRP(NERONI2/JRTVMSGQP) DLTPGM PGM(NERONI2/JRTVMSGQC) DLTPGM PGM(NERONI2/JRTVMSGQD) DLTF FILE(NERONI2/JRTVMSGQ1) DLTMSGF MSGF(NERONI2/JRTVMSGQ) /* Crea gli oggetti. */ CRTPF FILE(NERONI2/JRTVMSGQ1) SRCFILE(JRTVMSGQ) SIZE(*NOMAX) CRTBNDRPG PGM(NERONI2/JRTVMSGQD) SRCFILE(JRTVMSGQ) DBGVIEW(*ALL) + TGTRLS(*CURRENT) CRTBNDCL PGM(NERONI2/JRTVMSGQC) SRCFILE(JRTVMSGQ) TGTRLS(*CURRENT) + DBGVIEW(*ALL) CRTPNLGRP PNLGRP(NERONI2/JRTVMSGQP) SRCFILE(JRTVMSGQ) CRTCMD CMD(NERONI2/JRTVMSGQ) PGM(JRTVMSGQC) SRCFILE(JRTVMSGQ) + MSGF(JRTVMSGQ) HLPPNLGRP(JRTVMSGQP) HLPID(CMD) + PRDLIB(NERONI2) /* Crea il file messaggi. */ CRTMSGF MSGF(NERONI2/JRTVMSGQ) TEXT('Retrieve Messages Queue. Msgf') /* Messaggi del Command Processing Program (usr0*). */ ADDMSGD MSGID(JRM0001) MSGF(NERONI2/JRTVMSGQ) MSG('Trascritti &1 + messaggi dalla coda &2/&3 al file &4/&5') FMT((*DEC 7 + 0) (*CHAR 10) (*CHAR 10) (*CHAR 10) (*CHAR 10)) /* Messaggi del Command (usr1*). */ /* Messaggi del Validity Checker Program (usr2*). */ //ENDBCHJOB //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JRTVMSGQC) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /* Retrieve Messages Queue. Cpp */ /* Claudio Neroni 04-06-2015 Creato. */ /* Recupera tutti i messaggi di una coda messaggi */ /* e li trascrive nel file di emissione. */ /* */ PGM PARM(&MSGQQ &OUTFQ) /* Riceve Coda messaggi qualificata. */ DCL VAR(&MSGQQ) TYPE(*CHAR) LEN(20) /* Riceve File di emissione qualificato. */ DCL VAR(&OUTFQ) TYPE(*CHAR) LEN(20) /* Coda messaggi. */ DCL VAR(&MSGQ) TYPE(*CHAR) LEN(10) /* Coda messaggi, libreria. */ DCL VAR(&MSGQLIB) TYPE(*CHAR) LEN(10) /* File di emissione. */ DCL VAR(&OUTF) TYPE(*CHAR) LEN(10) /* File di emissione, libreria. */ DCL VAR(&OUTFLIB) TYPE(*CHAR) LEN(10) /* Tipo messaggio da ricevere. */ DCL VAR(&MSGTYPE) TYPE(*CHAR) LEN(6) VALUE(*NEXT) /* Chiave messaggio prima della lettura. */ DCL VAR(&MSGKEY) TYPE(*CHAR) LEN(4) VALUE(*TOP) /* Chiave del messaggio letto. */ DCL VAR(&KEYVAR) TYPE(*CHAR) LEN(4) /* Testo messaggio. */ DCL VAR(&MSG) TYPE(*CHAR) LEN(1000) /* Testo messaggio, lunghezza dati. */ DCL VAR(&MSGLEN) TYPE(*DEC) LEN(5 0) /* Testo secondo livello. */ DCL VAR(&SECLVL) TYPE(*CHAR) LEN(2000) /* Testo secondo livello, lunghezza dati. */ DCL VAR(&SECLVLLEN) TYPE(*DEC) LEN(5 0) /* Dati del messaggio. */ DCL VAR(&MSGDTA) TYPE(*CHAR) LEN(1000) /* Dati del messaggio, lunghezza dati. */ DCL VAR(&MSGDTALEN) TYPE(*DEC) LEN(5 0) /* Identificazione del messaggio. */ DCL VAR(&MSGID) TYPE(*CHAR) LEN(7) /* Gravità del messaggio. */ DCL VAR(&SEV) TYPE(*DEC) LEN(2 0) /* Mittente del messaggio. */ DCL VAR(&SENDER) TYPE(*CHAR) LEN(87) /* Tipo del messaggio lwtto. */ DCL VAR(&RTNTYPE) TYPE(*CHAR) LEN(2) /* Opzione di allerta. */ DCL VAR(&ALROPT) TYPE(*CHAR) LEN(9) /* File messaggi. */ DCL VAR(&MSGF) TYPE(*CHAR) LEN(10) /* File messaggi, libreria. */ DCL VAR(&MSGFLIB) TYPE(*CHAR) LEN(10) /* File messaggi di invio, libreria. */ DCL VAR(&SNDMSGFLIB) TYPE(*CHAR) LEN(10) /* Codifica del testo. */ DCL VAR(&TXTCCSID) TYPE(*DEC) LEN(5 0) /* Codifica dei dati. */ DCL VAR(&DTACCSID) TYPE(*DEC) LEN(5 0) /* Contatore messaggi. */ DCL VAR(&CNT) TYPE(*DEC) LEN(7 0) DCL VAR(&CNTA) TYPE(*CHAR) LEN(4) /* Prenotazione del CPF0001. */ DCL VAR(&CPF0001) TYPE(*LGL) /* Intercetta gli errori. */ MONMSG MSGID(CPF0000 MCH0000 CEE0000) EXEC(GOTO + CMDLBL(ERRORE)) /* Estrae parametri da coda messaggi qualificata. */ CHGVAR VAR(&MSGQ) VALUE(%SST(&MSGQQ 1 10)) CHGVAR VAR(&MSGQLIB) VALUE(%SST(&MSGQQ 11 10)) /* Estrae parametri da file di emissione qualificato. */ CHGVAR VAR(&OUTF) VALUE(%SST(&OUTFQ 1 10)) CHGVAR VAR(&OUTFLIB) VALUE(%SST(&OUTFQ 11 10)) /* Rende ricevibili i messaggi contenuti nella coda. */ CHGMSGQ MSGQ(&MSGQLIB/&MSGQ) RESET(*YES) /* Verifica l'esistenza della coda messaggi e recupera la libreria se *LIBL. */ RTVOBJD OBJ(&MSGQLIB/&MSGQ) OBJTYPE(*MSGQ) + RTNLIB(&MSGQLIB) /* Crea il file di emissione. */ JCPYCLR FROMFILE(JRTVMSGQ1) TOFILE(&OUTFLIB/&OUTF) /* Ridirige la scrittura sul file di emissione. */ OVRDBF FILE(JRTVMSGQ1) TOFILE(&OUTFLIB/&OUTF) /* Cicla. */ DOWHILE COND('1') /* Riceve un messaggio dalla coda messaggi. */ RCVMSG MSGQ(&MSGQLIB/&MSGQ) MSGTYPE(&MSGTYPE) + MSGKEY(&MSGKEY) RMV(*NO) KEYVAR(&KEYVAR) + MSG(&MSG) MSGLEN(&MSGLEN) SECLVL(&SECLVL) + SECLVLLEN(&SECLVLLEN) MSGDTA(&MSGDTA) + MSGDTALEN(&MSGDTALEN) MSGID(&MSGID) + SEV(&SEV) SENDER(&SENDER) + SENDERFMT(*SHORT) RTNTYPE(&RTNTYPE) + ALROPT(&ALROPT) MSGF(&MSGF) + MSGFLIB(&MSGFLIB) SNDMSGFLIB(&SNDMSGFLIB) + TXTCCSID(&TXTCCSID) DTACCSID(&DTACCSID) /* Se errore, abbandona. */ MONMSG MSGID(CPF0000) EXEC(LEAVE) /* Se non ci sono altri messaggi, abbandona. */ IF COND(&KEYVAR *EQ ' ') THEN(LEAVE) /* Trascrive il messaggio nel file di emissione. */ CALL PGM(JRTVMSGQD) PARM(&MSGQLIB &MSGQ &KEYVAR + &MSG &MSGLEN &SECLVL &SECLVLLEN &MSGDTA + &MSGDTALEN &MSGID &SEV &SENDER &RTNTYPE + &ALROPT &MSGF &MSGFLIB &SNDMSGFLIB + &TXTCCSID &DTACCSID) /* Conta il messaggio. */ CHGVAR VAR(&CNT) VALUE(&CNT + 1) /* Assume la chiave corrente come base per la lettura successiva. */ CHGVAR VAR(&MSGKEY) VALUE(&KEYVAR) /* Cicla. */ ENDDO /* Converte il contatore in forma utilizzabile nel messaggio. */ JDECCHA FROMDEC(&CNT) TOCHAR4(&CNTA) /* Messaggia per esito felice. */ SNDPGMMSG MSGID(JRM0001) MSGF(NERONI2/JRTVMSGQ) + MSGDTA(&CNTA *CAT &MSGQLIB *CAT &MSGQ + *CAT &OUTFLIB *CAT &OUTF) /* Invita l'utente all'uso di Work Data Base File. */ JRQS CMD(WRKDBF FILENAME(&OUTFLIB/&OUTF)) /* 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(JRTVMSGQ) 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 //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JRTVMSGQD) FILETYPE(*SRC) ENDCHAR('//ENDSRC') * Retrieve Messages Queue. WrtOutFile * Claudio Neroni 07-06-2015 Creato. * Scrive i messaggi recuperati nel file di emissione. * Fjrtvmsgq1 o e disk D RT s 2 DIM(17) CTDATA PERRCD(1) D RTD s 10 DIM(17) ALT(RT) D SENDER DS D SENJOB D SENUSR D SENNBR D SENNAM D SENINS D SENDAT D SENTIM D SENTONAM D SENTOINS D SENTYP D SENTOTYP D SENMIC D SENCUR C *entry plist C parm MSGQLIB C parm MSGQ C parm KEYVAR C parm MSG C parm MSGLEN C parm SECLVL C parm SECLVLLEN C parm MSGDTA C parm MSGDTALEN C parm MSGID C parm SEV C parm SENDER C parm RTNTYPE C parm ALROPT C parm MSGF C parm MSGFLIB C parm SNDMSGFLIB C parm TXTCCSID C parm DTACCSID C eval msg2 = msg C eval seclvl2 = seclvl C eval msgdta2 = msgdta C clear ai 3 0 C eval ai=%lookup(RTNTYPE:RT) C if ai=*zero C eval RTNTYPED=*all'?' C else C eval RTNTYPED=RTD(ai) C endif C write rcd C return ** 01*COMP Completamento 02*DIAG Diagnostico 04*INFO Informativo 05*INQ Interrogazione 06*COPY Copia 08*RQS Richiesta 10*RQS PN Richiesta con pannello di richiesta 14*NOTIFY AM Notifica (eccezione già gestita al momento di RCVMSG) 15*ESCAPE AM Uscita (eccezione già gestita al momento di RCVMSG) 16*NOTIFY NM Notifica (eccezione non gestita al momento di RCVMSG) 17*ESCAPE NM Uscita (eccezione non gestita al momento di RCVMSG) 21*RPY NOCT Risposta, senza controllo di validità 22*RPY ALCT Risposta, già eseguito il controllo di validità 23*RPY DFMS Risposta, utilizzato il valore predefinito del messaggio 24*RPY DFSY Risposta, utilizzato il valore predefinito di sistema 25*RPY SYRL Risposta, dall'Elenco di risposte di sistema 26*RPY FRPG Risposta, dal programma di uscita //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JRTVMSGQP) FILETYPE(*SRC) ENDCHAR('//ENDSRC') :PNLGRP. .*--------------------------------------------------------------------- :HELP NAME=CMD. :H3.Comando JRTVMSGQ :H2.Recupera tutti i messaggi contenuti in una coda e li trascrive in un file di database. :P.Il comando permette di trasformare in record dati i messaggi contenuti in una coda e quindi rende possibile l'analisi della coda messaggi con i tool tipici dei file fisici. :P.Nel tracciato sono riportati due volte i campi Messaggio, SecondoLivello e DatiMessaggio con lunghezze diverse, una corta e l'altra lunga per facilitare la lettura. :P.Osservare che il file di emissione contiene dati esadecimali che possono provocare incidenti di visualizzazione in query, sql, dfu. Il visualizzatore meno sensibile a tali problemi è il Work Data Base File. :P.I campi piu' problematici in tal senso sono ReturnKey e MessageData. :EHELP. .*--------------------------------------------------------------------- :HELP name='CMD/msgq'. :H3.Message Queue (MSGQ) - queue :P.Nome della coda messaggi da trascrivere nel data base. :P.Valori permessi: :PARML. :PT.nome-coda-messaggi :PD.Il valore è obbligatorio. :EPARML. :H3.Message Queue (MSGQ) - library :P.Nome della libreria in cui risiede la coda. :P.Valori permessi: :PARML. :PT.:PK DEF.*LIBL:EPK.€ :PD.La coda messaggi viene cercata in lista librerie. :PT.nome-libreria :PD.La coda messaggi viene cercata nella libreria richiesta. :EPARML. :EHELP. .*--------------------------------------------------------------------- :HELP name='CMD/outfile'. :H3.Output file (OUTFILE) - file :P.Nome del file fisico ricevente la trascrizione della coda. :P.Se il file di emissione manca, viene creato. :P.Se il file di emissione preesiste, viene ricoperto. :P.Valori permessi: :PARML. :PT.:PK DEF.JRTVMSGQ1T:EPK.€ :PD.Il file di emissione prende il nome di default JRTVMSGQ1T. :PT.nome-file-emissione :PD.Il nome indicato viene usato per il file di emissione. :EPARML. :H3.Output file (OUTFILE) - library :P.Nome della libreria in cui risiede il file di emissione ricevente della trascrizione della coda messaggi. :P.Valori permessi: :PARML. :PT.:PK DEF.QTEMP:EPK.€ :PD.Il file di emissione viene creato in libreria temporanea. :PT.nome-libreria :PD.Il file di emissione viene creato nella libreria richiesta. :EPARML. :EHELP. .*--------------------------------------------------------------------- :EPNLGRP. //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JRTVMSGQ1) FILETYPE(*SRC) ENDCHAR('//ENDSRC') * Retrieve Messages Queue. WrkFile * Claudio Neroni 04-06-2015 Creato. * Serve ad accantonare i messaggi recuperati da una coda messaggi * con il comando RCVMSG. * I campi MSG, SECLVL e MSGDTA short sono in testa. * Gli stessi in versione long sono in coda. * A R RCD A TEXT('Retrieve Messages Queue. + A OutFile') A MSGQ 10 A COLHDG('Message' + A 'queue') A MSGQLIB 10 A COLHDG('Message' + A 'queue' + A 'library') A MSGLEN 5 0 A COLHDG('First' + A 'level' + A 'length') A EDTCDE(L) A MSG2 200 A COLHDG('Short First' + A 'level' + A 'text') A SECLVLLEN 5 0 A COLHDG('Second' + A 'level' + A 'length') A EDTCDE(L) A SECLVL2 200 A COLHDG('Short Second' + A 'level' + A 'text') A MSGDTALEN 5 0 A COLHDG('Message' + A 'data' + A 'length') A EDTCDE(L) A MSGDTA2 200 A COLHDG('Short Message' + A 'data') A MSGID 7 A COLHDG('Message' + A 'identif') A SEV 2 0 A COLHDG('Severity') A EDTCDE(L) A SENDER 87 A COLHDG('Short' + A 'sender') A SENJOB 10 A COLHDG('Sender' + A 'JobName') A SENUSR 10 A COLHDG('Sender' + A 'JobUser') A SENNBR 6 A COLHDG('Sender' + A 'JobNbr') A SENNAM 12 A COLHDG('Sender' + A 'Name') A SENINS 4 A COLHDG('Sender' + A 'Instr') A SENDAT 7 A COLHDG('Sender' + A 'Date') A SENTIM 6 A COLHDG('Sender' + A 'Time') A SENMIC 6 A COLHDG('Sender' + A 'MicroSec') A SENTONAM 10 A COLHDG('Sender' + A 'ToName') A SENTOINS 4 A COLHDG('Sender' + A 'ToInstr') A SENTYP 1 A COLHDG('Sender' + A 'Type') A SENTOTYP 1 A COLHDG('Sender' + A 'ToType') A SENCUR 10 A COLHDG('Sender' + A 'CurUser') A RTNTYPE 2 A COLHDG('Return' + A 'type') A RTNTYPED 10 A COLHDG('Return type' + A 'description') A ALROPT 9 A COLHDG('Alert' + A 'option') A MSGF 10 A COLHDG('Message' + A 'file') A MSGFLIB 10 A COLHDG('Message' + A 'file' + A 'library') A SNDMSGFLIB 10 A COLHDG('Send' + A 'message file' + A 'library') A TXTCCSID 5 0 A COLHDG('Text' + A 'CCSID') A EDTCDE(L) A DTACCSID 5 0 A COLHDG('Data' + A 'CCSID') A EDTCDE(L) A KEYVAR 4 A COLHDG('Key' + A 'var') A MSG 1000 A COLHDG('Long First' + A 'level' + A 'text') A SECLVL 2000 A COLHDG('Long Second' + A 'level' + A 'text') A MSGDTA 1000 A COLHDG('Long Message' + A 'data') //ENDSRC //ENDBCHJOB