вторник, 17 июля 2012 г.

Подпрограммы

Подпрограммы, по сравнению с макросами, обладают рядом преимуществ:
  • подпрограммы, определённые в одной программе,  можно запустить из другой программы;
  • в каждой подпрограмме можно объявить свой набор переменных, доступный только внутри этой подпрограммы, но, тем не менее, мы не теряем доступ к глобальным переменным;
  • в отличие от макросов, подпрограммы доступны для отладчика, соответственно, в теле подпрограмм можно строить сложную логику выполнения.
Работа с подпрограммами не лишена и своих нюансов. Основной из них – после подпрограмм не должно быть никакого программного кода. Поэтому подпрограммы объявляются в конце основного кода программы.
Кстати, в подпрограмме можно объявить макрос, который будет доступен только в теле этой подпрограммы.

Объявление и вызов подпрограммы

Общий вид подпрограммы выглядит следующим образом:
FORM form_name [TABLES tab STRUCTURE struc]
               [USING var1]
               [CHANGING var2].
* Тело подпрограммы
ENDFORM.
Строки, указанные в квадратных скобках, не обязательны при объявлении подпрограмм. Сами квадратные скобки не пишутся.

Назначение дополнений:

  • TABLES используется для передачи таблиц и структур в подпрограмму;
  • USING/CHANGING используется для передачи переменных в подпрограмму. Как таковой, разницы между этими двумя операторами нет, просто с помощью них определяется, какие переменные будут изменены на выходе из подпрограммы. На данный момент использование оператора CHANGING считается устаревшим, но я рекомендую его использовать, чтобы потом не путаться в коде.
Вызов подпрограмм осуществляется при помощи оператора PERFORM:
PERFORM form_name [TABLES tab]
                  [USING var1]
                  [CHANGING var2].
Операторы TABLES, USING и CHANGING ставятся в порядке, соответствующем объявлению подпрограммы.
Для вызова подпрограммы, объявленной в другой программе, используется следующая конструкция:
PERFORM form_name(program_name).
Подводя итог всему выше сказанному, приходим к следующим выводам:
  • макросы применяются для упрощения выполнения небольших рутинных операций с простой логикой. Связано это с невозможностью отладки макросов;
  • подпрограммы используются для выполнения алгоритмов любой сложности (в пределах разумного, естественно; не стоит включать в подпрограмму весь код программы) и доступны для вызова из других программ.

понедельник, 16 июля 2012 г.

Макросы


Макрос объявляется в любой части программного кода и после объявления доступен из любой части программы.
Объявление макроса происходит внутри операторов DEFINE..END-OF-DEFINITION. Общий синтаксис:
DEFINE macro_name.
* тело макроса
END-OF-DEFINITION.
В теле макроса может быть представлен любой код за исключением объявления переменных, типов, классов, указателей (field-symbols), диапазонов и других элементов, которые могут быть объявлены в программе лишь один раз. Почему? Потому что, вызывая макрос в программе, мы как будто вставляем тело макроса в ту часть кода, где его вызываем. Соответственно, если мы вызовем его два раза и более, тело макроса будет продублировано, и при генерации программы система выдаст ошибку синтаксиса.

Вызов макроса и передача данных в макрос

Для того, чтобы вызвать макрос, достаточно просто указать его имя в коде программы:
macro_name
Если в макрос необходимо передать какое-либо значение, в теле макроса нужно указать специальные символы: &1, &2, &3 и т. д.
Пример: макрос проверяет, не пустое ли значение 1 и выводит на листинг значение 1 и значение 2.
DEFINE write_data.
  IF NOT ( &1 IS INITINAL ).
    WRITE &1, &2.
  ENDIF.
END-OF-DEFINITION.
Сами значения для передачи в макрос пишутся после его вызова через пробел:
write_data var1 ‘Значение2’.

Использование макросов

Макросы стоит применять для выполнения небольших, но часто повторяющихся операций, таких как: заполнение диапазонов (ranges) или просто внутренних таблиц, вывод на листинг элементов разметки страницы, массовой очистки переменных и т. д. Тело макроса должно содержать максимально простой код с минимумом логики, ветвлений, циклов и пр. Это связано с главной особенности и главной их слабостью – макросы не обрабатывает отладчик.Если в теле макроса затаится ошибка, её будет тем сложнее отыскать, чем больше и сложнее макрос. Все сложные логические операции, которые необходимо выполнять не один раз в ходе работы программы, мы переносим в подпрограммы.