Uso di una subroutine personalizzata: Subroutine MTHNAM

In questa sezione:

Questo argomento discute la subroutine MTHNAM come esempio. La subroutine MTHNAM converte un numero rappresentante un mese nel nome completo di quel mese. La subroutine elabora come segue:

  1. Riceve l'argomento di immissione dalla richiesta come un numero di precisione-doppia.
  2. Aggiunge .000001 al numero che compensa per gli errori di arrotondamento. Gli errori di arrotondamento possono avvenire, poiché i numeri punto-mobile sono approssimazioni e potrebbero essere inaccurati nell'ultima cifra significativa.
  3. Sposta il numero in un campo intero.
  4. Se il numero è inferiore a uno o maggiore di 12, il numero diventa 13.
  5. Definisce un elenco contenente i nomi dei mesi ed un messaggio di errore per il numero 13.
  6. Imposta l'indice dell'elenco uguale al numero nel campo intero. Quindi, posiziona l'elemento matrice corrispondente nell'argomento di emissione. Se il numero è 13, l'argomento contiene il messaggio di errore.
  7. Restituisce il risultato come campo di emissione.

Inizio pagina

x
Scrittura della subroutine MTHNAM

Riferimento:

È possibile sovrascrivere la subroutine MTHNAM in FORTRAN, COBOL, PL/I, BAL Assembler e C.



x
Riferimento: Subroutine MTHNAM scritta in FORTRAN

Si tratta della versione FORTRAN della suboroutine MTHNAM dove:

MTH

Il numero di precisione doppia nell'argomento di emissione.

MONTH

Nome del mese. Poiché la stringa di carattere 'September' contiene nove lettere, MONTH è una matrice di tre elementi. La subroutine inoltra i tre elementi indietro alla propria applicazione, che li concatena in un campo.

A

Una matrice bidimensionale, 13 per 3, contenente i nomi dei mesi. Gli ultimi tre elementi contengono un messaggio di errore.

IMTH

Il valore intero rappresentante il mese.

La subroutine è:

  SUBROUTINE MTHNAM (MTH,MONTH)
  REAL*8     MTH
  INTEGER*4  MONTH(3),A(13,3),IMTH
  DATA
 +     A( 1,1)/'JANU'/, A( 1,2)/'ARY '/, A( 1,3)/'    '/,
 +     A( 2,1)/'FEBR'/, A( 2,2)/'UARY'/, A( 2,3)/'    '/,
 +     A( 3,1)/'MARC'/, A( 3,2)/'H   '/, A( 3,3)/'    '/,
 +     A( 4,1)/'APRI'/, A( 4,2)/'L   '/, A( 4,3)/'    '/,
 +     A( 5,1)/'MAY '/, A( 5,2)/'    '/, A( 5,3)/'    '/,
 +     A( 6,1)/'JUNE'/, A( 6,2)/'    '/, A( 6,3)/'    '/,
 +     A( 7,1)/'JULY'/, A( 7,2)/'    '/, A( 7,3)/'    '/,
 +     A( 8,1)/'AUGU'/, A( 8,2)/'ST  '/, A( 8,3)/'    '/,
 +     A( 9,1)/'SEPT'/, A( 9,2)/'EMBE'/, A( 9,3)/'R   '/,
 +     A(10,1)/'OCTO'/, A(10,2)/'BER '/, A(10,3)/'    '/,
 +     A(11,1)/'NOVE'/, A(11,2)/'MBER'/, A(11,3)/'    '/,
 +     A(12,1)/'DECE'/, A(12,2)/'MBER'/, A(12,3)/'    '/,
 +     A(13,1)/'**ER'/, A(13,2)/'ROR*'/, A(13,3)/'*   '/ 
  IMTH=MTH+0.000001 
  IF (IMTH .LT. 1 .OR. IMTH .GT. 12) IMTH=13
  DO 1 I=1,3
1 MONTH(I)=A(IMTH,I)
  RETURN
  END


x
Riferimento: Subroutine MTHNAM scritta in COBOL

Si tratta della versione COBOL della subroutine MTHNAM dove:

MONTH-TABLE

Un campo contenente i nomi dei mesi e il messaggio di errore.

MLINE

Una matrice di 13 elementi che ridefinisce il campo MONTH-TABLE. Ogni elemento (chiamato A) contiene il nome di un mese; l'ultimo elemento contiene il messaggio di errore.

A

Un elemento nella matrice MLINE.

IX

Un campo intero che indicizza MLINE.

IMTH

Il valore intero rappresentante il mese.

MTH

Il numero di precisione doppia nell'argomento di emissione.

MONTH

Il nome del mese corrispondente al valore intero in IMTH.

La subroutine è:

IDENTIFICATION DIVISION.
PROGRAM-ID. MTHNAM.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SOURCE-COMPUTER. IBM-370.
OBJECT-COMPUTER. IBM-370.
DATA DIVISION.
WORKING-STORAGE SECTION.
   01 MONTH-TABLE.
     05 FILLER PIC X(9) VALUE 'JANUARY  '.
     05 FILLER PIC X(9) VALUE 'FEBRUARY '.
     05 FILLER PIC X(9) VALUE 'MARCH    '.
     05 FILLER PIC X(9) VALUE 'APRIL    '.
     05 FILLER PIC X(9) VALUE 'MAY      '.
     05 FILLER PIC X(9) VALUE 'JUNE     '.
     05 FILLER PIC X(9) VALUE 'JULY     '.
     05 FILLER PIC X(9) VALUE 'AUGUST   '.
     05 FILLER PIC X(9) VALUE 'SEPTEMBER'.
     05 FILLER PIC X(9) VALUE 'OCTOBER  '.
     05 FILLER PIC X(9) VALUE 'NOVEMBER '.
     05 FILLER PIC X(9) VALUE 'DECEMBER '.
     05 FILLER PIC X(9) VALUE '**ERROR**'.
   01  MLIST REDEFINES MONTH-TABLE.
     05  MLINE OCCURS 13 TIMES INDEXED BY IX.
         10 A  PIC X(9).
   01  IMTH    PIC S9(5) COMP.
LINKAGE SECTION.
   01  MTH     COMP-2.
   01  MONTH   PIC X(9).
PROCEDURE DIVISION USING MTH, MONTH.
BEG-1.
      ADD 0.000001 TO MTH.
      MOVE MTH TO IMTH.
      IF IMTH < +1 OR > 12
        SET IX TO +13
      ELSE
        SET IX TO IMTH.
      MOVE A (IX) TO MONTH.
      GOBACK.


x
Riferimento: Subroutine MTHNAM scritta in PL/I

Si tratta della versione PL/I della subroutine MTHNAM dove:

MTHNUM

Il numero di precisione doppia nell'argomento di emissione.

FULLMTH

Il nome del mese corrispondente al valore intero in MONTHNUM.

MONTHNUM

Il valore intero rappresentante il mese.

MONTH_TABLE

Una matrice di 13 elementi contenente i nomi dei mesi. L'ultimo elemento contiene il messaggio di errore.

La subroutine è:

MTHNAM:   PROC(MTHNUM,FULLMTH) OPTIONS(COBOL);
DECLARE  MTHNUM  DECIMAL FLOAT (16) ;
DECLARE  FULLMTH CHARACTER (9) ;
DECLARE  MONTHNUM FIXED BIN (15,0)  STATIC ;
DECLARE  MONTH_TABLE(13) CHARACTER (9)   STATIC
                        INIT  ('JANUARY',
                               'FEBRUARY',
                               'MARCH',
                               'APRIL',
                               'MAY',
                               'JUNE',
                               'JULY',
                               'AUGUST',
                               'SEPTEMBER',
                               'OCTOBER',
                               'NOVEMBER',
                               'DECEMBER',
                               '**ERROR**') ;
  MONTHNUM = MTHNUM + 0.00001 ;
  IF MONTHNUM < 1 |  MONTHNUM > 12 THEN
           MONTHNUM = 13 ; FULLMTH = MONTH_TABLE(MONTHNUM) ;
RETURN;
END MTHNAM;


x
Riferimento: Subroutine MTHNAM scritta in BAL Assembler

Si tratta della versione BAL Assembler della subroutine MTHNAM:

* ===================================================================== 
*                                                                       
*   A SIMPLE MAIN ASSEMBLE ROUTINE THAT CALLS THE LE CALLABLE SERVICES  
*                                                                       
* ===================================================================== 
MTHNAM   CEEENTRY PPA=MAINPPA,AUTO=WORKSIZE,MAIN=NO                     
         USING WORKAREA,13                                              
*                                                                       
         L        3,0(0,1)          LOAD ADDR OF FIRST ARG  INTO R3     
         LD       4,=D'0.0'         CLEAR OUT FPR4 AND FPR5             
         LE       6,0(0,3)          FP NUMBER IN FPR6                   
         LPER     4,6               ABS VALUE IN FPR4                 
         AW       4,=D'0.00001'     ADD ROUNDING CONSTANT             
         AW       4,DZERO           SHIFT OUT FRACTION                
         STD      4,FPNUM           MOVE TO MEMORY                    
         L        2,FPNUM+4         INTEGER PART IN R2                
         TM       0(3),B'10000000'  CHECK SIGN OF ORIGINAL NO         
          BNO      POS              BRANCH IF POSITIVE                
          LCR      2,2              COMPLEMENT IF NEGATIVE            
 *                                                                     
 POS      LR       3,2              COPY MONTH NUMBER INTO R3         
          C        2,=F'0'          IS IT ZERO OR LESS?               
          BNP      INVALID          YES. SO INVALID                   
          C        2,=F'12'         IS IT GREATER THAN 12?            
          BNP      VALID            NO. SO VALID                      
 INVALID  LA       3,13(0,0)        SET R3 TO POINT TO ITEM 13 (ERROR)
 *                                                                     
 VALID    SR       2,2               CLEAR OUT R2                      
          M        2,=F'9'           MULTIPLY BY SHIFT IN TABLE        
 *                                                                     
          LA       6,MTH(3)          GET ADDR OF ITEM IN R6            
          L        4,4(0,1)          GET ADDR OF SECOND ARG IN R4      
          MVC      0(9,4),0(6)       MOVE IN TEXT                      
*                                                                       
*   TERMINATE THE CEE ENVIRONMENT AND RETURN TO THE CALLER              
*                                                                       
         CEETERM  RC=0                                                  
* ====================================================================  
*              CONSTANTS                                                
* ====================================================================  
         DS     0D                  ALIGNMENT                           
FPNUM    DS     D                   FLOATING POINT NUMBER               
DZERO    DC     X'4E00000000000000' SHIFT CONSTANT                      
MTH      DC     CL9'DUMMYITEM'      MONTH TABLE                         
         DC     CL9'JANUARY'                                            
         DC     CL9'FEBRUARY'                                           
         DC     CL9'MARCH'                                              
         DC     CL9'APRIL'                                              
         DC     CL9'MAY'                                                
         DC     CL9'JUNE'                                               
         DC     CL9'JULY'                                               
         DC     CL9'AUGUST'                                             
         DC     CL9'SEPTEMBER'                                          
         DC     CL9'OCTOBER'                                            
         DC     CL9'NOVEMBER'                                          
         DC     CL9'DECEMBER'                                          
         DC     CL9'**ERROR**'                                         
*                                                                      
MAINPPA  CEEPPA                   CONSTANTS DESCRIBING THE CODE BLOCK  
* ==================================================================== 
*        THE WORKAREA AND DSA                                          
* ==================================================================== 
WORKAREA DSECT                                                         
         ORG    *+CEEDSASZ        LEAVE SPACE FOR THE DSA FIXED PART   
PLIST    DS     0D                                                     
PARM1    DS     A                                                      
PARM2    DS     A                                                      
PARM3    DS     A                                                      
PARM4    DS     A                                                      
PARM5    DS     A                                                      
*                                                                      
FOCPARM1 DS     F                 SAVE FIRST PARAMETER PASSED          
FOCPARM2 DS     F                 SAVE SECOND PARAMETER PASSED         
*                                                                      
         DS     0D                                                     
WORKSIZE EQU    *-WORKAREA                                             
         CEEDSA                   MAPPING OF THE DYNAMIC SAVE AREA     
         CEECAA                   MAPPING OF THE COMMON ANCHOR AREA  
*                                                                    
          END   MTHNAM             NOMINATE MTHNAM AS THE ENTRY POINT 
/*                                                                   


x
Riferimento: Subroutine MTHNAM scritta in C

Si tratta della versione di linguaggio C della subroutine MTHNAM:

void mthnam(double *,char *);
void mthnam(mth,month)
double *mth;
char *month;
{
char *nmonth[13] = {"January  ",
                    "February ",
                    "March    ",
                    "April    ",
                    "May      ",
                    "June     ",
                    "July     ",
                    "August   ",
                    "September",
                    "October  ",
                    "November ",
                    "December ",
                    "**Error**"};
int imth, loop;
imth = *mth + .00001;
imth = (imth < 1 || imth > 12 ? 13 : imth);
for (loop=0;loop < 9;loop++)
 month[loop] = nmonth[imth-1][loop];
}

Inizio pagina

x
Chiamata della subroutine MTHNAM da una richiesta

È possibile chiamare la subroutine MTHNAM da una richiesta di prospetto.



Esempio: Chiamata della subroutine MTHNAM

Il comando DEFINE estrae la parte del mese della data di retribuzione. La subroutine MTHNAM quindi la converte nel nome completo del mese e memorizza il nome nel campo PAY_MONTH. La richiesta di prospetto stampa la restribuzione mensile di Alfred Stevens.

DEFINE FILE EMPLOYEE
MONTH_NUM/M = PAY_DATE;
PAY_MONTH/A12 = MTHNAM (MONTH_NUM, PAY_MONTH);
END
TABLE FILE EMPLOYEE
PRINT PAY_MONTH GROSS
BY EMP_ID BY FIRST NAME BY LAST_NAME
BY PAY_DATE
IF LN IS STEVENS
END

L'emissione è:

EMP_ID     FIRST NAME   LAST_NAME   PAY_DATE   PAY_MONTH   GROSS
-------    ----------   ---------   --------   ---------   -------
071382660  ALFRED       STEVENS     81/11/30   NOVEMBER    $833.33
                                    81/12/31   DECEMBER    $833.33
                                    82/01/29   JANUARY     $916.67
                                    82/02/26   FEBRUARY    $916.67
                                    82/03/31   MARCH       $916.67
                                    82/04/30   APRIL       $916.67
                                    82/05/28   MAY         $916.67
                                    82/06/30   JUNE        $916.67
                                    82/07/30   JULY        $916.67
                                    82/08/31   AUGUST      $916.67

WebFOCUS