Cómo escribir una subrutina

En esta sección:

Puede escribir una subrutina en cualquier lenguaje que sea compatible con las subrutinas. Si quiere poner su subrutina a disposición de otros usuarios, asegúrese de documentar su funcionamiento, argumentos, formatos y el orden en que estos deben aparecer en la llamada a la subrutina.

Al escribir una subrutina es importante que tenga en cuenta sus requisitos y límites. Son las siguientes:

Si escribe un programa llamado INTCOMP, que calcula los fondos en una cuenta de interés simple, el programa leerá un registro, probará la validez de los datos y a continuación, llamará a una subrutina llamada SIMPLE, que calculará los fondos. El programa y la subrutina se almacenan de forma conjunta en el mismo archivo.

El programa y la subrutina mostrados aquí, están escritos en seudocódigo (un método para representar el código informático de manera general):

Begin program INTCOMP.
Execute this loop until end-of-file.
   Read next record, fields: PRINCPAL, DATE_PUT, YRRATE.
   If PRINCPAL is negative or greater than 100,000,
      reject record.
   If DATE_PUT is before January 1, 1975, reject record.
   If YRRATE is negative or greater than 20%, reject record.
   Call subroutine SIMPLE (PRINCPAL, DATE_PUT, YRRATE, TOTAL).
   Print PRINCPAL, YEARRATE, TOTAL.
End of loop.
End of program.
Subroutine SIMPLE (AMOUNT, DATE, RATE, RESULT).
Retrieve today's date from the system.
Let NO_DAYS = Days from DATE until today's date.
Let DAY_RATE = RATE / 365 days in a year.
Let RESULT = AMOUNT * (NO_DAYS * DAY_RATE + 1).
End of subroutine.

Si mueve la subrutina SIMPLE a un archivo independiente del programa principal y lo compila, podrá llamar a la subrutina. La siguiente solicitud de informe muestra la cantidad de dinero acumulada por los empleados de una empresa, si invirtiesen sus salarios en cuentas con un tipo del 12%:

TABLE FILE EMPLOYEE
PRINT LAST_NAME DAT_INC SALARY AND COMPUTE
   INVESTED/D10.2 = SIMPLE(SALARY, DAT_INC, 0.12, INVESTED);
BY EMP_ID
END

Nota: La subrutina está diseñada para devolver sólo la cantidad invertida, no la fecha actual, ya que sólo puede devolver un valor único cada vez que es invocada.


Principio de página

x
Cómo nombrar una subrutina

El nombre de la subrutina puede tener una longitud de hasta ocho caracteres, a menos que el lenguaje que esté usando requiera nombres más cortos. El nombre debe empezar por una letra y puede estar compuesto por una combinación de letras y números. No se permite el uso de caracteres especiales.


Principio de página

x
Cómo crear argumentos

Al crear argumentos para una subrutina, tenga en cuenta las siguientes cuestiones:

Las longitudes de los argumentos de llamada definidos en WebFOCUS, deben coincidir con las de los argumentos correspondientes, definidos en la subrutina.

Cualquier desviación respecto a estas reglas puede causar problemas de funcionamiento en la subrutina. Information Builders le recomienda que modifique la subrutina para que cumpla con las reglas establecidas, y después la vincule por encima de la línea. Para cargar subrutinas por encima de la línea, son necesarias las siguientes opciones de vincular-editar al compilar y almacenar la subrutina:


Principio de página

x
Consideraciones sobre el lenguaje.

Al escribir una subrutina, es importante que tenga en cuenta las siguientes cuestiones:

Lenguaje y memoria. Si escribe una subrutina en un lenguaje que almacena las bibliotecas en la memoria (por ejemplo, FORTRAN o COBOL), se verá reducida la cantidad de memoria disponible para la subrutina.

FORTRAN. TSO es compatible con las operaciones de entrada y salida de FORTRAN.

COBOL. Al escribir una subrutina en COBOL:

PL/I. Al escribir una subrutina en PL/I:

Lenguaje C. Al escribir una subrutina en C:



x
Cómo programar una subrutina

En esta sección:

Tenga en cuenta lo siguiente a la hora de plantear sus requisitos de programación:

Puede añadir flexibilidad a su subrutina utilizando una técnica de programación. Ejemplos de técnicas programación:



x
Cómo ejecutar una subrutina desde un punto de entrada

Normalmente, las subrutinas se ejecutan empezando por la primera declaración. Sin embargo, es posible ejecutar una subrutina empezando por cualquier lugar del código que haya sido designado como punto de entrada. Esto permite que la subrutina use un solo algoritmo para producir distintos resultados. Por ejemplo, la subrutina DOWK calcula el día de la semana en que cae una fecha. Al especificar el nombre de la subrutina DOWK, se obtiene una abreviación del día de 3 letras. Si especifica el nombre de entrada DOWKL, obtendrá el nombre completo. Sin embargo, el cálculo es el mismo.

Cada punto de entrada tiene un nombre. Para ejecutar una subrutina desde un punto de entrada, especifique el nombre del punto de entrada en la llamada de subrutina, en lugar del nombre de ésta. La designación de un punto de entrada depende del lenguaje que se esté utilizando.



x
Sintaxis: Cómo Ejecutar una subrutina desde un punto de entrada
{subroutine|entrypoint}  (input1, input2,...outfield)

donde:

subroutine

Es el nombre de la subrutina.

entrypoint

Es el nombre del punto de entrada desde el que se va a ejecutar la subrutina.

input1, input2,...

Son los argumentos de la subrutina.

outfield

Es el campo que contiene el resultado o el formato del valor de salida, entre comillas simples.

En Dialogue Manager debe especificar el formato. En Maintain debe especificar el nombre del campo.



Ejemplo: Cómo ejecutar una subrutina desde un punto de entrada

La subrutina FTOC, escrita en el siguiente seudocódigo, convierte la temperatura de Fahrenheit a grados centígrados. El punto de entrada FTOK (designado por el comando Entry) establece un indicador que hace que se reste 273 de la temperatura en grados centígrados, para calcular la temperatura Kelvin. La subrutina es:

Subroutine FTOC (FAREN, CENTI).
Let FLAG = 0.
Go to label X.
Entry FTOK (FAREN, CENTI).
Let FLAG = 1.
Label X.
Let CENTI = (5/9) * (FAREN - 32).
If FLAG = 1 then CENTI = CENTI - 273.
Return.
End of subroutine.

Ésta es una forma más corta de escribir la subrutina. Observe que el argumento de salida kelv, listado para el punto de entrada, es diferente del argumento centi listado al principio de la subrutina:

Subroutine FTOC (FAREN, CENTI).
Entry FTOK (FAREN, KELV).
Let CENTI = (5/9) * (FAREN - 32).
KELV = CENTI - 273.
Return.
End of Subroutine.

Para obtener la temperatura en grados centígrados, especifique el nombre de la subrutina FTOC en la llamada. La subrutina se procesa como:

CENTIGRADE/D6.2 = FTOC (TEMPERATURE, CENTIGRADE);

Para obtener la temperatura Kelvin, especifique el nombre de la entrada FTOK en la llamada de subrutina. La subrutina se procesa como:

KELVIN/D6.2 = FTOK (TEMPERATURE, KELVIN);


x
Incluir más de 200 argumentos en una llamada de subrutina

Una subrutina puede especificar un máximo de 200 argumentos, incluido el argumento de salida. Para procesar más de 200 argumentos, la subrutina debe especificar dos o más declaraciones de llamada para pasar los argumentos a la subrutina.

Utilice la siguiente técnica para escribir una subrutina con llamadas múltiples:

  1. Divida la subrutina en segmentos. Cada segmento recibe los argumentos pasados por una llamada de subrutina correspondiente.

    La lista de argumentos, situada al principio de su subrutina, debe representar el mismo número de argumentos en la llamada, incluidos un argumento de número de llamada y un argumento de salida.

    Cada llamada contiene el mismo número de argumentos. Esto se debe a que la lista de argumentos de cada llamada debe corresponderse con la lista situada al principio de la subrutina. Si tiene un número desigual de argumentos, puede procesar algunos de ellos como ficticios. Por ejemplo, si divide 32 argumentos en seis segmentos, cada uno de estos procesa 6 argumentos; el sexto segmento procesa dos argumentos y cuatro argumentos ficticios.

    Es posible que el desarrollador de las subrutinas determine que se necesitan argumentos adicionales.

  2. Incluya una declaración al principio de la subrutina, que lea el número de llamada (primer argumento) y se dirija al segmento correspondiente. Cada segmento se encarga de procesar los argumentos de una llamada. Por ejemplo, el número uno lleva al primer segmento, el dos, al segundo, y así sucesivamente.
  3. Configure cada segmento para que almacene los argumentos recibidos en otras variables (pueden ser procesadas por el último argumento) o acumúlelos en un total actual.

    Finalice cada segmento con un comando que devuelva el control a la solicitud (comando RETURN).

  4. El último segmento devuelve el valor de salida final a la solicitud.

Puede usar la técnica de punto de entrada para escribir subrutinas capaces de procesar más de 200 argumentos. Para más detalles, consulte Cómo ejecutar una subrutina desde un punto de entrada.



x
Sintaxis: Cómo Crear una subrutina con múltiples declaraciones de llamada
								field = subroutine (1, group1, field)
;field = subroutine (2, group2, field);
   .
   .
   .outfield = subroutine (n, groupn, outfield);

donde:

field

Es el nombre del campo que contiene el resultado del segmento o el formato del campo, entre comillas simples. Este campo debe tener el mismo formato que outfield.

No especifique field para la última declaración de llamada; utilice outfield.

subroutine

Es el nombre de la subrutina, de hasta ocho caracteres de longitud.

n

Es un número que identifica cada llamada de subrutina. Debe ser el primer argumento de cada llamada de subrutina. La subrutina usa este número de llamada para dirigirse a los códigos de los segmentos.

group1, group2,...

Son las listas de argumentos de entrada pasadas por cada llamada de subrutina. Cada grupo contiene el mismo número de argumentos, con un máximo de 26.

El grupo final puede tener argumentos ficticios.

outfield

Es el campo que contiene el resultado o el formato del valor de salida, entre comillas simples.

En Dialogue Manager debe especificar el formato. En Maintain debe especificar el nombre del campo.



Ejemplo: Cómo crear una subrutina dividida en segmentos

La subrutina ADD32, escrita en seudocódigo, suma 32 números. Se divide en seis segmentos, cada uno añadiendo seis números de una subrutina de llamada. (El número total de argumentos de entrada es de 36, aunque los cuatro últimos son ficticios.) El sexto segmento añade dos argumentos a la variable SUM y devuelve el resultado. El sexto segmento no procesa ninguno de los valores proporcionados para los cuatro argumentos ficticios.

La subrutina es:

Subroutine ADD32 (NUM, A, B, C, D, E, F, TOTAL).
If NUM is 1 then goto label ONE
else if NUM is 2 then goto label TWO
else if NUM is 3 then goto label THREE
else if NUM is 4 then goto label FOUR
else if NUM is 5 then goto label FIVE
else goto label SIX.
 
Label ONE.
Let SUM = A + B + C + D + E + F.
Return.
 
Label TWO
Let SUM = SUM + A + B + C + D + E + F
Return
 
Label THREE
Let SUM = SUM + A + B + C + D + E + F
Return
 
Label FOUR
Let SUM = SUM + A + B + C + D + E + F
Return
 
Label FIVE
Let SUM = SUM + A + B + C + D + E + F
Return
 
Label SIX
LET TOTAL = SUM + A + B
Return
End of subroutine

Para usar la subrutina ADD32, liste las seis declaraciones de llamada; cada una especifica seis números. Los cuatro últimos números, representados mediante ceros, son argumentos ficticios. El comando DEFINE almacena el total de 32 números en el campo SUM32.

DEFINE FILE EMPLOYEE
DUMMY/D10 = ADD32 (1, 5, 7, 13, 9, 4, 2, DUMMY);
DUMMY/D10 = ADD32 (2, 5, 16, 2, 9, 28, 3, DUMMY);
DUMMY/D10 = ADD32 (3, 17, 12, 8, 4, 29, 6, DUMMY);
DUMMY/D10 = ADD32 (4, 28, 3, 22, 7, 18, 1, DUMMY);
DUMMY/D10 = ADD32 (5, 8, 19, 7, 25, 15, 4, DUMMY);
SUM32/D10 = ADD32 (6, 3, 27, 0, 0, 0, 0, SUM32);
END

WebFOCUS