Поиск…


Вступление

В Progress ABL есть два типа процедур: внутренние процедуры и прототипы процедур, которые являются фасадами для библиотек Windows или процедур совместной библиотеки Unix / Linux.

Подобно функциям, процедуры не могут быть вложенными. Вы не можете встраивать функции в процедуры и наоборот.

Процедура вызывается с помощью инструкции RUN .

Синтаксис

  • RUN procedureurameame. // Запускает процедуру с именем processurename.

  • RUN proc1 (INPUT "HELLO"). // Вводит строку HELLO в proc1

  • RUN proc2 (INPUT var1, выход var2). // Вводит var1 и выводит var2 в / из proc2

  • RUN proc3 (вход "name = 'joe'", OUTPUT TABLE ttResult). // Вводит имя = joe и выводит записи в таблицу

  • ПРОЦЕДУРА proc: // Объявляет процедуру с именем proc

  • ПРОЦЕДУРА КОНЕЦ. // Завершает текущую процедуру

Основная внутренняя процедура

В отличие от функций, нет необходимости пересылать декларирование процедуры. Он может быть размещен в любом месте вашего кода до или после его вызова с помощью RUN .

RUN proc.

//Procedure starts here
PROCEDURE proc:

//Procedure ends here
END PROCEDURE. 

Имя процедуры обозначается знаком двоеточия, указывающим, что это начало блока. Блок заканчивается END PROCEDURE. (но это можно заменить просто END. ).

Параметры INPUT и OUTPUT

Процедура может иметь параметры разных типов: вход, выход, вход-выход (двунаправленный), а также некоторые специальные типы, такие как временные таблицы и наборы данных).

В заявлении выполнения необязательно объявлять INPUT (он считается дефолтом) - все другие направления должны быть специально объявлены.

Процедура принимает два целых числа в качестве ввода и вывода десятичного числа.

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

Параметры полностью необязательны. Вы можете смешивать и сопоставлять все, что хотите. Порядок параметров зависит от вас, но удобно начинать с ввода и заканчивать выходом - вы должны поместить их в правильном порядке в операторе выполнения, и направления смешивания могут быть раздражающими.

Рекурсия - см. Рекурсию

Рекурсия проста - RUN процедуру самостоятельно изнутри процедуры. Однако, если вы слишком поздно заработаете, у стека закончится свободное пространство.

Процедура расчета факториала.

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.

Объем

Процедура имеет свой собственный охват. Внешний охват будет «истекать» в процедуру, но не наоборот.

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

Объявление переменной внутри процедуры с тем же именем, что и параметр снаружи, приведет к созданию локальной переменной.

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

Любая переменная, созданная внутри процедуры, доступна только для этой процедуры.

Это приведет к ошибке компилятора:

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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow