//BCHJOB JOB(JCV) JOBD(QBATCH) OUTQ(QPRINT) ENDSEV(60) + LOG(4 00 *SECLVL) MSGQ(*USRPRF) /* Open source scaricabile da www.neroni.it di Claudio Neroni */ /* SE L'USO DELLA JOB DESCRIPTION "QBATCH" TI E' IMPEDITO, */ /* UTILIZZANE UNA DIVERSA. */ /* From System: "IUBICSVI" */ /* From Library: "UTI" */ /* Unload Time: 2009-01-02 18:04 */ /* To File : "JCV" */ /* To Library : "NERONI2" */ /* To Text : "Conversion. 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 "JCV.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:\JCV.txt" "/qsys.lib/NERONI2.lib/stringhe.file/JCV.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(JCV) 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/JCV" */ /* FACENDO ATTENZIONE ALL'ORDINE DI ESECUZIONE INDICATO NEL */ /* MEMBRO FACOLTATIVO "A.LEGGIMI", AD ESEMPIO: */ /* SBMDBJOB FILE(NERONI2/JCV) MBR(JCV.) 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/JCV) CRTSRCPF FILE(NERONI2/JCV) RCDLEN(112) + TEXT('Conversion. Src') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCV.) TOFILE(NERONI2/JCV) + TOMBR(JCV.) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCV) MBR(JCV.) + SRCTYPE(CL) + TEXT('Conversion. Cjs') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCVCLCM) TOFILE(NERONI2/JCV) + TOMBR(JCVCLCM) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCV) MBR(JCVCLCM) + SRCTYPE(RPGLE) + TEXT('Conversion. Control Language Comment PROC') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCVHC) TOFILE(NERONI2/JCV) + TOMBR(JCVHC) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCV) MBR(JCVHC) + SRCTYPE(RPGLE) + TEXT('Conversion. HexToChar') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCVPCPN) TOFILE(NERONI2/JCV) + TOMBR(JCVPCPN) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCV) MBR(JCVPCPN) + SRCTYPE(RPGLE) + TEXT('Conversion. PackCharToPackNbr') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCVPCPNP) TOFILE(NERONI2/JCV) + TOMBR(JCVPCPNP) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCV) MBR(JCVPCPNP) + SRCTYPE(RPGLE) + TEXT('Conversion. PackCharToPackNbr PROC') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCVPCPNT) TOFILE(NERONI2/JCV) + TOMBR(JCVPCPNT) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCV) MBR(JCVPCPNT) + SRCTYPE(RPGLE) + TEXT('Conversion. PackCharToPackNbr TEST') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCVPCST) TOFILE(NERONI2/JCV) + TOMBR(JCVPCST) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCV) MBR(JCVPCST) + SRCTYPE(RPGLE) + TEXT('Conversion. PackCharToString') /* Copia il sorgente dalla stringa al membro del file sorgente. */ /* Modifica testo e tipo seu del sorgente caricato. */ CPYF FROMFILE(JCVPNPC) TOFILE(NERONI2/JCV) + TOMBR(JCVPNPC) MBROPT(*REPLACE) SRCOPT(*SEQNBR) CHGPFM FILE(NERONI2/JCV) MBR(JCVPNPC) + SRCTYPE(RPGLE) + TEXT('Conversion. PackNbrToPackChar') /*---------------------------------------------------------------------*/ //DATA FILE(JCV.) FILETYPE(*SRC) ENDCHAR('//ENDSRC') //BCHJOB JOB(JCV.) JOBD(QBATCH) OUTQ(QPRINTS) ENDSEV(60) LOG(4 00 + *SECLVL) MSGQ(*USRPRF) /* Claudio Neroni 12/12/2000 Creato. */ /* JCV */ /* Conversion. */ /* Prerequisiti: nessuno. */ /* Imposta la lista librerie. */ CHGLIBL LIBL(QTEMP QGPL) ADDLIBLE LIB(NERONI2) POSITION(*AFTER QTEMP) /* Cancella gli oggetti preesistenti. */ DLTPGM PGM(NERONI2/JCVPCST) DLTPGM PGM(NERONI2/JCVPNPC) DLTPGM PGM(NERONI2/JCVPNPN) DLTPGM PGM(NERONI2/JCVPNPNT) DLTPGM PGM(NERONI2/JCVPNPNP) DLTPGM PGM(NERONI2/JCVCLCM ) DLTPGM PGM(NERONI2/JCVHC ) /* Crea gli oggetti. */ CRTBNDRPG PGM(NERONI2/JCVPCST) SRCFILE(JCV) DBGVIEW(*ALL) CRTBNDRPG PGM(NERONI2/JCVPNPC) SRCFILE(JCV) DBGVIEW(*ALL) CRTBNDRPG PGM(NERONI2/JCVPCPN) SRCFILE(JCV) DBGVIEW(*ALL) CRTBNDRPG PGM(NERONI2/JCVPCPNT) SRCFILE(JCV) DBGVIEW(*ALL) CRTBNDRPG PGM(NERONI2/JCVPCPNP) SRCFILE(JCV) DFTACTGRP(*NO) DBGVIEW(*ALL) CRTBNDRPG PGM(NERONI2/JCVCLCM ) SRCFILE(JCV) DFTACTGRP(*NO) DBGVIEW(*ALL) CRTBNDRPG PGM(NERONI2/JCVHC ) SRCFILE(JCV) DBGVIEW(*ALL) //ENDBCHJOB //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JCVCLCM) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /TITLE Conversion. Control Language Comment PROC * Claudio Neroni 30/10/2008 Creato. * Aggiusta un commento Control Language posizionando, * se possibile, la costante "*/" finale alla 72. *--------------------------------------------------------------------- * Definisce procedura. Aggiusta un commento Control Language. D jclcm pr 100 * Stringa commento da aggiustare. D stm 100 *--------------------------------------------------------------------- * Scambia parametri. C *entry plist * Riceve il commento da aggiustare. C parm stm 100 * Mostra input. C movel(p) stm stm1 50 C move(p) stm stm2 50 C stm1 dsply C stm2 dsply * Aggiusta il commento. C eval stm=jclcm(stm) * Mostra output. C movel(p) stm stm1 50 C move(p) stm stm2 50 C stm1 dsply C dsply stm2 * Ritorna. C seton lr *--------------------------------------------------------------------- * Inizio procedura. Aggiusta un commento Control Language. P jclcm b * Interpretazione numerica della stringa. D jclcm pi 100 * Stringa commento da aggiustare. D stm 100 * Campi di comodo. D dex s like(stm) D sin s like(stm) D dex2 s 2 D sin2 s 2 * Esegue l'aggiustamento. C eval sin = %trim(stm) C evalr dex = %trim(stm) C movel(p) sin sin2 C move(p) dex dex2 C if sin2 = '/*' and C dex2 = '*/' C move ' ' dex C eval sin = %trim(dex) C if %subst(sin:73)=*blank C eval stm = %subst(sin:1:72) + '*/' C endif C endif * Restituisce il commento aggiustato. C return stm * Fine procedura. Aggiusta un commento Control Language. P jclcm e *--------------------------------------------------------------------- //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JCVHC) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /TITLE Conversion. HexToChar * Claudio Neroni 27-04-1982 Creato. * Trasforma notazione esadecimale in carattere. * * Riceve in ESA due caratteri che simboleggiano un * carattere esadecimale. * Restituisce in HEX il carattere esadecimale corrispondente. * Restituisce ERRORE in on se ESA contiene caratteri non validi. *--------------------------------------------------------------------------------------------- D VALIDI S 1 DIM(16) CTDATA PERRCD(16) Esadec validi *--------------------------------------------------------------------------------------------- C *ENTRY PLIST C PARM ESA 2 C PARM HEX 1 C PARM *IN99 ERRORE 1 C SETOFF 99 C MOVE *BLANK HEX C MOVEL ESA ESA1 1 C MOVE ESA ESA2 1 *--------------------------------------------------------------------------------------------- C ESA1 LOOKUP VALIDI 11 C N11 SETON 99 C N11 GOTO FINE C ESA2 LOOKUP VALIDI 11 C N11 SETON 99 C N11 GOTO FINE *--------------------------------------------------------------------------------------------- C BITOFF '01234567' HEX *--------------------------------------------------------------------------------------------- C ESA1 COMP '1' 11 C 11 BITON '3' HEX C 11 GOTO SECOND C ESA1 COMP '2' 11 C 11 BITON '2' HEX C 11 GOTO SECOND C ESA1 COMP '3' 11 C 11 BITON '23' HEX C 11 GOTO SECOND C ESA1 COMP '4' 11 C 11 BITON '1' HEX C 11 GOTO SECOND C ESA1 COMP '5' 11 C 11 BITON '13' HEX C 11 GOTO SECOND C ESA1 COMP '6' 11 C 11 BITON '12' HEX C 11 GOTO SECOND C ESA1 COMP '7' 11 C 11 BITON '123' HEX C 11 GOTO SECOND C ESA1 COMP '8' 11 C 11 BITON '0' HEX C 11 GOTO SECOND C ESA1 COMP '9' 11 C 11 BITON '03' HEX C 11 GOTO SECOND C ESA1 COMP 'A' 11 C 11 BITON '02' HEX C 11 GOTO SECOND C ESA1 COMP 'B' 11 C 11 BITON '023' HEX C 11 GOTO SECOND C ESA1 COMP 'C' 11 C 11 BITON '01' HEX C 11 GOTO SECOND C ESA1 COMP 'D' 11 C 11 BITON '013' HEX C 11 GOTO SECOND C ESA1 COMP 'E' 11 C 11 BITON '012' HEX C 11 GOTO SECOND C ESA1 COMP 'F' 11 C 11 BITON '0123' HEX C 11 GOTO SECOND *--------------------------------------------------------------------------------------------- C SECOND TAG C ESA2 COMP '1' 11 C 11 BITON '7' HEX C 11 GOTO FINE C ESA2 COMP '2' 11 C 11 BITON '6' HEX C 11 GOTO FINE C ESA2 COMP '3' 11 C 11 BITON '67' HEX C 11 GOTO FINE C ESA2 COMP '4' 11 C 11 BITON '5' HEX C 11 GOTO FINE C ESA2 COMP '5' 11 C 11 BITON '57' HEX C 11 GOTO FINE C ESA2 COMP '6' 11 C 11 BITON '56' HEX C 11 GOTO FINE C ESA2 COMP '7' 11 C 11 BITON '567' HEX C 11 GOTO FINE C ESA2 COMP '8' 11 C 11 BITON '4' HEX C 11 GOTO FINE C ESA2 COMP '9' 11 C 11 BITON '47' HEX C 11 GOTO FINE C ESA2 COMP 'A' 11 C 11 BITON '46' HEX C 11 GOTO FINE C ESA2 COMP 'B' 11 C 11 BITON '467' HEX C 11 GOTO FINE C ESA2 COMP 'C' 11 C 11 BITON '45' HEX C 11 GOTO FINE C ESA2 COMP 'D' 11 C 11 BITON '457' HEX C 11 GOTO FINE C ESA2 COMP 'E' 11 C 11 BITON '456' HEX C 11 GOTO FINE C ESA2 COMP 'F' 11 C 11 BITON '4567' HEX C 11 GOTO FINE *--------------------------------------------------------------------------------------------- C FINE TAG C RETURN *--------------------------------------------------------------------------------------------- ** VALIDI 0123456789ABCDEF //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JCVPCPN) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /TITLE Conversion. PackCharToPackNbr * Claudio Neroni 21/10/2008 Creato. * Trasforma un campo carattere di lunghezza variabile da 1 a 16, * contenente un impaccato da 1 a 63 cifre allineato a sinistra, * in un campo numerico. *--------------------------------------------------------------------- * Fa coincidere un impaccato della lunghezza massima * con un alfanumerico. D ds D pak 31p 0 D paka 1 16 * Definisce indici di comodo. D byt s 3 0 D beg s 3 0 *--------------------------------------------------------------------- * Scambia parametri. C *entry plist * Riceve i dati impaccati allineati a sinistra in un alfanumerico. C parm inp 16 * Riceve la lunghezza in cifre dei dati impaccati. C parm len 3 0 * Restituisce il numero contenuto nei dati. C parm out 31 0 * Pulisce i parametri di ritorno. C clear out * Pulisce l'impaccato intermedio, coincidente con un alfa. C clear pak * Calcola la lunghezza dei dati in byte. C eval byt=(len+2)/2 * Calcola la partenza dei dati nell'alfa intermedio. C eval beg=16+1-byt * Trascrive i dati dall'input all'alfa intermedio. C eval %subst(paka:beg:byt)=%subst(inp:1:byt) * Trascrive l'impaccato intermedio nell'output. C z-add pak out * Ritorna. C seton lr *--------------------------------------------------------------------- * Intercetta errore nei dati decimali. C *pssr begsr C z-add *hival out C return C endsr *--------------------------------------------------------------------- //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JCVPCPNP) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /TITLE Conversion. PackCharToPackNbr PROC * Claudio Neroni 22/10/2008 Creato. * Trasforma un campo carattere di lunghezza variabile da 1 a 16, * contenente un impaccato da 1 a 31 cifre allineato a sinistra, * in un campo numerico. *--------------------------------------------------------------------- * Definisce procedura. Converte da carattere a numero. D jcvcn pr 31p 0 * Stringa carattere da interpretare come numero impaccato. D jcvcninp 16 * Numero di cifre da estrarre. D jcvcnlen 3p 0 * Risultato. D jcvcnx s 31p 0 *--------------------------------------------------------------------- * Scambia parametri. C *entry plist * Riceve i dati impaccati allineati a sinistra in un alfanumerico. C parm inp 16 * Riceve la lunghezza in byte dei dati impaccati. C parm len 3 0 * Calcola il numero. C eval jcvcnx=jcvcn(inp : len) * Utilizza il risultato. C dsply jcvcnx * Ritorna. C seton lr *--------------------------------------------------------------------- * Inizio procedura. Converte da carattere a numero. P jcvcn b * Interpretazione numerica della stringa. D jcvcn pi 31p 0 * Stringa carattere da interpretare come numero impaccato. D inp 16 * Numero di cifre da estrarre. D len 3p 0 * Comodo come interpretazione numerica della stringa. D jcvcnout s 31p 0 * Fa coincidere un impaccato della lunghezza massima * con un alfanumerico. D ds D pak 31p 0 D paka 1 16 * Definisce indici di comodo. D byt s 3 0 D beg s 3 0 * Pulisce i parametri di ritorno. C clear jcvcnout * Pulisce l'impaccato intermedio, coincidente con un alfa. C clear pak * Calcola la lunghezza dei dati in byte. C eval byt=(len+2)/2 * Calcola la partenza dei dati nell'alfa intermedio. C eval beg=16+1-byt * Trascrive i dati dall'input all'alfa intermedio. C eval %subst(paka:beg:byt)=%subst(inp:1:byt) * Trascrive l'impaccato intermedio nell'output. C z-add pak jcvcnout * Restituisce il numero calcolato. C return jcvcnout * Intercetta errore nei dati decimali. C *pssr begsr C z-add *hival jcvcnout C return jcvcnout C endsr * Fine procedura. Converte da carattere a numero. P jcvcn e *--------------------------------------------------------------------- //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JCVPCPNT) FILETYPE(*SRC) ENDCHAR('//ENDSRC') * Per provare, chiama come segue e guarda il messaggio del dsply. * Positivo di 9 cifre * call jcvpcpnt (x'123456789F0000000000000000000000' x'009f') * Positivo di 31 cifre * call jcvpcpnt (x'1234567890123456789012345678901F' x'031f') * Negativo di 5 cifre * call jcvpcpnt (x'12345D00000000000000000000000000' x'005f') * * Scambia parametri. C *entry plist * Riceve i dati impaccati allineati a sinistra in un alfanumerico. C parm inp 16 * Riceve la lunghezza in byte dei dati impaccati. C parm len 3 0 * Conversion. PackCharToPackNbr C call 'JCVPCPN' * Riceve i dati impaccati allineati a sinistra in un alfanumerico. C parm inp * Riceve la lunghezza in byte dei dati impaccati. C parm len * Restituisce il numero contenuto nei dati. C parm out 31 0 * Visualizza. C dsply out * Ritorna. C seton lr //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JCVPCST) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /TITLE Conversion. PackCharToString * Claudio Neroni 28/11/2000 Creato. * Trasforma un campo carattere di lunghezza variabile da 1 a 16, * contenente un impaccato da 1 a 30 cifre allineato a sinistra, * in una stringa alfanumerica composta da segno, interi, * eventuali virgola e decimali. * Nato per gestire il ritorno di dati della API QWCRDTAA * di recupero delle caratteristiche di una area dati, * quando l'area dati è numerica. * La variabile stringa restituita è adatta ad entrare * nel campo VALUE di un CHGDTAARA della medesima area dati. *--------------------------------------------------------------------- * La lunghezza eccessiva dei parametri numerici * (e quindi degli indici di comodo) * è conforme ai parametri di ritorno dalla API. *--------------------------------------------------------------------- * Fa coincidere un impaccato della lunghezza massima * con un alfanumerico. D ds D pak 30p 0 D paka 1 16 * Fa coincidere uno zonato della lunghezza massima * con un alfanumerico. D ds D znd 30s 0 D znda 1 30 * Definisce indici di comodo. D zer s 9 0 D byt s 9 0 D beg s 9 0 D x s 9 0 *--------------------------------------------------------------------- * Scambia parametri. C *entry plist * Riceve i dati impaccati allineati a sinistra in un alfanumerico. C parm inp 16 * Riceve il numero di cifre contenute nei dati. C parm len 9 0 * Riceve il numero di decimali contenuti nei dati. C parm dec 9 0 * Restituisce il numero contenuto nei dati * in una stringa composta dalle seguenti parti: * Segno : se negativo, il carattere "-"; altrimenti assente. * Interi: le cifre significative della parte intera. * Se sono presenti decimali * Virgola: il carattere ",". * Decimali: tutte le cifre della parte decimale. C parm out 32 * Pulisce i parametri di ritorno. C clear out * Pulisce l'impaccato intermedio, coincidente con un alfa. C clear pak * Calcola la lunghezza dei dati in byte. C eval byt=(len+2)/2 * Calcola la partenza dei dati nell'alfa intermedio. C eval beg=16+1-byt * Trascrive i dati dall'input all'alfa intermedio. C eval %subst(paka:beg:byt)=%subst(inp:1:byt) * Annota il segno. C pak iflt *zero C movel(p) '-' sgn 1 C else C clear sgn C endif * Trascrive l'impaccato intermedio nello zonato intermedio. C z-add pak znd * Assicura il segno positivo nello zonato intermedio. C mllzo 0 znd * Calcola l'ampiezza dell'area di sostituzione degli zeri. C eval zer=30-1-dec * Sostituisce con blank gli zeri non significativi. C do zer x C if %subst(znda:x:1)<>*zero C leave C endif C eval %subst(znda:x:1)=*blank C enddo * Se sono presenti decimali. C dec ifgt *zero * Raduna in emissione segno, interi, virgola e decimali. C eval out=%trim(%trim(sgn ) + C %trim(%subst(znda:1:zer+1)) + C ',' + C %trim(%subst(znda:zer+2 )) ) * Se non sono presenti decimali. C else * Raduna in emissione segno e interi. C eval out=%trim(%trim(sgn) + %trim(znda)) * Se non sono presenti decimali. C endif * Ritorna. C return //ENDSRC /*---------------------------------------------------------------------*/ //DATA FILE(JCVPNPC) FILETYPE(*SRC) ENDCHAR('//ENDSRC') /TITLE Conversion. PackNbrToPackChar * Claudio Neroni 26/11/2000 Creato. * Trasforma un campo carattere di lunghezza variabile da 1 a 16 * (destinato a contenere un impaccato di lunghezza da 1 a 30 cifre) * in un campo carattere di lunghezza identica al datore e con * il medesimo contenuto. * Il palleggio del valore del campo permette al cl chiamante * di ridefinire come carattere una variabile impaccata. * Nato per trasformare una variabile cl impaccata * in una variabile carattere da esibire come campo numerico * nei dati per i messaggi. * * Scambia parametri. C *entry plist * Riceve la stringa di dati. C parm inp 16 * Restituisce la parte di stringa richiesta. C parm out 16 * Riceve il numero di caratteri da manipolare. * La lunghezza non è della misura che basterebbe (3 di cui 0) * ma della lunghezza di default delle costanti numeriche cl * per favorire la chiamata da parte del Control Language. C parm len15 15 5 * Trascrive il numero di caratteri in una misura impiegabile. C z-add len15 len 3 0 * Trascrive l'input nell'output per la lunghezza richiesta. C eval %subst(out:1:len)=%subst(inp:1:len) * Ritorna. C return //ENDSRC //ENDBCHJOB