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.
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.
Al crear argumentos para una subrutina, tenga en cuenta las siguientes cuestiones:
No debe dar por sentado que los parámetros de entrada se encuentran almacenados en memoria contigua.
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:
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:
Formato WebFOCUS |
Esquema |
---|---|
An
|
Xn
|
I |
S9(9) COMP |
P |
S9(n)[V9(m)] donde: (1+n+m)/2 = 8 para números empaquetados pequeños. (1+n+m)/2 = 16 para números empaquetados grandes. |
D |
COMP-2 |
F |
COMP-1 |
PL/I. Al escribir una subrutina en PL/I:
OPTIONS (COBOL)
CHARACTER (n)
donde:
Es la longitud del campo definida por la solicitud. No utilice el atributo VARYING.
DECIMAL FLOAT (16)
o
BINARY FLOAT (53)
Formato WebFOCUS |
Declaración PL/I de salida |
---|---|
An
|
CHARACTER (n)
|
I |
BINARY FIXED (31) |
F |
DECIMAL FLOAT (6) or BINARY FLOAT (21) |
D |
DECIMAL FLOAT (16) or BINARY FLOAT (53) |
P |
DECIMAL FIXED (15) (para números empaquetados pequeños, 8 bytes) DECIMAL FIXED (31) (para números empaquetados grandes, 16 bytes) |
Lenguaje C. Al escribir una subrutina en C:
Formato WebFOCUS |
Declaración C de salida |
---|---|
An
|
char *xxx n
Los campos alfanuméricos no terminan con un byte nulo y no pueden ser procesados por muchas de las subrutinas de manipulación de cadenas de la biblioteca de tiempo de ejecución. |
I |
long *xxx
|
F |
float *xxx
|
D |
double *xxx
|
P |
No hay equivalente en C. |
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:
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.
{subroutine|entrypoint} (input1, input2,...outfield)
donde:
Es el nombre de la subrutina.
Es el nombre del punto de entrada desde el que se va a ejecutar la subrutina.
Son los argumentos de la subrutina.
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.
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);
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:
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.
Finalice cada segmento con un comando que devuelva el control a la solicitud (comando RETURN).
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.
field = subroutine (1, group1, field) ;field = subroutine (2, group2, field); . . .outfield = subroutine (n, groupn, outfield);
donde:
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.
Es el nombre de la subrutina, de hasta ocho caracteres de longitud.
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.
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.
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.
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 |