Читайте также: |
|
Для решения задачи 2 см. исходный текст программы:
SAPBC400DDS_AUTHORITY_CHECK_2
Резюмепоуроку
Теперь вы сможете:
• пояснять концепцию полномочий SAP
• внедрять проверки полномочий
Резюмепоглаве
Теперь вы сможете:
• перечислять различные методы поиска соответствующих таблиц баз данных
• реализовывать доступ для чтения к определенным столбцам и строкам в таблице базы данных
• описывать различные способы получения доступа для чтения к нескольким таблицам базы данных
• пояснять концепцию полномочий SAP
• внедрять проверки полномочий
Дополнительная информация
... См. онлайн-документацию к соответствующим ABAP-операторам.
Глава 6
Инструментальные средства для анализа программ
Обзор главы
См. цели отдельных уроков в рамках этого раздела.
Прослушав эту главу, вы сможете
• пояснять цель использования динамического анализа и проверки кода
• перечислять основные функции динамического анализа и проверки кода
• использовать эти инструменты для выполнения простого анализа программ
Содержание главы
Урок: Динамический анализ и проверка кода...........................190
Урок: Динамический анализ и проверка кода
Обзор урока
На этом уроке рассматриваются базовые функции и цели использования динамического анализа и проверки кода – инструментов, предназначенных для анализа программ. Здесь представлено краткое введение в эти инструментальные средства. Более подробная информация содержится в соответствующей документации и курсах для продвинутых пользователей.
Прослушав этот урок, вы сможете
• пояснять цель использования динамического анализа и проверки кода
• перечислять основные функции динамического анализа и проверки кода
• использовать эти инструменты для выполнения простого анализа программ
Практический пример
Необходимо проверить программы с точки зрения производительности, типичных семантических ошибок программирования и эффективности защиты.
Динамический анализ
Динамический анализ позволяет измерить рабочие характеристики программ и получить подробный отчет о производительности. Эта функция может использоваться для поиска в программе блоков исходного текста с низкой производительностью и их “корректировки”.
Однако всегда следует иметь в виду, что результаты измерения зависят от существующей системы и сетевой нагрузки, а также от текущего табличного буфера и набора данных. Динамический анализ выполняется главным образом в системе разработок или тестирования, что следует учитывать при работе с его результатами.
Рисунок 108: Выполнение динамического анализа
На приведенном выше рисунке представлен первый экран динамического анализа (среда измерения).
Введите краткое описание измерения. После этого можно выбрать определенные измерения из числа уже выполненных и сравнить их друг с другом на более позднем этапе.
Также существует возможность измерения времени выполнения программ, транзакций и функциональных модулей. Выберите необходимый тип и введите имя объекта измерения.
При вводе варианта могут быть указаны операции, которые должны быть измерены, и соответствующие компоненты программы. По умолчанию для проведения измерений используется стандартный вариант DEFAULT,
поставляемый SAP. При необходимости также можно создать собственные варианты и выбрать их для измерений.
Для запуска динамического анализа выберите Выполнить. Сгенерированные результаты измерений сохраняются в связанном файле.
Рисунок 109: Оценка результатов динамического анализа
Кнопка Анализ используется для вывода относительных и абсолютных оценок результатов выполненных измерений. В данном случае выполненные операции разделены на три области:
ABAP
Все ABAP-операторы, кроме операторов доступа к базе данных.
База данных
Все операторы доступа к базе данных.
Система
Операция загрузки программы, генерация (при необходимости), а также другие системные операции.
Для перехода к подробному экрану нажмите кнопку Список совпадений. На этом экране представлен список всех операций, каждой из которых присвоено время выполнения брутто или нетто. Значение брутто соответствует общему времени выполнения операции, а значение нетто обозначает часть времени брутто, которая не указывается отдельно как время выполнения подопераций.
Существует возможность просмотра связанного с операцией
ABAP-оператора путем выделения требуемой операции и нажатия кнопки
Просмотр исходного текста.
Рекомендация: При выборе опции Советы и рекомендации на первом экране динамического анализа будет отображена демонстрационная среда, в которой приведены полезные советы по производительности, проиллюстрированные посредством сравнения времени выполнения различных исходных кодов.
Проверка кода
Функция Проверка кода может использоваться для анализа программ на предмет производительности, защиты и типичных семантических ошибок. Для более подробного пояснения этих трех аспектов ниже перечислены некоторые критерии такой проверки:
Производительность
Используются ли индексы для доступа к базе данных?
Вложены ли операторы SELECT в циклы?
Защита
Считываются ли данные из манданта, отличного от манданта входа в систему?
Являются ли таблица базы данных или выражение WHERE
динамически определяемыми в операторе SELECT?
Типичные семантические ошибки
Проверяется ли поле sy-subrc после каждого оператора
AUTHORITY-CHECK?
Действительно ли указывается мандант в CLIENT SPECIFIED?
Выводятся ли несколько сообщений типа Е (сообщения E) в прямой последовательности?
На следующем рисунке иллюстрируется процесс вызова функции проверки кода для существующей программы:
Рисунок 110: Вызов функции проверки кода
Результатом проверки кода будет являться список ошибок и предупреждающих сообщений. Кнопка "i" в сообщении позволяет просмотреть подробное описание ошибки и ознакомиться с рекомендациями по ее устранению. Для перехода к соответствующему оператору программы можно дважды щелкнуть по тексту ошибки.
Для проведения отдельной проверки можно использовать транзакцию
SCI (см. рисунок выше). Для этого в SCI необходимо определить следующее:
• вариант проверки, используемый для указания того, насколько проверка является детальной;
• набор объектов для определения объектов, которые подлежат проверке
(например, все программы пакета);
• проверки, которая включает в себя определенный вариант проверки и набор объектов.
Рекомендация: Варианты проверки, наборы объектов и проверки могут создаваться как личные или общедоступные. Для переключения между двумя типами следует использовать кнопку, которая всегда размещается перед полем ввода. Следует отметить, что личные объекты могут использоваться только конкретным пользователем, в то время как общедоступные объекты – всеми пользователями системы.
Для выполнения созданной проверки следует нажать соответствующую кнопку. Кнопка Результаты служит для перехода к результатам проверки.
На следующем рисунке представлен пример варианта проверки:
Резюмепоуроку
Теперь вы сможете:
• пояснять цель использования динамического анализа и проверки кода
• перечислять основные функции динамического анализа и проверки кода
• использовать эти инструменты для выполнения простого анализа программ
Дополнительная информация
• Более подробная информация содержится в онлайн-документации по инструментам ABAP-инструментальных средств.
Резюмепоглаве
Теперь вы сможете:
• пояснять цель использования динамического анализа и проверки кода
• перечислять основные функции динамического анализа и проверки кода
• использовать эти инструменты для выполнения простого анализа программ
Дополнительная информация
... См. онлайн-документацию к ABAP-инструментальным средствам.
Глава 7
Подпрограммы в ABAP
Обзор главы
См. цели отдельных уроков в рамках этого раздела.
Прослушав эту главу, вы сможете
• определять подпрограммы
• вызывать подпрограммы
• анализировать процесс выполнения подпрограмм в режиме отладки
Содержание главы
Урок: Подпрограммы..........................................................202
Упражнение 11: Подпрограммы........................................215
Урок: Подпрограммы
Обзор урока
На этом уроке рассматриваются цели и способы использования подпрограмм в рамках ABAP-программ. Кроме того, описывается возможность использования интерфейса подпрограмм для переноса параметров и применение различных видов переноса.
Целиурока
Прослушав этот урок, вы сможете
• определять подпрограммы
• вызывать подпрограммы
• анализировать процесс выполнения подпрограмм в режиме отладки
Практический пример
Необходимо структурировать сложную программу и включить многократно используемый исходный текст в подпрограмму.
Внутренняя модуляризация программы с использованием подпрограмм
Рисунок 114: Использование подпрограмм (причины)
Подпрограмма представляет собой единицу модуляризации в рамках программы, в которую в форме исходного текста инкапсулируется определенная функция. Целью переноса частей программы в подпрограмму является упорядочение текста главной программы и возможность повторного использования соответствующей последовательности операторов (см. рисунок выше).
Упорядочение является результатом ориентированности подпрограммы на определенную функцию и подразумевает разделение общей задачи на функциональные составляющие, для реализации каждой из которых создается отдельная подпрограмма.
Использование подпрограмм также приводит к упрощению ведения текста, так как изменения часто должны вноситься только в одну подпрограмму (а не в различные места главной программы). Кроме того, при выполнении программы вызов подпрограммы может обрабатываться отладчиком как вызов “отдельного блока” с последующим анализом результатов. Это позволяет упростить нахождение источников ошибок.
Рисунок 115: Перенос параметров (причины 1)
Все (глобальные) переменные, определенные в главной программе, могут использоваться и в подпрограмме. Однако для вызова подпрограмм в определенных ситуациях с различными объектами данных следует
использовать не глобальные переменные, а метки-заполнители, которые при
вызове подпрограммы заменяются требуемыми глобальными переменными. Такие метки-заполнители называются формальными параметрами и вместе с глобальными параметрами формируют интерфейс подпрограммы, который должен быть описан при определении подпрограммы.
При вызове подпрограммы формальные параметры должны получать значения посредством соответствующих глобальных переменных (текущие параметры), что позволит использовать при обработке подпрограммы реальные переменные. Это присвоение формальным параметрам текущих параметров при вызове подпрограммы называется переносом параметров.
Способ, при помощи которого выполняется перенос переменных главной программы в формальные параметры подпрограммы, называется типом переноса и указывается для каждого параметра в интерфейсе подпрограммы.
Существуют три типа переноса:
Вызов по значению
Создается копия текущего параметра. Эта копия присваивается формальному параметру. Если в подпрограмме соответствующему формальному параметру присваивается некоторое значение, то это значение фактически будет присвоено копии формального параметра, а не его оригиналу.
Этот тип переноса обеспечивает доступность глобальной переменной в подпрограммах (в форме копии переменной) без возможности изменения этой глобальной переменной (защита оригинала). Следует отметить, что создание копий, особенно для больших внутренних таблиц, может занять длительное время.
Вызов по значению и результату
Этот тип переноса включает в себя процедуру, описанную для “вызова по значению”. Однако при нормальном завершении подпрограммы значение, которое было изменено в ходе обработки, записывается
в оригинал. В случае преждевременного прерывания программы посредством оператора STOP или сообщения пользователю типа Е перезапись значений подавляется.
Этот тип переноса используется для переноса значения глобальной переменной в подпрограмму и записи полностью обработанного окончательного значения копии в оригинал. Однако необходимо иметь в виду, что создание копий и запись значений может занимать продолжительное время, особенно в случае больших внутренних таблиц.
Вызов по ссылке
Текущий параметр присваивается непосредственно формальному параметру. Это означает, что присвоение значений формальному параметру выполняется непосредственно для текущего параметра.
Этот тип переноса используется при необходимости запуска подпрограммы непосредственно для указанного текущего параметра. Он часто применяется в целях предотвращения долговременного создания копий больших внутренних таблиц.
• Подпрограмма вводится с использованием оператора FORM.
• После оператора FORM указываются имя и интерфейс подпрограммы.
• Далее следуют операторы подпрограммы.
• Для завершения подпрограммы используется оператор ENDFORM.
При определении интерфейса производится перечисление формальных параметров подпрограммы (в данном случае: f1, f2, f3) и, при необходимости, их ввод вручную. Для каждого параметра должен быть указан требуемый тип переноса:
Вызов по значению
Все формальные параметры, в отношении которых должен применяться тип переноса “вызов по значению” (здесь: f1), перечисляются с префиксом VALUE в разделе USING. (См. синтаксис на приведенном выше рисунке.)
Вызов по значению и результату
Все формальные параметры, в отношении которых должен применяться тип переноса “вызов по значению и результату” (в данном случае:
f1), перечисляются с префиксом VALUE в разделе CHANGING. (См.
синтаксис на приведенном выше рисунке.)
Вызов по ссылке
Все формальные параметры, в отношении которых должен применяться тип переноса “вызов по ссылке” (в данном случае: f3), перечисляются без префикса VALUE в разделе CHANGING. (См. синтаксис на приведенном выше рисунке.)
Примечание: Параметр без префикса VALUE, размещенный в разделе USING, также имеет тип переноса “вызов по ссылке”. Однако такой синтаксис описания имеет смысл только для тех формальных параметров, переносимых в большие внутренние
таблицы, которые не изменяются в подпрограмме (указываются с использованием USING), но должны передаваться посредством “вызова по ссылке” во избежание длительного создания копий.
При вызове подпрограммы текущие параметры, переносимые без префикса VALUE, определяются при помощи USING или CHANGING. Порядок перечисления определяет их присвоение формальным параметрам. В примере, представленном на рисунке выше, значение a переносится в параметр f1, значение b – в параметр f2, а значения c – в параметр f3.
Рисунок 119: Типизация интерфейсных параметров
Формальный параметр подлежит родовой типизации, если он вводится с использованием выражения TYPE ANY или вообще не типизируется. В этот параметр могут быть перенесены текущие параметры любого типа. Во время выполнения при вызове подпрограммы тип текущего параметра
определяется и присваивается формальному параметру (наследование типа). Однако если операторы в подпрограмме не могут применяться в отношении наследуемого типа, может возникнуть динамическая ошибка (конфликт типов). Поэтому родовую типизацию можно использовать только в тех случаях, когда тип текущего параметра должен определяться при создании программы или если он может варьироваться во время выполнения (динамическое программирование).
Точная типизация формального параметра реализуется посредством указания глобального или встроенного типа в дополнении TYPE. При этом указывается, что в подпрограмму должны быть переданы лишь текущие параметры определенного типа. Нарушения непротиворечивости типов между формальными и текущими параметрами выявляются при
проверке синтаксиса. Это увеличивает стабильность программы, поскольку предотвращаются конфликты типов в операторах в рамках подпрограммы.
При присвоении стандартных типов Р, N, C или X отсутствующий признак “ длина поля ” не наследуется из текущего параметра до начала выполнения. В случае этого типа полная типизация (т.е. включение длины поля) достигается при определении и указании локально определенных типов.
Рисунок 120: Типизация интерфейсных параметров для структур и внутренних таблиц
Формальные параметры для структур и внутренних таблиц должны быть типизированы в целях получения доступа к соответствующим компонентам. Параметры структурных компонентов уже известны в подпрограмме (после типизации), поэтому к ним можно обращаться с использованием обычного
синтаксиса. Типизация табличных параметров позволяет указывать их в качестве внутренних таблиц с использованием обычного синтаксиса в подпрограмме.
Рекомендация: Во избежание длительного копирования большие внутренние таблицы должны переноситься путем вызова по ссылке.
Рисунок 121: Видимость глобальных и локальных объектов данных
Переменные, определенные в главной программе, являются глобальными объектами данных. Они являются видимыми (т.е. к ним можно обращаться) в рамках всей главной программы и в каждой вызванной подпрограмме.
Переменные, определенные в подпрограмме, называются локальными, поскольку существуют только в соответствующей подпрограмме, так же как и формальные параметры. Память для формальных параметров и локальных объектов данных присваивается только на время выполнения подпрограммы и после ее завершения освобождается.
Формальные параметры и локальные объекты данных подпрограммы не могут иметь одинаковые имена. При наличии глобального объекта данных, имя которого совпадает с именем формального параметра или локального объекта данных, в рамках подпрограммы это имя будет указывать на формальный параметр или локальный объект данных, а вне подпрограммы
– на глобальный объект данных. Это называется правилом скрытия. В рамках подпрограммы локальные объекты данных “ скрывают ” глобальные объекты, имеющие те же самые имена.
Для четкого выделения внутренних программных объектов можно использовать, например, следующие префиксы:
f_... для “формальных параметров” и
l_... для “локальных объектов данных”.
Рисунок 122: Пример синтаксиса: перенос внутренней таблицы
В приведенном выше примере внутренняя таблица it_flightinfo и глобальная переменная carrid переносятся путем вызова по ссылке, несмотря на то, что они не изменяются в подпрограмме. Преимуществом этого способа является отсутствие необходимости в создании копий.
Для обработки внутренней таблицы должна существовать рабочая область с совместимым типом строк. Она определяется локально в подпрограмме со ссылкой на табличный параметр f_itab. Такая ссылка возможна из-за того, что переменная f_itab типизирована в интерфейсе подпрограммы.
Можно использовать оператор PERFORM для вызова подпрограммы, сгенерированной в исходном тексте. Сначала следует определить подпрограмму, затем сохранить главную программу. Новая подпрограмма будет отображена в области навигации. Переместите ее к требуемой точке вызова в программе путем перетаскивания. После этого необходимо заменить формальные параметры в сгенерированном исходном тексте соответствующими текущими параметрами.
(Кроме того, для генерации вызова также можно использовать кнопку “
Модель ” в ABAP-редакторе.)
Преимущество генерации вызова заключается в устранении вероятности случайного опущения или неправильной расстановки параметров.
Если текущий оператор предполагает вызов подпрограммы, можно выполнить всю подпрограмму без остановок путем выбора Выполнить. Обработка останавливается только после завершения подпрограммы.
Для остановки на первом операторе подпрограммы и более подробного отслеживания операций можно использовать опцию Отдельный шаг.
Если текущий оператор располагается в подпрограмме, можно выполнить оставшуюся часть подпрограммы без остановки при помощи опции Возврат. Обработка останавливается только после завершения подпрограммы.
Упражнение 11: Подпрограммы
Цели упражнения
Выполнив это упражнение, вы сможете
• создавать подпрограммы
• использовать интерфейс подпрограммы для переноса данных
Практический пример
Необходимо изменить имеющуюся программу так, чтобы исходный текст,
на основе которого осуществляется вывод данных, был инкапсулирован в подпрограмму.
Задание 1:
Создание подпрограммы с табличными параметрами
1. Скопируйте программу ZBC400_##_SELECT_SFLIGHT_ITAB или соответствующий пример решения SAPBC400DDS_AUTHORITY_CHECK_2 в новую
программу ZBC400_##_SUBROUTINE.
2. Перенесите текст вывода данных в подпрограмму.
Для этого необходимо определить подпрограмму (рекомендуемое имя: WRITE_LIST) и ввести интерфейсный параметр для обеспечения возможности его переноса во внутреннюю таблицу, предназначенную для вывода данных.
3. Выведите данные из подпрограммы с использованием LOOP. Для этого в качестве локального объекта данных подпрограммы следует создать необходимую табличную рабочую область (рекомендуемое имя: wa).
Задание 2:
Вызов подпрограммы
1. После сортировки внутренней таблицы вызовите подпрограмму для вывода таблицы.
2. Выполните программу для проверки результатов.
Решение 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.
Продолжение на следующей странице
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.
Дата добавления: 2015-11-16; просмотров: 53 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
ID ’ACTVT’ FIELD ’02’. | | | PERFORM write_list USING it_flight. |