In questa sezione: Come: Riferimento: |
Una richiesta è in grado di chiamare una subroutine codificata in REXX. Queste subroutine, anche chiamate macro FUSREXX, forniscono una opzione 4GL alle lingue supportate per le subroutine scritte dagli utenti.
Le subroutine REXX sono supportate nell'ambiente z/OS. Una subroutine REXX contiene il codice di origine REXX. Il codice REXX compilato non è supportato.
Una subroutine REXX contiene il codice di origine REXX. Il codice REXX compilato non è supportato.
Le subroutine REXX non sono necessariamente le stesse in tutti gli ambienti operativi. Quindi, alcuni esempi potrebbero usare funzioni REXX che non sono disponibili nel proprio ambiente.
A causa dei requisiti CPU, l'uso delle subroutine REXX in lavori di grande produzione dovrebbe essere attentamente monitorato.
Per ulteriori informazioni sulle subroutine REXX, consultare la propria documentazione REXX.
Per memorizzare una subroutine REXX, DDNAME FUSREXX deve essere allocato in iun PDS. Questa libreria viene ricercara prima di altre libreria z/OS.
L'ordine di ricerca per una subroutine REXX è:
DEFINE FILE filename fieldname/{An|In} = subname(inlen1, inparm1, ..., outlen, outparm); END
oppure
{DEFINE|COMPUTE} fieldname/{An|In} = subname(inlen1, inparm1, ..., outlen, outparm);
oppure
-SET &var = subname(inlen1, inparm1, ..., outlen, outparm);
dove:
Campo che contiene il risultato.
Il formato del campo che contiene il risultato.
Nome della subroutine REXX.
I parametri di immissione. Ogni parametro consiste nella lunghezza e nel valore di un parametro alfanumerico. È possibile fornire il valore, il nome del campo alfanumerico che contiene il valore o un'espressione che restituisce il valore. Si supportano fino a 13 coppie di parametri di immissione. Ogni valore di parametro può essere lungo fino a 256 byte.
Dialogue Manager converte argomenti numerici in formato precisione-doppia punto-mobile. Quindi, è solo possibile inoltrare parametri di immissione alfanumerici ad una subroutine REXX, usando -SET.
La coppia dei parametri di immissione, consistenti in una lunghezza ed un risultato. In molti casi, il risultato dovrebbe essere alfanumerico, ma si supportano anche i risultati interi. Il risultato può essere una variabile campo o Dialogue Manager che contiene il valore, o il formato del valore racchiuso tra virgolette singole. Il valore restituito può essere lungo da un minimo di un byte ad un massimo di (per un valore alfanumerico) 256 byte.
Nota: Se il valore restituito è intero, outlen deve essere 4, poiché WebFOCUS riserva quattro byte per campi interi.
Il nome della variabile Dialogue Manager che contiene il risultato.
La subroutine REXX DOW restituisce il giorno della settimana corrispondente alla data di assunzione del dipendente. La routine contiene una coppia di parametri di immissione e una coppia del campo di ritorno.
DEFINE FILE EMPLOYEE 1. AHDT/A6 = EDIT(HIRE_DATE) ; 2. DAY_OF_WEEK/A9 WITH AHDT = DOW(6, AHDT, 9, DAY_OF_WEEK); END
TABLE FILE EMPLOYEE PRINT LAST_NAME HIRE_DATE DAY_OF_WEEK END
La procedura elabora come segue:
L'emissione è:
LAST_NAME HIRE_DATE DAY_OF_WEEK --------- --------- ----------- STEVENS 80/06/02 Monday SMITH 81/07/01 Wednesday JONES 82/05/01 Saturday SMITH 82/01/04 Monday BANNING 82/08/01 Sunday IRVING 82/01/04 Monday ROMANS 82/07/01 Thursday MCCOY 81/07/01 Wednesday BLACKWOOD 82/04/01 Thursday MCKNIGHT 82/02/02 Tuesday GREENSPAN 82/04/01 Thursday CROSS 81/11/02 Monday
La subroutine REXX appare di seguito. Legge la data di immissione, la riformatta nel formato MM/DD/YY e restituisce il giorno della settimana usando una chiamata REXX DATE.
/* DOW routine. Return WEEKDAY from YYMMDD format date */ Arg ymd . Return Date('W',Translate('34/56/12',ymd,'123456'),'U')
La subroutine REXX INTEREST ha quattro parametri di immissione.
DEFINE FILE EMPLOYEE 1. AHDT/A6 = EDIT(HIRE_DATE); 2. ACSAL/A12 = EDIT(CURR_SAL); 3. DCSAL/D12.2 = CURR_SAL; 4. PV/A12 = INTEREST(6, AHDT, 6, '&YMD', 3, '6.5', 12, ACSAL, 12, PV); END TABLE FILE EMPLOYEE PRINT LAST_NAME FIRST_NAME HIRE_DATE DCSAL PV END
La procedura elabora come segue:
Il terzo campo di immissione è un valore di carattere di 6.5, ovvero lungo tre byte per includere il punto decimale nella stringa di caratteri.
Il quarto campo di immissione è lungo 12 byte. Questo campo inoltra il campo di caratteri ACSAL.
Il campo di ritorno è lungo fino a 12 byte e si chiama PV.
L'emissione è:
LAST_NAME FIRST_NAME HIRE_DATE DCSAL PV --------- ---------- --------- ----- -- STEVENS ALFRED 80/06/02 11,000.00 14055.14 SMITH MARY 81/07/01 13,200.00 15939.99 JONES DIANE 82/05/01 18,480.00 21315.54 SMITH RICHARD 82/01/04 9,500.00 11155.60 BANNING JOHN 82/08/01 29,700.00 33770.53 IRVING JOAN 82/01/04 26,862.00 31543.35 ROMANS ANTHONY 82/07/01 21,120.00 24131.19 MCCOY JOHN 81/07/01 18,480.00 22315.99 BLACKWOOD ROSEMARIE 82/04/01 21,780.00 25238.25 MCKNIGHT ROGER 82/02/02 16,100.00 18822.66 GREENSPAN MARY 82/04/01 9,000.00 10429.03 CROSS BARBARA 81/11/02 27,062.00 32081.82
La subroutine REXX appare di seguito. Il comando del formato REXX si usa per formattare il valore di ritorno.
/* Simple INTEREST program. dates are yymmdd format */ Arg start_date,now_date,percent,open_balance, . begin = Date('B',Translate('34/56/12',start_date,'123456'),'U') stop = Date('B',Translate('34/56/12',now_date,'123456'),'U') valnow = open_balance * (((stop - begin) * (percent / 100)) / 365) Return Format(valnow,9,2)
Una subroutine REXX è in grado di accettare più token in un parametro. La seguente procedura inoltra le informazioni dei dipendenti (PAY_DATE e MO_PAY) come token separati nel primo parametro. Inoltra tre parametri di immissione e un campo di ritorno.
DEFINE FILE EMPLOYEE 1. COMPID/A256 = FN | ' ' | LN | ' ' | DPT | ' ' | EID ; 2. APD/A6 = EDIT(PAY_DATE); 3. APAY/A12 = EDIT(MO_PAY); 4. OK4RAISE/A1 = OK4RAISE(256, COMPID, 6, APD, 12, APAY, 1, OK4RAISE); END TABLE FILE EMPLOYEE PRINT EMP_ID FIRST_NAME LAST_NAME DEPARTMENT IF OK4RAISE EQ '1' END
La procedura elabora come segue:
L'emissione è:
EMP_ID FIRST_NAME LAST_NAME DEPARTMENT ------ ---------- --------- ---------- 071382660 ALFRED STEVENS PRODUCTION
La subroutine REXX appare di seguito. Le virgole separano i parametri FUSREXX. Il comando ARG specifica più nomi di variabili prima della prima virgola e, quindi, separa il primo parametro FUSREXX in variabili REXX separate, usando spazi come delimitatori tra le variabili.
/* OK4RAISE routine. Parse separate tokens in the 1st parm, */ /* then more parms */ Arg fname lname dept empid, pay_date, gross_pay, . If dept = 'PRODUCTION' & pay_date < '820000' Then retvalue = '1' Else retvalue = '0' Return retvalue
Le subroutine REXX dovrebbero usare la subroutine REXX RETURN nei dati di ritorno. REX EDIT è accettabile, ma di solito usato per terminare un EXEC, non una FUNCTION.
Correct
/* Some FUSREXX function */
Arg input
some rexx process ...
Return data_to_WebFOCUS
|
Not as Clear /* Another FUSREXX function */ Arg input some rexx process ... Exit 0 |
Una subroutine REXX richiede dati di immissione in formato alfanumerico. La maggior parte dell'emissione è restituita in formato alfanumerico. Se il formato di un argomento di immissione è numerico, usare le funzioni EDIT o FTOA per convertire l'argomento in alfanumerico. È quindi possibile usare le funzioni EDIT o ATODBL per riconvertire l'emissione in valore numerico.
La lunghezza di emissione nella chiamata della subroutine deve essere quattro. Le variabili di carattere non possono eccedere 256 byte. Questo limite si applica inoltre alle subroutine REXX. Le routine FUSREXX restituiscono dati di lunghezza variabile. Per questo motivo, è necessario fornire la lunghezza degli argomenti di immissione e la lunghezza massima dei dati di emissione.
Una subroutine REXX non richiede nessun parametro di immissione, ma richiede un parametro di ritorno, che deve restituire almeno un byte di dati. Una subroutine REXX potrebbe non necessitare l'immissione, come una funzione che restituisce USERID.
Una subroutine REXX non supporta argomenti di immissione data WebFOCUS. Quando si lavora non date, è possibile eseguire uno dei seguenti:
I campi data contengono il numero intero dei giorni dalla data di base 12/31/1900. REXX ha una funzione data in grado di accettare e restituire vari tipi di formati data, incluso uno chiamato formato Base ('B') che contiene il numero dei giorni dalla data base REXX 01/01/0001. È necessario tener conto della differenza, nel numero di giorni, tra la data base WebFOCUS e la data base REXX e convertire il risultato in valore intero.
La subroutine NUMCNT restituisce il numero di copie di ogni film classico in formato alfanumerico. Inoltra un parametro di immissione e un campo di ritorno.
TABLE FILE MOVIES PRINT TITLE AND COMPUTE 1. ACOPIES/A3 = EDIT(COPIES); AS 'COPIES' AND COMPUTE 2. TXTCOPIES/A8 = NUMCNT(3, ACOPIES, 8, TXTCOPIES); WHERE CATEGORY EQ 'CLASSIC' END
La procedura elabora come segue:
L'emissione è:
TITLE COPIES TXTCOPIES ----- ------ --------- EAST OF EDEN 001 One CITIZEN KANE 003 Three CYRANO DE BERGERAC 001 One MARTY 001 One MALTESE FALCON, THE 002 Two GONE WITH THE WIND 003 Three ON THE WATERFRONT 002 Two MUTINY ON THE BOUNTY 002 Two PHILADELPHIA STORY, THE 002 Two CAT ON A HOT TIN ROOF 002 Two CASABLANCA 002 Two
La subroutine è:
/* NUMCNT routine. */ /* Pass a number from 0 to 10 and return a character value */ Arg numbr . data = 'Zero One Two Three Four Five Six Seven Eight Nine Ten' numbr = numbr + 1 /* so 0 equals 1 element in array */ Return Word(data,numbr)
Nel seguente esempio, la subroutine NUMDAYS ricerca il numero di giorni tra HIRE_DATE e DAT_INC e restituisce in formato intero.
DEFINE FILE EMPLOYEE 1. AHDT/A6 = EDIT(HIRE_DATE); 2. ADI/A6 = EDIT(DAT_INC); 3. BETWEEN/I6 = NUMDAYS(6, AHDT, 6, ADI, 4, 'I6') ; END TABLE FILE EMPLOYEE PRINT LAST_NAME HIRE_DATE DAT_INC BETWEEN IF BETWEEN NE 0 END
La procedura elabora come segue:
L'emissione è:
LAST_NAME HIRE_DATE DAT_INC BETWEEN --------- --------- ------- ------- STEVENS 80/06/02 82/01/01 578 STEVENS 80/06/02 81/01/01 213 SMITH 81/07/01 82/01/01 184 JONES 82/05/01 82/06/01 31 SMITH 82/01/04 82/05/14 130 IRVING 82/01/04 82/05/14 130 MCCOY 81/07/01 82/01/01 184 MCKNIGHT 82/02/02 82/05/14 101 GREENSPAN 82/04/01 82/06/11 71 CROSS 81/11/02 82/04/09 158
La subroutine appare di seguito. Il valore di ritorno viene convertito da carattere REXX a HEX e formattato con lunghezza pari a quattro byte.
/* NUMDAYS routine. */ /* Return number of days between 2 dates in yymmdd format */ /* The value returned will be in hex format */ Arg first,second . base1 = Date('B',Translate('34/56/12',first,'123456'),'U') base2 = Date('B',Translate('34/56/12',second,'123456'),'U') Return D2C(base2 - base1,4)
Nel seguente esempio, si usa una data, inoltrando un campo alfanumerico con le opzioni data alla subroutine DATEREX1. DATEREX1 prende due argomenti di immissione: una data alfanumerica in formato A8YYMD e un numero di giorni in formato caratteri. Restituisce una data smart in formato YYMD che rappresenta la data di immissione, oltre al numero dei giorni. Il formato A8YYMD corrisponde al formato standard REXX ('S').
Il numero 693959 rappresenta la differenza, in numero di giorni, tra la data base WebFOCUS e la data base REXX:
/* REXX DATEREX1 routine. Add indate (format A8YYMD) to days */ Arg indate, days . Return D2C(Date('B',indate,'S')+ days - 693959, 4)
La seguente richiesta usa il macro DATEREX1 per calcolare la data in 365 giorni dalla data di assunzione di ogni dipendente. Gli argomenti di immissione sono la data di assunzione e il numero di giorni da aggiungere. Poiché HIRE_DATE è in formato I6YMD, è necessario convertirlo in A8YYMD prima di inoltrarlo al macro:
TABLE FILE EMPLOYEE PRINT LAST_NAME FIRST_NAME HIRE_DATE AND COMPUTE ADATE/YYMD = HIRE_DATE; NOPRINT AND COMPUTE INDATE/A8YYMD= ADATE; NOPRINT AND COMPUTE NEXT_DATE/YYMD = DATEREX1(8, INDATE, 3, '365', 4, NEXT_DATE); BY LAST_NAME NOPRINT END
L'emissione è:
LAST_NAME FIRST_NAME HIRE_DATE NEXT_DATE --------- ---------- --------- --------- BANNING JOHN 82/08/01 1983/08/01 BLACKWOOD ROSEMARIE 82/04/01 1983/04/01 CROSS BARBARA 81/11/02 1982/11/02 GREENSPAN MARY 82/04/01 1983/04/01 IRVING JOAN 82/01/04 1983/01/04 JONES DIANE 82/05/01 1983/05/01 MCCOY JOHN 81/07/01 1982/07/01 MCKNIGHT ROGER 82/02/02 1983/02/02 ROMANS ANTHONY 82/07/01 1983/07/01 SMITH MARY 81/07/01 1982/07/01 SMITH RICHARD 82/01/04 1983/01/04 STEVENS ALFRED 80/06/02 1981/06/02
Nel seguente esempio, si inoltra una data alla subroutine come data smart convertita in formato alfanumerico. La subroutine DATEREX2 prende due argomenti di immissione: un numero alfanumerico di giorni che rappresenta una data smart e un numero di giorni da aggiungere. Restituisce una data smart in formato YYMD che rappresenta la data di immissione, oltre al numero dei giorni. Sia la data di immissione che si emissione sono in formato ('B') data base REXX.
Il numero 693959 rappresenta la differenza, in numero di giorni, tra la data base WebFOCUS e la data base REXX:
/* REXX DATEREX2 routine. Add indate (original format YYMD) to days */ Arg indate, days . Return D2C(Date('B',indate+693959,'B') + days - 693959, 4)
La seguente richiesta usa DATEREXX2 per calcolare la data in 365 giorni dalla data di assunzione di ogni dipendente. Gli argomenti di immissione sono la data di assunzione e il numero di giorni da aggiungere. Poiché HIRE-DATE è in formato I6YMD, è necessario convertirlo in un numero alfanumerico di giorni prima di inoltrarlo al macro:
TABLE FILE EMPLOYEE PRINT LAST_NAME FIRST_NAME HIRE_DATE AND COMPUTE ADATE/YYMD = HIRE_DATE; NOPRINT AND COMPUTE INDATE/A8 = EDIT(ADATE); NOPRINT AND COMPUTE NEXT_DATE/YYMD = DATEREX2(8,INDATE,3,'365',4,NEXT_DATE); BY LAST_NAME NOPRINT END
L'emissione è:
LAST_NAME FIRST_NAME HIRE_DATE NEXT_DATE --------- ---------- --------- --------- BANNING JOHN 82/08/01 1983/08/01 BLACKWOOD ROSEMARIE 82/04/01 1983/04/01 CROSS BARBARA 81/11/02 1982/11/02 GREENSPAN MARY 82/04/01 1983/04/01 IRVING JOAN 82/01/04 1983/01/04 JONES DIANE 82/05/01 1983/05/01 MCCOY JOHN 81/07/01 1982/07/01 MCKNIGHT ROGER 82/02/02 1983/02/02 ROMANS ANTHONY 82/07/01 1983/07/01 SMITH MARY 81/07/01 1982/07/01 SMITH RICHARD 82/01/04 1983/01/04 STEVENS ALFRED 80/06/02 1981/06/02
WebFOCUS |