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


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow