Cómo usar una subrutina personalizada: La subrutina MTHNAM

En esta sección:

Este tema trata la subrutina MTHNAM a modo de ejemplo. La subrutina MTHNAM convierte un número que representa un mes en su nombre completo. La subrutina se procesa de la siguiente forma:

  1. Recibe el argumento de entrada de una solicitud, en forma de número de doble precisión.
  2. Añade .000001 al número para compensar los errores de redondeo. Es posible que se produzcan errores de redondeo, ya que los números de punto flotante son aproximaciones y el último dígito significativo puede no ser exacto.
  3. Mueve el número a un campo de número entero.
  4. Si el número es menor que uno o mayor que 12, se convierte en un 13.
  5. Define una lista con los nombres de los meses y un mensaje de error para el número 13.
  6. Establece el índice de la lista en un número igual al del campo de número entero. Después, coloca el elemento correspondiente de la matriz en el argumento de salida. Si el número es 13, el argumento incluye el mensaje de error.
  7. Devuelve un resultado en forma de campo de salida.

Principio de página

x
Cómo escribir la subrutina MTHNAM

Referencia:

La subrutina MTHNAM puede escribirse en FORTRAN, COBOL, PL/I, BAL Assembler o C.



x
Referencia: Subrutina MTHNAM escrita en FORTRAN

Ésta es una versión FORTRAN de la subrutina MTHNAM, donde:

MTH

Es el número de doble precisión en el argumento de entrada.

MONTH

Es el nombre del mes. Puesto que la cadena de caracteres 'September' tiene nueve letras, MONTH es una matriz de tres elementos. La subrutina pasa los tres elementos de vuelta a su aplicación, que los concatena en un campo.

A

Es una matriz de 13 por tres, bidimensional con los nombres de los meses. Los tres últimos elementos contienen el mensaje de error.

IMTH

Es el número entero que representa el mes.

La subrutina es:

  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
Referencia: Subrutina MTHNAM escrita en COBOL

Ésta es una versión COBOL de la subrutina MTHNAM, donde:

MONTH-TABLE

Es un campo que contiene los nombres de los meses y el mensaje de error.

MLINE

Es una matriz de 13 elementos que redefine el campo MONTH-TABLE. Cada elemento (llamado A) contiene el nombre de un mes; el último contiene el mensaje de error.

A

Es un elemento de la matriz MLINE.

IX

En un campo de número entero que indexa MLINE.

IMTH

Es el número entero que representa el mes.

MTH

Es el número de doble precisión en el argumento de entrada.

MONTH

Es el nombre del mes correspondiente al número entero en IMTH.

La subrutina es:

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
Referencia: Subrutina MTHNAM escrita en PL/I

Ésta es una versión PL/I de la subrutina MTHNAM, donde:

MTHNUM

Es el número de doble precisión en el argumento de entrada.

FULLMTH

Es el nombre del mes correspondiente al número entero en MONTHNUM.

MONTHNUM

Es el número entero que representa el mes.

MONTH_TABLE

Es una matriz de 13 elementos con los nombres de los meses. El último elemento contiene el mensaje de error.

La subrutina es:

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
Referencia: Subrutina MTHNAM escrita en BAL Assembler

Ésta es una versión BAL Assembler de la subrutina MTHNAM, donde:

* ===================================================================== 
*                                                                       
*   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
Referencia: Subrutina MTHNAM escrita en C

Ésta es una versión C Assembler de la subrutina 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];
}

Principio de página

x
Cómo llamar a la subrutina MTHNAM desde una solicitud

Puede llamar a la subrutina MTHNAM desde una solicitud de informe.



Ejemplo: Cómo llamar a la subrutina MTHNAM

El comando DEFINE extrae la porción correspondiente al mes de la fecha de pago. A continuación, la subrutina MTHNAM la convierte al nombre completo del mes, que queda almacenado en el campo PAY_MONTH. La solicitud de informe imprime el sueldo mensual de 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

La salida es:

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

Information Builders