Руководство для участников курса Версия курса 2й квартал 2005 г. Продолжительность курса 5 Дн. Номер материала 50072594
Скачать 38.91 Mb.
|
Глава 7: Подпрограммы в ABAP BC400 Урок: Подпрограммы Обзор урока На этом уроке рассматриваются цели и способы использования подпрограмм в рамках ABAP-программ. Кроме того, описывается возможность использования интерфейса подпрограмм для переноса параметров и применение различных видов переноса. Цели урока Прослушав этот урок, вы сможете • определять подпрограммы • вызывать подпрограммы • анализировать процесс выполнения подпрограмм в режиме отладки Практический пример Необходимо структурировать сложную программу и включить многократно используемый исходный текст в подпрограмму. Внутренняя модуляризация программы с использованием подпрограмм Рисунок 114: Использование подпрограмм (причины) 202 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 06-04-2006 BC400 Урок: Подпрограммы Подпрограмма представляет собой единицу модуляризации в рамках программы, в которую в форме исходного текста инкапсулируется определенная функция. Целью переноса частей программы в подпрограмму является упорядочение текста главной программы и возможность повторного использования соответствующей последовательности операторов (см. рисунок выше). Упорядочение является результатом ориентированности подпрограммы на определенную функцию и подразумевает разделение общей задачи на функциональные составляющие, для реализации каждой из которых создается отдельная подпрограмма. Использование подпрограмм также приводит к упрощению ведения текста, так как изменения часто должны вноситься только в одну подпрограмму (а не в различные места главной программы). Кроме того, при выполнении программы вызов подпрограммы может обрабатываться отладчиком как вызов “отдельного блока” с последующим анализом результатов. Это позволяет упростить нахождение источников ошибок. Рисунок 115: Перенос параметров (причины 1) 06-04-2006 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 203 Глава 7: Подпрограммы в ABAP BC400 Рисунок 116: Перенос параметров (причины 2) Все (глобальные) переменные, определенные в главной программе, могут использоваться и в подпрограмме. Однако для вызова подпрограмм в определенных ситуациях с различными объектами данных следует использовать не глобальные переменные, а метки-заполнители, которые при вызове подпрограммы заменяются требуемыми глобальными переменными. Такие метки-заполнители называются формальными параметрами и вместе с глобальными параметрами формируют интерфейс подпрограммы, который должен быть описан при определении подпрограммы. При вызове подпрограммы формальные параметры должны получать значения посредством соответствующих глобальных переменных (текущие параметры), что позволит использовать при обработке подпрограммы реальные переменные. Это присвоение формальным параметрам текущих параметров при вызове подпрограммы называется переносом параметров. 204 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 06-04-2006 BC400 Урок: Подпрограммы Рисунок 117: Способы переноса интерфейсных параметров Способ, при помощи которого выполняется перенос переменных главной программы в формальные параметры подпрограммы, называется типом переноса и указывается для каждого параметра в интерфейсе подпрограммы. Существуют три типа переноса: Вызов по значению Создается копия текущего параметра. Эта копия присваивается формальному параметру. Если в подпрограмме соответствующему формальному параметру присваивается некоторое значение, то это значение фактически будет присвоено копии формального параметра, а не его оригиналу. Этот тип переноса обеспечивает доступность глобальной переменной в подпрограммах (в форме копии переменной) без возможности изменения этой глобальной переменной (защита оригинала). Следует отметить, что создание копий, особенно для больших внутренних таблиц, может занять длительное время. 06-04-2006 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 205 Глава 7: Подпрограммы в ABAP BC400 Вызов по значению и результату Этот тип переноса включает в себя процедуру, описанную для “вызова по значению”. Однако при нормальном завершении подпрограммы значение, которое было изменено в ходе обработки, записывается в оригинал. В случае преждевременного прерывания программы посредством оператора STOP или сообщения пользователю типа Е перезапись значений подавляется. Этот тип переноса используется для переноса значения глобальной переменной в подпрограмму и записи полностью обработанного окончательного значения копии в оригинал. Однако необходимо иметь в виду, что создание копий и запись значений может занимать продолжительное время, особенно в случае больших внутренних таблиц. Вызов по ссылке Текущий параметр присваивается непосредственно формальному параметру. Это означает, что присвоение значений формальному параметру выполняется непосредственно для текущего параметра. Этот тип переноса используется при необходимости запуска подпрограммы непосредственно для указанного текущего параметра. Он часто применяется в целях предотвращения долговременного создания копий больших внутренних таблиц. 206 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 06-04-2006 BC400 Урок: Подпрограммы Рисунок 118: Определение и вызов подпрограмм • Подпрограмма вводится с использованием оператора FORM. • После оператора FORM указываются имя и интерфейс подпрограммы. • Далее следуют операторы подпрограммы. • Для завершения подпрограммы используется оператор ENDFORM. При определении интерфейса производится перечисление формальных параметров подпрограммы (в данном случае: f1, f2, f3) и, при необходимости, их ввод вручную. Для каждого параметра должен быть указан требуемый тип переноса: Вызов по значению Все формальные параметры, в отношении которых должен применяться тип переноса “вызов по значению” (здесь: f1), перечисляются с префиксом VALUE в разделе USING . (См. синтаксис на приведенном выше рисунке.) Вызов по значению и результату Все формальные параметры, в отношении которых должен применяться тип переноса “вызов по значению и результату” (в данном случае: f1), перечисляются с префиксом VALUE в разделе CHANGING . (См. синтаксис на приведенном выше рисунке.) 06-04-2006 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 207 Глава 7: Подпрограммы в ABAP BC400 Вызов по ссылке Все формальные параметры, в отношении которых должен применяться тип переноса “вызов по ссылке” (в данном случае: f3), перечисляются без префикса VALUE в разделе CHANGING . (См. синтаксис на приведенном выше рисунке.) Примечание: Параметр без префикса VALUE, размещенный в разделе USING , также имеет тип переноса “вызов по ссылке”. Однако такой синтаксис описания имеет смысл только для тех формальных параметров, переносимых в большие внутренние таблицы, которые не изменяются в подпрограмме (указываются с использованием USING), но должны передаваться посредством “вызова по ссылке” во избежание длительного создания копий. При вызове подпрограммы текущие параметры, переносимые без префикса VALUE , определяются при помощи USING или CHANGING. Порядок перечисления определяет их присвоение формальным параметрам. В примере, представленном на рисунке выше, значение a переносится в параметр f1, значение b – в параметр f2, а значения c – в параметр f3. Рисунок 119: Типизация интерфейсных параметров Формальный параметр подлежит родовой типизации, если он вводится с использованием выражения TYPE ANY или вообще не типизируется. В этот параметр могут быть перенесены текущие параметры любого типа. Во время выполнения при вызове подпрограммы тип текущего параметра 208 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 06-04-2006 BC400 Урок: Подпрограммы определяется и присваивается формальному параметру (наследование типа). Однако если операторы в подпрограмме не могут применяться в отношении наследуемого типа, может возникнуть динамическая ошибка (конфликт типов). Поэтому родовую типизацию можно использовать только в тех случаях, когда тип текущего параметра должен определяться при создании программы или если он может варьироваться во время выполнения (динамическое программирование). Точная типизация формального параметра реализуется посредством указания глобального или встроенного типа в дополнении TYPE. При этом указывается, что в подпрограмму должны быть переданы лишь текущие параметры определенного типа. Нарушения непротиворечивости типов между формальными и текущими параметрами выявляются при проверке синтаксиса. Это увеличивает стабильность программы, поскольку предотвращаются конфликты типов в операторах в рамках подпрограммы. При присвоении стандартных типов Р, N, C или X отсутствующий признак “ длина поля ” не наследуется из текущего параметра до начала выполнения. В случае этого типа полная типизация (т.е. включение длины поля) достигается при определении и указании локально определенных типов. Рисунок 120: Типизация интерфейсных параметров для структур и внутренних таблиц Формальные параметры для структур и внутренних таблиц должны быть типизированы в целях получения доступа к соответствующим компонентам. Параметры структурных компонентов уже известны в подпрограмме (после типизации), поэтому к ним можно обращаться с использованием обычного 06-04-2006 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 209 Глава 7: Подпрограммы в ABAP BC400 синтаксиса. Типизация табличных параметров позволяет указывать их в качестве внутренних таблиц с использованием обычного синтаксиса в подпрограмме. Рекомендация: Во избежание длительного копирования большие внутренние таблицы должны переноситься путем вызова по ссылке. Рисунок 121: Видимость глобальных и локальных объектов данных Переменные, определенные в главной программе, являются глобальными объектами данных. Они являются видимыми (т.е. к ним можно обращаться) в рамках всей главной программы и в каждой вызванной подпрограмме. Переменные, определенные в подпрограмме, называются локальными, поскольку существуют только в соответствующей подпрограмме, так же как и формальные параметры. Память для формальных параметров и локальных объектов данных присваивается только на время выполнения подпрограммы и после ее завершения освобождается. Формальные параметры и локальные объекты данных подпрограммы не могут иметь одинаковые имена. При наличии глобального объекта данных, имя которого совпадает с именем формального параметра или локального объекта данных, в рамках подпрограммы это имя будет указывать на формальный параметр или локальный объект данных, а вне подпрограммы 210 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 06-04-2006 BC400 Урок: Подпрограммы – на глобальный объект данных. Это называется правилом скрытия. В рамках подпрограммы локальные объекты данных “ скрывают ” глобальные объекты, имеющие те же самые имена. Для четкого выделения внутренних программных объектов можно использовать, например, следующие префиксы: f_ для “формальных параметров” и l_ для “локальных объектов данных”. Рисунок 122: Пример синтаксиса: перенос внутренней таблицы В приведенном выше примере внутренняя таблица it_flightinfo и глобальная переменная carrid переносятся путем вызова по ссылке, несмотря на то, что они не изменяются в подпрограмме. Преимуществом этого способа является отсутствие необходимости в создании копий. Для обработки внутренней таблицы должна существовать рабочая область с совместимым типом строк. Она определяется локально в подпрограмме со ссылкой на табличный параметр f_itab. Такая ссылка возможна из-за того, что переменная f_itab типизирована в интерфейсе подпрограммы. 06-04-2006 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 211 Глава 7: Подпрограммы в ABAP BC400 Рисунок 123: Внедрение вызова подпрограммы Можно использовать оператор PERFORM для вызова подпрограммы, сгенерированной в исходном тексте. Сначала следует определить подпрограмму, затем сохранить главную программу. Новая подпрограмма будет отображена в области навигации. Переместите ее к требуемой точке вызова в программе путем перетаскивания. После этого необходимо заменить формальные параметры в сгенерированном исходном тексте соответствующими текущими параметрами. (Кроме того, для генерации вызова также можно использовать кнопку “ Модель ” в ABAP-редакторе.) Преимущество генерации вызова заключается в устранении вероятности случайного опущения или неправильной расстановки параметров. 212 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 06-04-2006 BC400 Урок: Подпрограммы Рисунок 124: Подпрограммы в режиме отладки Если текущий оператор предполагает вызов подпрограммы, можно выполнить всю подпрограмму без остановок путем выбора Выполнить . Обработка останавливается только после завершения подпрограммы. Для остановки на первом операторе подпрограммы и более подробного отслеживания операций можно использовать опцию Отдельный шаг . Если текущий оператор располагается в подпрограмме, можно выполнить оставшуюся часть подпрограммы без остановки при помощи опции Возврат . Обработка останавливается только после завершения подпрограммы. 06-04-2006 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 213 Глава 7: Подпрограммы в ABAP BC400 214 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 06-04-2006 BC400 Урок: Подпрограммы Упражнение 11: Подпрограммы Цели упражнения Выполнив это упражнение, вы сможете • создавать подпрограммы • использовать интерфейс подпрограммы для переноса данных Практический пример Необходимо изменить имеющуюся программу так, чтобы исходный текст, на основе которого осуществляется вывод данных, был инкапсулирован в подпрограмму. Задание 1: Создание подпрограммы с табличными параметрами 1. Скопируйте программу ZBC400_##_SELECT_SFLIGHT_ITAB или соответствующий пример решения SAPBC400DDS_AUTHORITY_CHECK_2 в новую программу ZBC400_##_SUBROUTINE. 2. Перенесите текст вывода данных в подпрограмму. Для этого необходимо определить подпрограмму (рекомендуемое имя: WRITE_LIST) и ввести интерфейсный параметр для обеспечения возможности его переноса во внутреннюю таблицу, предназначенную для вывода данных. 3. Выведите данные из подпрограммы с использованием LOOP. Для этого в качестве локального объекта данных подпрограммы следует создать необходимую табличную рабочую область (рекомендуемое имя: wa). Задание 2: Вызов подпрограммы 1. После сортировки внутренней таблицы вызовите подпрограмму для вывода таблицы. 2. Выполните программу для проверки результатов. 06-04-2006 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 215 Глава 7: Подпрограммы в ABAP BC400 Решение 11: Подпрограммы Задание 1: Создание подпрограммы с табличными параметрами 1. Скопируйте программу ZBC400_##_SELECT_SFLIGHT_ITAB или соответствующий пример решения SAPBC400DDS_AUTHORITY_CHECK_2 в новую программу ZBC400_##_SUBROUTINE. a) Этот шаг выполняется в соответствии с обычной процедурой. 2. Перенесите текст вывода данных в подпрограмму. Для этого необходимо определить подпрограмму (рекомендуемое имя: WRITE_LIST) и ввести интерфейсный параметр для обеспечения возможности его переноса во внутреннюю таблицу, предназначенную для вывода данных. a) См. выдержку из исходного текста в примере решения. 3. Выведите данные из подпрограммы с использованием LOOP. Для этого в качестве локального объекта данных подпрограммы следует создать необходимую табличную рабочую область (рекомендуемое имя: wa). a) См. выдержку из исходного текста в примере решения. Задание 2: Вызов подпрограммы 1. После сортировки внутренней таблицы вызовите подпрограмму для вывода таблицы. a) См. выдержку из исходного текста в примере решения. 2. Выполните программу для проверки результатов. a) Этот шаг выполняется в соответствии с обычной процедурой. Результат Выдержка из исходного текста: SAPBC400PBS_SUBROUTINE REPORT sapbc400pbs_subroutine. CONTSTANTS actvt_display TYPE activ_auth VALUE ’03’. DATA: it_flight TYPE sbc400_t_sbc400focc, wa_flight LIKE LINE OF it_flight. Продолжение на следующей странице 216 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 06-04-2006 BC400 Урок: Подпрограммы PARAMETERS pa_car TYPE s_carr_id. * Authority Check: AUTHORITY-CHECK OBJECT ’S_CARRID’ ID ’CARRID’ FIELD pa_car ID ’ACTVT’ FIELD actvt_display. CASE sy-subrc. WHEN 0. " User is authorized SELECT carrid connid fldate seatsmax seatsocc FROM sflight INTO CORRESPONDING FIELDS OF wa_flight WHERE carrid = pa_car. wa_flight-percentage = 100 * wa_flight-seatsocc / wa_flight-seatsmax. APPEND wa_flight TO it_flight. ENDSELECT. IF sy-subrc = 0. SORT it_flight BY percentage. PERFORM write_list USING it_flight. ELSE. WRITE: ’No ’, pa_car, ’flights found !’. ENDIF. WHEN OTHERS. " User is not authorized WRITE: / ’Authority-Check Error’(001). ENDCASE. *&--------------------------------------------------------------* *& Form WRITE_LIST *&--------------------------------------------------------------* * --> P_IT_FLIGHT *---------------------------------------------------------------* FORM write_list USING p_it_flight TYPE sbc400_t_sbc400focc. DATA wa LIKE LINE OF p_it_flight. LOOP AT p_it_flight INTO wa. Продолжение на следующей странице 06-04-2006 © 2006 г. SAP AG All rights reserved. Авторские права защищены. 217 |