Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция 17 День 17 События и подпрограммы 2011.doc
Скачиваний:
23
Добавлен:
24.11.2019
Размер:
177.66 Кб
Скачать

Initialization.

* exit. "exits event

* check 1 = 2. "exits event

* stop. "don't do this

chck_sos = 'X'.

at selection-screen output.

* exit. "exits event

* check 1 = 2. "exits event

* stop. "don't do this

message s789(zk) with 'at selection-screen output'.

at selection-screen on radiobutton group g1.

* exit. "exits event

* check 1 = 2. "exits event

* stop. "goes to end-of-selection

message i789(zk) with 'at selection-screen on rbg'.

at selection-screen.

* exit. "exits event

* check 1 = 2. "exits event

* stop. "goes to end-of-selection

message i789(zk) with 'at selection-screen'.

start-of-selection.

write: / 'Top of SOS'.

if exit_sos = 'X'.

exit. "exits report

elseif chck_sos = 'X'.

check 1 = 2. "exits event

elseif stop_sos = 'X'.

stop. "goes to end-of-selection

endif.

write: / 'Bottom of SOS'.

end-of-selection.

write: / 'Top of EOS'.

if exit_eos = 'X'.

exit. "exits report

elseif chck_eos = 'X'.

check 1 = 2. "exits report

elseif stop_eos = 'X'.

stop. "exits report

endif.

write: / 'Bottom of EOS'.

write: / '1', / '2', / '3'.

top-of-page.

write: / 'Title'.

* exit. "exits event and returns to write statement

* check 'X' = 'Y'. "exits event and returns to write statement

* stop. "goto end-of-selection - don't write after it

uline.

end-of-page.

uline.

* exit. "exits report

* check 'X' = 'Y'. "exits event and returns to write statement

* stop. "goto end-of-selection - don't write after it

write: / 'Footer'.

Возвращение из Списка

Когда пользователь формирует отчет, драйвер вызывает initialization и затем показывает экран выбора. После нажатия кнопки Execute драйвер вызывает остальные события, конец программы и пользователь видит список. Пользователь нажимает кнопку «Назад», и программа драйвера перезапускает обработку, тем самым вызывая событие initialization, и затем все последующие события следуют снова в их нормальной последовательности. Результат состоит в том, что пользователь видит экран выбора после нажатия кнопки «Назад».

У экрана выбора есть своя собственная копия всех переменных, которые отображены на нем. В первый раз отчет выполняется, и программа драйвера восстанавливает управление после того, как событие initialization завершилось, при этом значения переменных программы взяты из соответствующих переменных экрана выбора. Пользователь может изменить входные поля. Когда пользователь нажимает кнопку Execute, драйвер сохраняет значения переменных из экрана выбора в две области данных: одна принадлежит экрану выбора и затем в переменные Вашей программы.

Однако, это двойное действие происходит только в первый раз, когда Вы выполняете программу. Когда пользователь нажимает кнопку «Назад», событие initialization вызвано вновь. Когда управление возвращается к драйверу, оно не копирует Ваши переменные программы в область данных экрана. Вместо этого показывает существующие значения из области данных экрана; который все еще содержит значения, которые ввел пользователь. Результат состоит в том, что пользователь видит значения, которые он ввел независимо от того, что изменилось в Вашей программе. После того, как пользователь нажимает кнопку Execute, экранные значения скопированы в область данных экрана и затем в программу. Например, если Вы установите значения во время initialization, то эти значения будут выведены на экране выбора, когда Вы запустите программу. Когда Вы нажмете кнопку «Назад» на экране выбора, initialization выполнится, но пользователь будет видеть значения, которые он ввел.

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

Подпрограмма (subroutine) – раздел многократного использования кода. Чтобы определить подпрограмму, используется оператор form, чтобы указать начало подпрограммы, и используется endform, чтобы указать конец подпрограммы. Название подпрограммы не может превышать 30 символов.

Чтобы назвать подпрограмму, используется оператор perform.

Пример определения и вызова подпрограммы.

report ztx1706.

write: / 'Before call 1'.

perform sub1.

write: / 'Before call 2'.

perform sub1.

write: / 'After calls'.

form sub1.

write: / 'Inside sub1'.

endform.

Before call 1

Inside sub1

Before call 2

Inside sub1

After calls

Есть два типа подпрограмм:

  • Internal subroutines Внутренние подпрограммы

  • External subroutines Внешние подпрограммы

Предыдущий пример – пример вызова внутренней подпрограммы.

Определение и вызов внутренних подпрограмм

Определения подпрограммы обычно помещаются в конце программы, после всех событий. Оператор form определяет конец предыдущего события, и начало подпрограммы. Подпрограммы не могут быть вложены в события. Синтаксис оператора form

form s [tables t1 t2 ...]

[using u1 value(u2) ...]

[changing c1 value(c2) ...].

---

endform.

  • s – название подпрограммы.

  • t1, t2, u1, u2, c1, и c2 являются параметрами.

  • tables определяют внутренние таблицы, которые должны быть переданы как параметры.

  • value не может использоваться после tables.

  • value может быть применено к любым переменным, которые передают через using или changing.

  • --- представляет любое число строк программы.

Особенности оператора:

  • Все дополнения являются дополнительными.

  • Порядок параметров: tables, using, changing.

  • Каждое дополнение может определено только один раз.

  • Не используйте запятые, чтобы отделить параметры.

  • tables используется для передачи внутренних таблиц – не таблицы базы данных.

  • Подпрограмма может вызывать другую подпрограмму.

  • Рекурсия поддержана.

  • Определения подпрограммы не могут быть вложены. (Вы не можете определить подпрограмму в пределах другой подпрограммы).

Синтаксис оператора 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 будет 2, то вторая подпрограмма в списке будет выполнена.

report ztx1707.

do 3 times.

perform sy-index of s1 s2 s3.

enddo.

form s1.

write: / 'Hi from s1'.

endform.

form s2.

write: / 'Hi from s2'.

endform.

form s3.

write: / 'Hi from s3'.

endform.

Hi from s1

Hi from s2

Hi from s3

Выход из подпрограммы. Для выхода из подпрограммы используются следующие операторы:

  • exit

  • check

  • stop

В подпрограммах

  • check и exit немедленно выходят из подпрограммы и переход осуществляется на следующий после perform оператор.

  • stop немедленно завершает подпрограмму, и переходит непосредственно в событие end-of-selection.

check, exit, и stop не устанавливает значение sy-subrc.

report ztx1708.

data f1 value 'X'.

clear sy-subrc.

perform s1.

write: / 'sy-subrc =', sy-subrc.

perform s2.

write: / 'sy-subrc =', sy-subrc.

perform s3.

write: / 'sy-subrc =', sy-subrc.

perform s4.

write: / 'sy-subrc =', sy-subrc.

end-of-selection.

write: 'Stopped, sy-subrc =', sy-subrc.

if sy-subrc = 7.

stop.

endif.

write: / 'After Stop'.

form s1.

do 4 times.

exit.

enddo.

write / 'In s1'.

exit.

write / 'After Exit'.

endform.

form s2.

do 4 times.

check f1 = 'Y'.

write / sy-index.

enddo.

write / 'In s2'.

check f1 = 'Y'.

write / 'After Check'.

endform.

form s3.

do 4 times.

sy-subrc = 7.

stop.

write / sy-index.

enddo.

endform.

form s4.

write: / 'In s4'.

endform.

In s1

sy-subrc = 0

In s2

sy-subrc = 0

Stopped, sy-subrc = 7

Определение глобальных и локальных переменных

Глобальная переменная – та, которая определена за пределами подпрограммы при использовании оператора tables или data.

Локальная переменная – переменная, которая определена в подпрограмме, используя local, data, или оператор statics. Переменные, определенные при использовании local, доступны вне подпрограммы; переменные, определенные при использовании data или statics, нет. Таким образом, если подпрограмма вызывает другую подпрограмму, переменные, определенные при использовании local, видима изнутри названных переменных подпрограммы, определенных при использовании data или statics, нет.

Для локальных переменных, определенных при использовании local или data, память выделяется при вызове подпрограммы. Эта память освобождается, когда подпрограмма заканчивается, и таким образом значения теряются. Для statics память сохраняется.

Определение рабочей области tables

Переменные, определенные при использовании оператора tables, всегда являются глобальными переменными. Размещение оператора tables вначале программы определяет глобальную field String. Размещение того же самого оператора в подпрограмме также определяет global field string того же названия. Поэтому, Вы не должны использовать оператора tables в подпрограмме, так как определена всегда глобальная переменная; глобальные определения должны быть помещены вначале Вашей программы.

Локальная рабочая область таблицы в подпрограмме определяется используя local вместо оператора tables. Синтаксис такой же как tables, но он определяет local field string вместо глобальной. Переменные, определенные при использовании local, видимы изнутри подпрограммы и всех подпрограмм, которые она вызывает.

report ztx1709.

tables ztxlfa1.

select single * from ztxlfa1 where lifnr = 'V9'.

write: / '*-----', ztxlfa1-lifnr.

perform s1.

write: / '*S1---', ztxlfa1-lifnr.

perform s2.

write: / '*S2---', ztxlfa1-lifnr.

form s1.

write: / ' S1-A', ztxlfa1-lifnr.

local ztxlfa1.

select single * from ztxlfa1 where lifnr = 'V1'.

write: / ' S1-B', ztxlfa1-lifnr.

perform s2.

write: / ' S1-C', ztxlfa1-lifnr.

endform.

form s2.

write: / ' S2-A', ztxlfa1-lifnr.

select single * from ztxlfa1 where lifnr = 'V2'.

write: / ' S2-B', ztxlfa1-lifnr.

endform.

* - - - - -V9

S1-A V9

S1-B V1

S2-A V1

S2-B V2

S1-C V2

*S1 - - -V9

S2-A V9

S2-B V2

*S2 - - -V2

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

Определение Данных

Переменные, определенные в операторе data вначале программы, являются глобальными переменными. Переменные, определенные в data в пределах подпрограммы являются локальными в подпрограмме. Память распределена для этих переменных, когда подпрограмму вызывают, и освобождена, когда происходит выход из подпрограммы. Как и переменные, определенные при использовании local, будут потеряны значения в переменных data, когда произойдет выход из подпрограммы.

Используйте оператор statics, чтобы создать локальные переменные, которые не теряют свои значения, когда подпрограмма заканчивается. Синтаксис оператора statics – такой же, как синтаксис оператора data. Память для статической переменной распределена в первый раз, когда подпрограмму называют, и сохранена, когда подпрограмма заканчивается. Однако, статическая переменная видима только изнутри подпрограммы непосредственно, но не в подпрограммах, которые она вызывает.

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

report ztx1710.

data: f1 type i value 8,

f2 type i value 9.

write: / 'before s1:', f1, f2.

do 3 times.

perform s1.

enddo.

write: / 'after s1:', f1, f2.

form s1.

data f1 type i value 1.

statics f2 type i value 1.

write: / 'inside s1:', f1, f2.

perform s2.

f1 = f2 = f2 * 2.

endform.

form s2.

write: ' S2-', f1, f2.

endform.

before s1: 8 9

inside s1: 1 1 S2- 8 9

inside s1: 1 2 S2- 8 9

inside s1: 1 4 S2- 8 9

after s1: 8 9