Особенности оператора form.
Определения подпрограмм обычно размещают в конце программы после всех событий. Операторformопределяет конец предыдущего события и начало подпрограммы. Подпрограммы не могут быть вложены в события.
Синтаксис оператора form:
form s [tables t1 t2 ...]
[using u1 value(u2) ...]
[changing c1 value(c2) ...].
---
Endform.
где:
s — имя подпрограммы
t1,t2,u1,u2,c1 иc2— параметры
Особенности использования оператора form:
§ все дополнения являются опциями
§ если дополнения присутствуют, то они должны следовать строго в приведенном выше порядке, т.е.:tables,using,changing
§ каждое дополнение может быть определено только один раз
§ нельзя использовать запятые для отделения параметров
§ tablesиспользуется для передачи только внутренних таблиц — не таблиц базы данных
§ подпрограмма может вызывать другую подпрограмму
§ поддерживается рекурсия — подпрограмма может вызвать сама себя или другую подпрограмму, которая, в свою очередь, вызывает первую
§ определения подпрограмм не могут быть вложены (нельзя определить подпрограмму внутри другой подпрограммы)
10. Синтаксис оператора perform.
Синтаксис оператора perform:
perform a) s
b) n of s1 s2 s3 ...
[tables t1 t2 ...]
[using u1 u2 ...]
[changing c1 c2 ...].
где:
s,s1,s2,s3 — имена подпрограмм
n — числовая переменная
a) иb)являются взаимоисключающими
tables,usingиchangingмогут появиться или сa)или сb)
дополнениеvalue()не может использоваться сperform
Используя синтаксисb), можно определить, какая из списка подпрограмм должна быть выполнена. Выполняется n-ая подпрограмма из списка имен подпрограмм. Например, еслиn = 2, то будет выполнена вторая подпрограмма из списка.
Операторы, используемые для выхода из подпрограммы.
Из подпрограммы можно выйти в любое время с использованием следующих операторов:
Exit
Check
Stop
Далее описывается эффектcheckиexit, если они закодированы в подпрограмме вне цикла. Эффектstopв подпрограммах не зависит от того, записан он в цикле или нет.
В подпрограммах:
§ check иexitвызывают немедленный выход из подпрограммы и переход к оператору, следующему заperform
§ stop немедленно завершает подпрограмму и вызывает переход непосредственно в событиеend-of-selection
check,exitиstopне устанавливает значениеsy-subrc.
Определение глобальных переменных.
Глобальная переменная — та, которая определена за пределами подпрограммы при использовании операторов:
Tables
Data
К ней можно обратиться из любой точки в программе, в событии или в подпрограмме. Определения глобальных переменных лучше помещать вверху программы перед первой строкой выполняемого кода.
Определение локальных переменных.
Локальная переменная — переменная, которая определяется в подпрограмме с использованием операторов:
Local
Data
Statics
Она, как говорят, является локальной в подпрограмме.
Переменные, определенные с использованиемlocal, доступны снаружи подпрограммы; переменные, определенные с использованиемdataилиstatics, — нет. Поэтому, если подпрограмма вызывает другую подпрограмму, переменные, определенные с использованиемlocal, видимы изнутри вызванных подпрограмм, переменные, определенные с использованиемdataилиstatics — нет.
Для локальных переменных, определенных с использованиемlocalилиdata, память распределяется при каждом вызове подпрограммы. Эта память освобождается при завершении работы подпрограммы, и поэтому значения в ее пределах теряются. Для локальных переменных, определенных с использованиемstaticsпамять сохраняется.
14. Определение рабочей области tables.
Переменные, определенные с использованием оператораtables, всегда являются глобальными переменными. Размещение оператораtablesвверху программы определяет глобальную Field String. Размещение этого же оператора в подпрограмме также определяетглобальнуюField String с тем же именем. Поэтому не нужно использовать операторtablesв подпрограмме, так как такое определение — всегда глобальная переменная; глобальные определения должны быть помещены вверху программы.
Локальная рабочая область таблицы в подпрограмме определяется с использованиемlocalвместо оператораtables. Синтаксис — такой же, как уtables, но он определяетлокальнуюField String вместо глобальной. Переменные, определенные при использованииlocal, видимы изнутри подпрограммы и всех подпрограмм, которые она вызывает.
Точнее, переменная известна в программе только после точки, в которой она определена. Например, если переменная определяется в строке 10, к ней можно обратиться в строке 11 и позже, но не в строках перед строкой 10. В случае определенияlocalможно обратиться к глобальной версии переменной в любой точке перед определениемlocal.
15. Передача параметров без контроля типов.
В дополнение к определению переменных c использованиемtables,local,dataиstaticsпеременные могут быть определены также непосредственно в оператореform. Они известны как параметры. Параметры могут быть или локальными переменными или ссылкой на глобальные переменные. Память для локальных параметров выделяется при вызове подпрограммы и освобождается при её завершении.
Если переменные определяются в оператореform,performдолжен передать значение каждой из этих переменных.
Параметры, задаваемые в оператореform, называют формальными параметрами, а параметры, задаваемые в оператореperform — фактическими параметрами.
16. Передача типизированных параметров.
Формальные параметры могут быть типизованными или нетипизованными.
Типизованный параметр — формальный параметр, для которого указан тип данных после его имени в оператореform.
Нетипизованный параметр — формальный параметр, для которого не указан тип данных после его имени в оператореform
Нетипизованные формальные параметры позволяют передавать переменную любого типа данных или длины. Формальный параметр использует атрибуты фактического параметра. Например, если нетипизованному формальному параметруp1передается четырехбайтовое целое число, тоp1становится четырехбайтовым целым числом. Если этому же параметру передается строка длиной 3 символа, то он станет строкой длины 3.
Синтаксис передачи типизированных параметров:
form s1 using u1 type t value(u2) type t
changing c1 type t value(c2) type t.
где:
s1— имя подпрограммы
u1,u2,c1иc2— формальные параметры
t— или тип данных ABAP/4, или тип данных, определенный пользователем
Особенности оператора:
§ в оператореformможет быть определен только тип данных, длина не может быть определена
§ при определении формального параметра, используя тип данных фиксированной длины (типыd,t,iиf), длина фактического параметра должна соответствовать типу данных формального параметра
У типизированных параметров есть три преимущества:
§ Они более эффективны. Необходимо меньше времени работы центрального процессора при распределении памяти для типизованного параметра, чем для нетипизованного
§ Они помогают предотвращать ошибки кодирования. Поскольку невозможно передать параметр несовместимого типа, проверка синтаксиса укажет на ошибку, если попытаться передать несовместимый параметр
§ Они помогают предотвращать ошибки во время выполнения программы. Например, если программа принимает переменную без контроля типов и выполняет над ней арифметическую операцию, возможно передать символьные данные в эту подпрограмму. Если это случится во время выполнения, произойдет ошибка