progress-4gl
Procedimientos
Buscar..
Introducción
Existen dos tipos de procedimientos en Progress ABL: procedimientos internos y prototipos de procedimientos que son fachadas a los archivos de Windows dlls o Unix / Linux compartidos.
Al igual que con las funciones, los procedimientos no se pueden anidar. No se pueden anidar funciones en procedimientos y viceversa.
Se llama a un procedimiento con la instrucción RUN
.
Sintaxis
Ejecutar nombre de procedimiento. // Ejecuta un procedimiento llamado nombre de procedimiento.
EJECUTAR proc1 (ENTRADA "HOLA"). // Ingresa la cadena HELLO a proc1
EJECUTAR proc2 (ENTRADA var1, salida var2). // Entradas var1 y salidas var2 a / desde proc2
EJECUTAR proc3 (ingrese "nombre = 'joe'", tabla de salida ttResult). // Ingresa el nombre = joe y genera registros en una tabla
PROCEDIMIENTO proc: // Declara un procedimiento llamado proc
PROCEDIMIENTO DE FINALIZACIÓN. // Finaliza el procedimiento actual.
Un procedimiento interno básico.
A diferencia de las funciones, no es necesario reenviar un procedimiento. Puede colocarse en cualquier parte de su código, antes o después de que lo llame usando RUN
.
RUN proc.
//Procedure starts here
PROCEDURE proc:
//Procedure ends here
END PROCEDURE.
El nombre del procedimiento está seguido por un signo de dos puntos que nos dice que este es el comienzo de un bloque. El bloque finaliza con END PROCEDURE.
(pero esto puede ser reemplazado con simplemente END.
).
Parámetros de ENTRADA y SALIDA
Un procedimiento puede tener parámetros de diferentes tipos: entrada, salida, entrada-salida (bidireccional) y también algunos tipos especiales como tablas temporales y conjuntos de datos).
En la declaración de ejecución, es opcional declarar INPUT
(se considera predeterminado); todas las demás direcciones deben declararse específicamente.
Un procedimiento que toma dos enteros como entrada y genera un decimal.
PROCEDURE divideAbyB:
DEFINE INPUT PARAMETER piA AS INTEGER NO-UNDO.
DEFINE INPUT PARAMETER piB AS INTEGER NO-UNDO.
DEFINE OUTPUT PARAMETER pdeResult AS DECIMAL NO-UNDO.
pdeResult = piA / piB.
END PROCEDURE.
DEFINE VARIABLE de AS DECIMAL NO-UNDO.
RUN divideAbyB(10, 2, OUTPUT de).
DISPLAY de. //5.00
Los parámetros son totalmente opcionales. Puedes mezclar y combinar de la forma que quieras. El orden de los parámetros depende de usted, pero es útil comenzar con la entrada y terminar con la salida; debe colocarlos en el orden correcto en la instrucción de ejecución y las direcciones de mezcla pueden ser molestas.
Recursion - ver recursion
La recursión es fácil: RUN
el procedimiento desde el interior del procedimiento. Sin embargo, si retrocedes demasiado, la pila se quedará sin espacio.
Un procedimiento de cálculo del factorial.
PROCEDURE factorial:
DEFINE INPUT PARAMETER piNum AS INTEGER NO-UNDO.
DEFINE OUTPUT PARAMETER piFac AS INTEGER NO-UNDO.
DEFINE VARIABLE iFac AS INTEGER NO-UNDO.
IF piNum = 1 THEN DO:
pifac = 1.
END.
ELSE DO:
RUN factorial(piNum - 1, OUTPUT iFac).
piFac = piNum * iFac.
END.
END PROCEDURE.
DEFINE VARIABLE f AS INTEGER NO-UNDO.
RUN factorial(7, OUTPUT f).
DISPLAY f.
Alcance
El procedimiento tiene su propio alcance. El alcance externo "sangrará" en el procedimiento, pero no al revés.
DEFINE VARIABLE i AS INTEGER NO-UNDO INIT 1.
DEFINE VARIABLE j AS INTEGER NO-UNDO.
PROCEDURE p:
MESSAGE i VIEW-AS ALERT-BOX. // 1
MESSAGE j VIEW-AS ALERT-BOX. // 0
j = 2.
END PROCEDURE.
RUN p.
MESSAGE i VIEW-AS ALERT-BOX. // 1
MESSAGE j VIEW-AS ALERT-BOX. // 2
Declarar una variable dentro de un procedimiento que tiene el mismo nombre que un parámetro en el exterior solo creará una variable local.
DEFINE VARIABLE i AS INTEGER NO-UNDO INIT 1.
DEFINE VARIABLE j AS INTEGER NO-UNDO.
PROCEDURE p:
DEFINE VARIABLE i AS INTEGER NO-UNDO INIT 5.
MESSAGE i VIEW-AS ALERT-BOX. // 5
MESSAGE j VIEW-AS ALERT-BOX. // 0
j = 2.
END PROCEDURE.
RUN p.
MESSAGE i VIEW-AS ALERT-BOX. // 1
MESSAGE j VIEW-AS ALERT-BOX. // 2
Cualquier variable creada en el interior de un procedimiento es accesible solo para ese procedimiento.
Esto generará un error de compilación:
PROCEDURE p:
DEFINE VARIABLE i AS INTEGER NO-UNDO INIT 5.
END PROCEDURE.
RUN p.
MESSAGE i VIEW-AS ALERT-BOX. // Unknown Field or Variable name i - error 201