Subroutine scritte in REXX

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.


Inizio pagina

x
Riferimento: Memorizzazione e ricerca di una subroutine 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 è:

  1. FUSREXX.
  2. Ordine ricerca z/OS standard.

Inizio pagina

x
Sintassi: Come chiamare 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:

fieldname

Campo che contiene il risultato.

An, In

Il formato del campo che contiene il risultato.

subname

Nome della subroutine REXX.

inlen1, inparm1 ...

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.

outlen, outparm

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.

&var

Il nome della variabile Dialogue Manager che contiene il risultato.



Esempio: Restituzione del giorno della settimana

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:

  1. La funzione EDIT converte HIRE_DATE in formato alfanumerico e memorizza il risultato in un campo con il formato A6.
  2. Il risultato è memorizzato nel campo DAY_OF_THE_WEEK, lungo fino a nove byte.

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')


Esempio: Inoltramento di più argomenti ad una subroutine REXX

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:

  1. EDIT converte HIRE_DATE in formato alfanumerico e memorizza il risultato in AHDT.
  2. EDIT converte CURR_SAL in formato alfanumerico e memorizza il risultato in ACSAL.
  3. Si converte CURR_SAL in un campo precisione-doppia punto-mobile che include virgole e si memorizza il risultato in DCSAL.
  4. Il secondo campo di immissione è lungo sei byte. La data viene inoltrata come formato &YMD in YYMMDD della variabile di carattere.

    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)


Esempio: Accettazione di più token in un parametro

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:

  1. COMPID è la concatenazione di vari campi di caratteri inoltrati come primo parametro e memorizzati in un campo con il formato A256. Ognuno dei parametri è un singolo argomento.
  2. EDIT converte PAY_DATE in formato alfanumerico.
  3. EDIT converte MO_DAY in formato alfanuemerico.
  4. OK4RAISE effettua l'esecuzione ed il risultato viene memorizzato in OK4RAISE.

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


x
Formati e Subroutine REXX

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:



Esempio: Restituzione di un risultato in formato alfanumerico

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:

  1. Il campo EDIT converte COPIES in formato alfanumerico e memorizza il risultato in ACOPIES.
  2. Il risultato viene memorizzato in un campo alfanumerico di 8 byte TXTCOPIES.

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)


Esempio: Restituzione di un risultato in formato intero

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:

  1. EDIT converte HIRE_DATE in formato alfanumerico e memorizza il risultato in AHDT.
  2. EDIT converte DAT_INC in formato alfanumerico e memorizza il risultato in ADI.
  3. NUMDAYS ricerca il numero di giorni tra AHDT e ADI e memorizza il risultato in formato intero.

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)


Esempio: Inoltramento di un valore data come campo alfanumerico con opzioni data

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


Esempio: Inoltramento di una data come data convertita in formato alfanumerico

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