Процедуры и функции


 Процедуры 
 Функции 
 Передача аргументов 


        Процедуры

        Процедура начинается с ключевого слова PROCEDURE и выполняется, пока не будет выполнено одно из следующих условий:

  • Еще раз встретится слово PROCEDURE.
  • Будет обнаружена команда RETURN - возвращение в предыдущую программу.
  • Будет выдана команда CANCEL - прерывание работы программы.
  • Будет выдана команда QUIT - выход из СУБД.
  • Встретится новая команда DO для запуска другой программы.
  • Будет достигнут конец файла.
        PROCEDURE имя_процедуры
            [ PARAMETERS список_параметров ]
            тело
            RETURN

        Поиск вызванной процедуры осуществляется в следующей последовательности:

  1. в файле, из которого вызывается процедура;
  2. в процедурном файле, если используется конструкция SET PROCEDURE;
  3. просматриваются программы в соответствии с иерархией вызовов;
  4. ищется отдельный файл с тем же именем, что и процедура.
        Вызов процедуры: DO имя_процедуры
Можно при вызове процедуры указать файл, в котором находится процедура - в этом случае будет просматриваться указанный файл.
               DO IN имя_файла имя_процедуры
В процедурном файле хранятся общие для проекта процедуры. Для открытия процедурного файла:
               SET PROCEDURE TO имя_файла
        Для закрытия - то же, но без указания имени файла


        Функции

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

        FUNCTION имя_функции
        [PARAMETERS список_параметров ]
        тело
        RETURN возвращаемый результат

        Имеются четыре способа вызвать функцию:

        1. Присвоить возвращаемое значение переменной. Например, следующая строка кода запоминает текущую системную дату в переменной dToday:
        dToday = DATE()

        2. Включить вызов функции в команду. Например, следующая команда устанавливает по умолчанию каталог, имя которого возвращает функция GETDIR():
        SET DEFAULT TO GETDIR()

        3. Напечатать возвращаемое значение в активное окно:
        ? TIME()

        4. Вызвать функцию без запоминания где-либо возвращаемого значения:
        = SYS(2002)
 
        Для прерывания выполнения подпрограммы служит оператор RETURN [Expression | TO MASTER | TO ProgramName] который возвращает управление в вызывающую программу, и в ней выполняется следующая команда после вызывающей.
        Если указана опция ТО MASTER, то управление возвращается на самый верхний уровень вызывающей программы, а эта же программа с опцией ТО ProgramName передает управление в указанную программу. При использовании в функции команда автоматически возвращает .Т. , если не указано другое выражение на месте Expression.
        RETRY  - действует подобно команде RETURN, но при возвращении управления в вызывающую программу повторяется выполнение последней команды.
 



       Передача аргументов

   При создании процедуры или функции можно ввести для них параметры, которые будут передаваться при вызове и влиять на результат выполнения процедуры или функции.
    В этом случае первой командой после ключевого слова PROCEDURE или FUNCTION должна быть команда PARAMETERS список_параметров, параметры разделяются запятыми.
        При вызове процедуры с параметрами используется ключевое слово WITH:
                DO имя_процедуры WITH список_параметров.

        Передача аргументов возможна двумя способами:
1. Передача по ссылке - в этом случае передаётся указатель аргумента и при изменении его значения в процедуре или функции изменяется значение в вызвавшей программе.
2. Передача по значению - в этом случае передаётся копия аргумента и значение аргумента в вызвавшей подпрогамме не меняется.
        По умолчанию в процедуру аргументы передаются по ссылке. Для того, чтобы  аргументы передавались по значению, их заключают в круглые скобки ( ) в списке параметров. В функцию же по умолчанию происходит передача по значению. Чтобы изменить способ передачи аргументов в функцию используется команда
                SET UDFPARMS TO VALUE | REFERENCE
        Если указывается VALUE, аргумент передаётся по значению, REFERENCE - по ссылке.