Передача значения и результата

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

Однако здесь при выполнении оператораendform значение из области локальной памяти копируется назад в оригинальную область памяти. Изменения значения параметра в подпрограмме отражены в оригинале (но только после возвращения из подпрограммы).

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

Копия всегда возвращается, если не выходить из подпрограммы с использованием одного из двух операторов:

Stop

§ message ennn

Операторstopвызывает завершение работы подпрограммы и переход непосредственно в событиеend-of-selection. Если параметр был передан по значению и результату, то сделанные в нем изменения не сохраняются перед переходом кend-of-selection. В некотором смыслеstopведет себя как обратная перемотка для параметров результата и значения. При использовании в подпрограмме операторуstopобычно предшествует тест на аварийное условие в программе. При возникновении аварийного условия выполняетсяstop. Это отказ от изменений в переменных значения и результата и переход кend-of-selection, где выполняются процедуры очистки.

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

23. Передача внутренних таблиц как параметров, синтаксис каждого метода передачи.

Можно использовать один из двух методов передачи внутренней таблицы в подпрограмму:

§ передача таблицы со строкой заголовка

§ передача только тела таблицы

Если у внутренней таблицы есть строка заголовка, то первый метод передает в подпрограмму и строку заголовка, и тело. Второй метод передает в подпрограмму только тело.

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

Методы и результаты передачи внутренней таблицы в подпрограмму:

  Метод Если у внутренней таблицы есть строка заголовка Если у внутренней таблицы нет строки заголовка
Со строкой заголовка Передаются и строка заголовка, и тело Создает строку заголовка в подпрограмме
Без строки заголовка Передается только тело Передается тело

Синтаксис каждого метода передачи внутренней таблицы в подпрограмму:

Метод Синтаксис Способ передачи
Со строкой заголовка form s1 tables it По ссылке
Только тело form s1 using it[] form s1 changing it[] form s1 using value(it[]) form s1 changing value(it[]) По ссылке По ссылке По значению По значению и результату

24. Синтаксис описания внутренней таблицы в подпрограмме.

Просто передача внутренней таблицы обычно недостаточна - нужно также описать подпрограмме структуру внутренней таблицы. Если не описать структуру внутренней таблицы в оператореform, то компоненты внутренней таблицы будут неизвестны в подпрограмме. Поэтому доступ к любой компоненте в подпрограмме приведет к синтаксической ошибке.

Синтаксис описания внутренней таблицы подпрограмме:

Метод Синтаксис Правильные значения для x
Со строкой заголовка tables it structure x Field String Структура DDIC Таблица DDIC Внутренняя таблица со строкой заголовка
  tables it like x Внутренняя таблица без строки заголовка Тело внутренней таблицы (it[])
Без строки заголовка using it[] like x Внутренняя таблица без строки заголовка Тело внутренней таблицы (it[])

Послеstructureдолжно быть задано имя Field String, структуры или таблицы DDIC или имя внутренней таблицы, у которой есть строка заголовка.

Послеlikeдолжно быть тело таблицы. Если у внутренней таблицы нет строки заголовка, тоitилиit[]обращается к телуit. Если уitесть строка заголовка, то для обращения к телуit может использоватьсяit[].

Если передается только тело, то в подпрограмме нужна рабочая область для добавления записей во внутреннюю таблицу. Для ее определения можно использоватьlocal,dataилиstatics. Если для определения рабочей области используется операторdata, то доступно дополнениеlike line of itabbody. Оно определяет Field String с использованием только тела внутренней таблицы. Получающаяся Field String точно соответствует строке тела внутренней таблицыitabbody. Например,

data fs like line of it[].

определяет Field String с именемfs. Она имеет ту же структуру, что и строкаit.

25. Передача внутренней таблицы со строкой заголовка.

Если у внутренней таблицы есть строка заголовка, и нужно передать в подпрограмму и строку заголовка, и тело, используют синтаксисtables it structure x. Тогда передается и строка заголовка, и тело, и они передаются по ссылке. Поэтому изменения, сделанные в подпрограмме или в строке заголовка, или в теле внутренней таблицы, немедленно отражаются в оригинале.

Если у внутренней таблицы нет строки заголовка, а нужно передать в подпрограмму тело и создать там строку заголовка, можно также использовать синтаксисtables it structure x. Это передает тело по ссылке и создает строку заголовка локально в подпрограмме. Изменения, сделанные в теле внутренней таблицы в подпрограмме, немедленно отражаются в оригинале.

Если у внутренней таблицы нет строки заголовка, и нужно передать тело, автоматически не создавая строку заголовка в подпрограмме, можно использовать синтаксисtables it like x. При использовании этого синтаксиса можно передать тело по ссылке, по значению или по значению и результату. Еслиitпередается по ссылке, то изменения, сделанные в теле внутренней таблицы в подпрограмме, будут немедленно отражены в оригинале. Еслиitпередается по значению, создается локальная копияit, и изменения не сохраняются при выходе из подпрограммы и освобождении локальной памяти дляit. Еслиitпередается по значению и результату, изменения копируются назад в оригинал при выполнении оператораendform. Операторstopв подпрограмме вызовет отказ от всех изменений вitи передачу управления непосредственноend-of-selection.

26. Вызов внешних подпрограмм.

Внешняя подпрограмма - та, которая находится в другой программе, а не в той, в которой находится вызывающий подпрограмму операторperform:

Передача значения и результата - №1 - открытая онлайн библиотека

Когдаperformобращается к внешней подпрограмме:

§ загружается внешняя программа, содержащая подпрограмму

§ внешняя программа проверяется на синтаксис

§ управление переходит кformво внешней программе

§ выполняются операторы во внешней подпрограмме

§ endformвозвращает управление оператору послеperform

Проверка синтаксиса происходит во время выполнения по следующим двум причинам:

§ для проверки соответствия типов передаваемых параметров

§ для проверки наличия синтаксических ошибок

Внешние подпрограммы очень похожи на внутренние подпрограммы:

§ обе позволяют передачу параметров

§ обе позволяют типизованные формальные параметры

§ обе позволяют передачу параметров по значению, по значению и результату и по ссылке

§ обе позволяют локальные определения переменных

Различия между внутренними и внешними подпрограммами:

Передача значения и результата - №2 - открытая онлайн библиотека

§ Глобальная переменная, определенная с использованиемdata, известна только в программе, в которой она определена. Например, в иллюстрации операторdata f1есть в обеих программах. Он определяет две области памяти с именемf1.f1, определенная вztx1811, доступна только изнутриztx1811.f1, определенная вztx1812, доступна только изнутриztx1812

§ Глобальные переменные с одинаковыми именами, определенные в обеих программах с использованиемоператораtables, доступны в обеих программах. Изменение в этой переменной в одной программе затрагивает переменную другой. Область памяти с именемztxlfa1разделена между обеими программами. Любое изменение в этой рабочей области немедленно отражается в обеих программах.

27. Оператор include.

Включаемая программа(include program) - программа, которая спроектирована для использования другой программой. Другие программы используют код, который содержит включаемая программа, копируя в себя строки включаемой программы. Копирование происходит во время выполнения с помощью оператораinclude.

Программу, включающую другую программу, называют как включающей программой(including program).

Синтаксис оператора include

Include ipgm.

где:

ipgm - программа типаi

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

§ включаемая программа должна быть типаi(тип программы определяется в поле Type на экране Program Attributes при создании программы)

§ включаемая программа может быть включена в одну или более включающих программ

§ программа типаiне может содержать частичных или неполных операторов

Операторincludeкопирует код включаемой программы во включающую программу. Код из включаемой программы копируется один к одному и заменяет операторincludeво время генерации включающей программы:

§ Во время генерации строки 5 программыztx1901из программыztx1902копируется код вztx1901; вставляемый код заменяет строку 5

§ Во время генерации строки 6 программыztx1901из программыztx1903копируется код вztx1901; вставляемый код заменяет строку 6

§ При выполнении программаztx1901ведет себя как единая программа, как будто строки из включаемых программ были набраны непосредственно вztx1901

SAP используетincludeдля уменьшения избыточности кода и разделения очень больших программ на меньшие модули.

28. Представление функциональных модулей.

Функциональный модуль - последний из четырех основных модулей ABAP/4. Он напоминает внешнюю подпрограмму в том, что:

§ оба находятся во внешних программах

§ оба дают возможность передавать и возвращать параметры

§ параметры могут передаваться по значению, по значению и результату или по ссылке

Основные различия между функциональными модулями и внешними подпрограммами следующие:

§ функциональные модули используют специальный экран для определения атрибутов параметров, они не определяются с помощью операторов ABAP/4

§ рабочие областиtables не разделены между функциональным модулем и программой запроса

§ для вызова функционального модуля и вызова подпрограммы используется различный синтаксис

§ выход из функционального модуля осуществляется с помощью оператораraiseвместоcheck,exitилиstop

Имя функционального модуля должно содержать от 3 до 30 символов. Функциональные модули пользователя должны начаться с Y_илиZ_. Имя каждого функционального модуля уникально в пределах всей системы R/3.

29. Функциональные группы.

Функциональная группа - программа, которая содержит функциональные модули. С каждой системой SAP R/3 поставляется более 5 000 существующих функциональных групп. Всего они содержат более 30 000 функциональных модулей. Если требуемые функциональные возможности уже не охвачены этими поставляемыми SAP функциональными модулями, то можно также создать свои собственные функциональные группы и функциональные модули.

Каждая функциональная группа задается четырехсимвольным идентификатором, который назвается функциональным кодом группы. При создании собственной функциональной группы нужно выбирать функциональный код группы, который начинается с YилиZ. Идентификатор должен быть длиной точно четыре символа и не может содержать пробелы или специальные символы.

30. Определение функционального интерфейса модуля

Для передачи параметров в функциональный модуль, нужно определить интерфейс функциональный модуля. Интерфейс функционального модуля - описание параметров, которые передаютсяв-и возвращаютсяиз-функционального модуля. Его называют также просто интерфейс.

Для определения параметров нужно задать их на экранах определения параметров:

§ Import Parameter Interface

§ Export Parameter Interface

§ Changing Parameters

§ Table Parameters Interface

§ Exceptions Interface

31. Параметры импорта.

Входные параметры(Import parameters) - переменные или Field Strings, которые содержат значения, передаваемые в функциональный модуль из вызывающей программы. Эти значения задаются за пределами функционального модуля, и они импортируются в него.

32. Параметры экспорта.

Выходные параметры(Export parameters) - переменные или Field Strings, которые содержат значения, возвращаемые из функционального модуля. Эти значения задаются в функциональном модуле, и они экспортируются из него.

33. Изменяющиеся параметры.

Изменяющиеся параметры(Changing parameters) - переменные или Field Strings, которые содержат значения, передаваемые в функциональный модуль, изменяющиеся в функциональном модуле и затем возвращающиеся из него. Эти значения определяются вне функционального модуля, затем передаются в него, изменяются и возвращаются обратно.

34. Параметры таблицы.

Параметры таблицы(Table parameters) - внутренние таблицы, которые передаются функциональному модулю, изменяются в нем и возвращаются из него. Внутренние таблицы должны быть определены в вызывающей программе.

35. Исключение.

Исключение(exception) - имя ошибки, которая происходит в функциональном модуле.

36. Вызов функциональных модулей.

Для вызова функционального модуля используется операторcall function:

Report ztx1904.

3 write: / 'Before Call'.

4 call function 'Z_TX_1901'.

5 write: / 'After Call'.

Before Call

Hi from Z_TX_1901

After Call

§ В строке 4 управление передается на начало функционального модуляz_tx_1901(в этом примере функциональный модуль находится в некоторой группе функцийztxa;SAPLztxa- основная программа этой группы функций - действует как контейнер дляz_tx_1901)

§ Выполняется код функционального модуля

§ Последняя строка функционального модуля возвращает управление операторуcall function. Обработка продолжается следующим оператором послеcall function

37. Создание функционального модуля.

Создайте функциональный модуль и поместите его в функциональную группу согласно следующей процедуре:

1. Создайте функциональную группу (se80). Имя функциональной группы должно быть четырехсимвольным и должно начинаться с YилиZ

2. Создайте функциональный модуль (se37). Имя функционального модуля должно начинаться с Y_илиZ_. Определите параметры экспорта, импорта и т.д.

3. Напечатайте исходный текст функционального модуля. Не изменяйте сгенерированные системой строки комментария при любых обстоятельствах! Ваш функциональный модуль не будет работать!!! Сохранить – Проверить – Активировать – Протестировать

4. Создайте программу ABAP/4 (se38) и вызовите функциональный модуль. Имя функционального модуля должно быть записано в верхнем регистре при вызове.

38. Использование releasing в функциональном модуле.?

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

39. Установка значения sy-subrc по возвращению из функционального модуля.

Обычно, после возвращения из функционального модуля, система автоматически устанавливает значениеsy-subrc в ноль. Чтобы установитьsy-subrcв ненулевое значение, используется один из двух операторов:

Raise

Message ... raising

· Использование оператора raise

Операторraise используется, чтобы выйти из функционального модуля и установить значениеsy-subrc по возвращению. Синтаксис оператора raise:

Raise xname.

где: xname - имя исключения, которое будет выполнено

При выполнении оператораraise управление немедленно передается операторуcall function, и устанавливается значениеsy-subrc в зависимости от исключения. Значения параметров экспорта не копируются назад в программу запроса:

Специальное имяothers в строке 13 вызывающей программы будет соответствовать всем исключениям, явно не названным в дополненииexceptions.

Если параметр экспорта передает значение после выполнения оператораraise, то его значение остается неизменным в программе запроса, даже если это значение было изменено в функциональном модуле до выполнения оператораraise.

check,exit и stop имеют тот же эффект в функциональных модулях, как и во внешних подпрограммах. Однако они не должны использоваться в пределах функциональных модулей. Вместо них должен использоваться оператор raise, потому что он дает возможность вызывающей программе установить по возвращению значение sy-subrc.

· Использование оператора message ... raising

У оператораmessage ... raising есть два режима работы:

§ если имя исключения послеraising не обработано операторомcall function, иothers не закодировано, пользователю выдается сообщение

§ если имя исключения послеraising обработано операторомcall function, сообщение пользователю не выдается - вместо этого управление возвращается к операторуcall function, и исключение обрабатывается так же, как и операторомraise

Синтаксис оператора message ... raising:

message tnnn(cc) [with v1 v2 ...] raising xname.

где:

t - тип сообщения (e,w,i,s,aилиx)

nnn - номер сообщения

(cc) - класс сообщения

v1 иv2- значения, которые будут вставлены в текст сообщения

xname - имя исключения, которое будет выполнено

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

§ xname - имя исключения как и в оператореraise

§ если класс сообщения не определен здесь, он должен быть определен в оператореfunction-pool вTOP include для функциональной группы через дополнениеmessage-id

§ установлены следующиеsy-переменные:sy-msgid,sy-msgty,sy-msgno иsy-msgv1 черезsy-msgv4. Они могут быть использованы в пределах программы запроса (после возвращения)

При выполнении оператораmessage ... raising поток управления зависит от типа сообщения и от того, обработано ли условие вызывающей программой (определенное в списке исключений в программе запроса):

§ Если условие обработано вызывающей программой, управление возвращается к вызывающей программе. Значения переменныхsy-msg установлены. Значения экспорта, который передаются по значению, не возвращены

§ Если условие не обработано вызывающей программой для типов сообщенийe,wиa, происходит выход из функционального модуля, и программа запроса немедленно завершается. Сообщение отображено, и список вывода пуст. Когда пользователь нажимает клавишуENTER, пустой список удаляется, и пользователь возвращается к экрану, из которого была вызвана программа

§ Если условие не обработано вызывающей программой для типа сообщенияi, в диалоговом окне отображается сообщение пользователю. Когда пользователь нажимает клавишуENTER, управление возвращается к функциональному модулю к оператору, следующему за операторомmessage. Функциональный модуль продолжает обрабатываться, и операторомendfunction управление возвращается к программе запроса. Значения переменныхsy-msg установлены, и значения экспорта, которые передаются по значению, возвращаются

§ Если условие не обработано вызывающей программой для типа сообщенияs, сообщение хранится в системной области. Управление продолжается в пределах функционального модуля в операторе, следующем за операторомmessage. Функциональный модуль продолжает обрабатываться, и операторомendfunction управление возвращается к программе запроса. Значения переменныхsy-msg установлены, и значения экспорта, которые передаются по значению, возвращаются. Когда отображается список, сообщение появляется внизу списка в строке состояния

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

40. Оператор message ... raising.

· Использование оператора message ... raising

У оператораmessage ... raising есть два режима работы:

§ если имя исключения послеraising не обработано операторомcall function, иothers не закодировано, пользователю выдается сообщение

§ если имя исключения послеraising обработано операторомcall function, сообщение пользователю не выдается - вместо этого управление возвращается к операторуcall function, и исключение обрабатывается так же, как и операторомraise

Синтаксис оператора message ... raising:

message tnnn(cc) [with v1 v2 ...] raising xname.

где:

t - тип сообщения (e,w,i,s,aилиx)

nnn - номер сообщения

(cc) - класс сообщения

v1 иv2- значения, которые будут вставлены в текст сообщения

xname - имя исключения, которое будет выполнено

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

§ xname - имя исключения как и в оператореraise

§ если класс сообщения не определен здесь, он должен быть определен в оператореfunction-pool вTOP include для функциональной группы через дополнениеmessage-id

§ установлены следующиеsy-переменные:sy-msgid,sy-msgty,sy-msgno иsy-msgv1 черезsy-msgv4. Они могут быть использованы в пределах программы запроса (после возвращения)

При выполнении оператораmessage ... raising поток управления зависит от типа сообщения и от того, обработано ли условие вызывающей программой (определенное в списке исключений в программе запроса):

§ Если условие обработано вызывающей программой, управление возвращается к вызывающей программе. Значения переменныхsy-msg установлены. Значения экспорта, который передаются по значению, не возвращены

§ Если условие не обработано вызывающей программой для типов сообщенийe,wиa, происходит выход из функционального модуля, и программа запроса немедленно завершается. Сообщение отображено, и список вывода пуст. Когда пользователь нажимает клавишуENTER, пустой список удаляется, и пользователь возвращается к экрану, из которого была вызвана программа

§ Если условие не обработано вызывающей программой для типа сообщенияi, в диалоговом окне отображается сообщение пользователю. Когда пользователь нажимает клавишуENTER, управление возвращается к функциональному модулю к оператору, следующему за операторомmessage. Функциональный модуль продолжает обрабатываться, и операторомendfunction управление возвращается к программе запроса. Значения переменныхsy-msg установлены, и значения экспорта, которые передаются по значению, возвращаются

§ Если условие не обработано вызывающей программой для типа сообщенияs, сообщение хранится в системной области. Управление продолжается в пределах функционального модуля в операторе, следующем за операторомmessage. Функциональный модуль продолжает обрабатываться, и операторомendfunction управление возвращается к программе запроса. Значения переменныхsy-msg установлены, и значения экспорта, которые передаются по значению, возвращаются. Когда отображается список, сообщение появляется внизу списка в строке состояния

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