Академический Документы
Профессиональный Документы
Культура Документы
Ключевые слова:
разработка на ABAP / ABAP
Development / ABAP
Олег Точенюк
Точенюк Олег, консультант по SAPMM. Профессиональный опыт: занимал должности
консультанта по SAPММ в различных компаниях с 1997 года. Занимался внедрением модулей: FI-
FM(Контроль исполнения бюджета), ММ (Управление материальными потоками), СУС (WMS)
(Управление складом); занимал должность консультанта по интеграции MM<->ТОРО, участвовал в
разработках расширений системы на языке ABAP. Связаться со мной можно по адресу
uukrul@hotmail.com
SLIN - простая транзакция, которая позволяет быстро выполнить проверку качества написанного
кода для программы. Можно без трудностей проверить простые отчеты, но если нужно проверить
что-то «глобальное», то следует использовать транзакцию «Инспектор кода SAP». Создаваемую
программу можно проверить или запустив отдельно транзакцию SLIN, или же, находясь в
инспекторе кода (например, транзакция SE38 – ABAP редактор), выполнить по меню
последовательно: «Программа» – «Проверить» – «Расширенная проверка программы». При этом,
если вы находитесь в одном из модулей программы, система начнет проверку с базового модуля.
Например, имеем программа по формированию отчета, которая определенным способом
выбирает документы резервирований, она включает в себя несколько модулей, по которым
разнесена логика её работы. Находясь в редакторе кода, выбираем расширенную проверку
программы, Рисунок 15.
Рисунок 15: SE38-1
Будет запущена транзакция SLIN, куда будет автоматически подставлено имя программы
находящейся в редакторе кода в текущий момент. По умолчанию большинство позиций будет
отмечено для расширенной проверки, Рисунок 16. Любая расширенная проверка вашей
программы, покажет, что с точки зрения системы SAP, вы писать правильно не умете (если вы не
следуете правилу - предварительно запускать расширенную проверку для каждого вашего текста).
Рисунок 16: SLIN-0
Запустим проверку, отметив все галки в блоке «Проверки». Получим таблицу со списком данных
проверки. Так как сам по себе проверяемый отчет не слишком большой, то в данном случае
совсем уже критических предупреждений сравнительно немного, Рисунок 17. Данные в таблице
сгруппированы в три колонки:
Рисунок 17: SLIN-1
первая колонка содержит операции, которые с точки зрения системы являются критическими
далее идет колонка предупреждений
последняя (третья) колонка содержит информационные сообщения, когда вроде как все хорошо,
но системе есть что интересного вам сказать.
Для детального просмотра информации нужно сделать двойной клик мышью в интересующем
поле и система перейдет к экрану с детальной информации по проблемам.
Далее в колонке информации система покажет список параметров подпрограмм, для которых при
вызове не указан явный тип параметра, т.е. подпрограмма оформлена следующим образом:
Сообщение будет оформлено следующим образом, Рисунок 19. В общем виде, если тип не
важнее, рекомендуется указать директиву TYPE ANY, хотя в данном случае наверное более
правильно было бы указать TYPE matnr, т.е. явно сказать системе, что в данном параметре будет
передаваться код материала. В принципе, объявление параметров без явного указания типа,
тянется со старых версий. В новых версиях системы, настоятельно рекомендуется указывать типы
параметров, что позволит, на этапе компиляции получить ошибки неправильной передачи
параметров при вызове такой подпрограммы и избежать проблем в работе.
Рисунок 19: SLIN-3
Код отключения сообщения для параметра, который вы должны указать в строке, напротив
передаваемой переменной,– "#EC *
Рисунок 20: SLIN-4
Код отключения сообщения для параметра – "#EC *, который нужно поставить за именем
функционального модуля, например так: CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' "#EC *.
Сообщение будет подавлено. Наверное, хорошим тоном будет, все - таки обработка ошибок
работы функционального модуля, если разработчик предполагает, возврат ошибок работы
функции.
Исправление ошибки: Вставьте блок анализа не нулевого значения кода возврата системной
переменной SY-SUBRC после вызова любого функционального модуля, если модуль
предполагает возврат ошибок через эту системную переменную.
Предупреждения в данном поле возникают в том случае, если в программе объявлены текстовые
переменные, которые нигде не используются, Рисунок 22. Скрыть такие сообщения нельзя (SAP
настоятельно рекомендует удалять неиспользуемые текстовые переменные), в данном случае это
- код TEXT-303. Причина такого требования в том, что все текстовые переменные грузятся в
память при первом запуске программы и находятся постоянно в памяти. Если учесть, что
текстовые переменные находятся в каждом пуле функций и т.д., то результатом объявления
большого числа неиспользуемых текстовых переменных во всех этих программах будет занятая
бесполезными данными память.
Рисунок 22: SLIN-6
Основная проблема при использовании явного указания текстовых переменных в коде программы
- локализация кода, в случае если программа планируется к использованию в различных странах.
Общая рекомендация, наверное, все же такая: использовать символы текстовых переменных
вместо явного задания констант текста в программах с дальнейшим переводом всех текстовых
переменных на требуемые языки. При этом перевод может сделать посторонний человек и будет
полная уверенность, что в ходе перевода, тексты программ случайно не будут нарушены.
Исправление ошибки: Перенесите все тексты в область ведения текстов программы и далее
используйте ссылки на тексты вида TEXT-xxx. Как максимум, это возможно упростит перевод
программы в случае ее локализации на другие языки, и как минимум, для Украины перевод бывает
иногда очень актуален.
Вывод CURR/QUAN-полей – в системе SAP количество дробных знаков для полей типа сумма
определяется в настройке, поэтому, например, при выводе такого поля на экран, система требует,
чтобы был указан код валюты, который и определит, как выводить число. Кстати, именно поэтому
при создании, например, собственной таблицы в базе данных, если вы объявляете поле сумма
или количество, то не можете активировать таблицу, пока не укажете для таких полей ссылочное
поле, которое будет содержать тип единицы измерения. Более подробно как система работает с
данными типа CURR можно прочитать по ссылке: http://www.sapland.ru/qa/problema-ogranicheniya-
kolichestva-znakov-v-stoimosti-zakaza-moduli-mm-i-sd.html. Вывод строки суммы или количества без
указания ссылочной величины считается ошибкой и требует исправления. Текст, примера ошибки,
показан на Рисунке 23.
Рисунке 23: SLIN-7
Данную проверку можно отключать, для этого нужно использовать хинт: "#EC UOM_IN_MES,
который следует указать в строке, где используется, например, вывод количества, без ссылки на
единицу измерения.
Исправление ошибки: Код, который вызвал данную ошибку расширенного анализа, например,
такой:
Ну а для полей типа сумма следует указывать дополнение CURRENCY <код валюты>.
Рисунок
SLIN-8
24
Другой случай, когда система выдает такую ошибку, - это объявление переменной, заполнение ее
каким-то значением и затем неиспользование этой переменной. Например, код получения строки
курсора в экранной таблице обычно оформляется отдельной подпрограммой:
Рисунок 25: SLIN-9
Ошибки данной категории попадут в раздел информационных сообщений и не считаются
критическими.
Исправление ошибки: Удалите неиспользуемые макросы из текста программы, если это возможно,
или задайте хинт – "#EC NEEDED для скрытия предупреждения. Пустые подпрограммы также
удалите, если их реализация не предполагается. Как и в предыдущем случае улучшается
читаемость кода и его размер.
Рисунок
SLIN-10
26:
Проблема заключается в том, что ключ группы объявлен как 001. Не знаю, почему этого нельзя
делать, может у SAP есть какие-то виды на то каким должно быть имя группы.
Исправление ошибки: Используйте буквенные имена групп или хотя бы начинайте имя группы с
буквы, например – P01 вместо имени – 001, это снимет проблему или используйте хинт,
отключения данного предупреждения – "#EC *.
Проверка размеров загрузки – Встретить такие проблемы, наверное сложно, если конечно вы не
пишите очередной IS (индастир солюшен) в своей области, но ограничения в программах бывают
разные, поэтому вы должны знать, что размер выполняемого кода, количество переменных,
констант и т.д. объявленных в вашей программе имеет определенный предел. Система,
анализирует размеры вашего кода и при достижении границы в 90% выдается информационное
сообщение, на границе 95% выдается предупреждение, при достижении 98% будет выдаваться
ошибка. Общие ограничения в системе следующие:
1. Общий используемый размер адресации программы не должен превышать – 2 097 152 байт, при
этом не забываем, что комментарии по тексту программ, тоже входят в эти байты.
2. Количество констант в программе – 16 384 штук.
3. Количество переменных в программе – 16 384 штук.
4. Literals – 65 536 байт.
5. Количество описанных структур – 65 536 штук.
6. Количество используемых объявлений INCLUDE – 4 000 вызовов.
При этом достигать порога в 90% очень не советую, рекомендуется, как минимум оставлять зазор
в 10% на внутренние нужды, как самой системы, так и на свои же дальнейшие корректировки и
исправления этого кода.
Исправление ошибки: Если вы написали в рамках одной программы почти 2 Гб кода, с кучей
переменных, то вы очень плодовитый ABAP-программист и теперь для вас пришло время, когда
пора как-то подумать о том, чтобы правильно структурировать все написанное и привести его в
читабельный вид. Как это сделать? Вынесите часть кода во внешние программы, которые будут
вызваться через SUBMIT, или перенесите некоторую часть кода в группы функций или глобальные
классы.
Также проверяются доступные к использованию форматы даты и разделители между полей даты.
Рисунок
SLIN-11
27:
Исправление ошибки: Постарайтесь избегать объявления переменных в секциях MODULE /
ENDMODULE. Если же такое пришлось сделать по каким-либо причинам, то подавить вывод этого
предупреждения можно используя хинт – "#EC *.
Расширения структур – Начиная с версии, наверное, ECC 5.0 (точно, что в текущей версии ECC
6.0), при объявлении структур или собственных таблиц в базе данных, система требует при
активации определить категорию расширения создаваемой структуры/таблицы. Так вот если при
создании разрешить расширение структуры, то при использовании переменной типа созданной
структуры система будет выдать ошибку при расширенной проверке, суть которой сводится к тому,
что в случае расширения структуры или таблицы могут возникнуть проблемы с размерами
структур в программе, имеющими тип структуры, созданной в словаре. В общем виде, раньше,
когда программы в системе были не компилированные, такой проблемы быть в принципе не могло.
Сейчас же, по факту дополнения структуры, возможно, придется в ручном режиме
перегенерировать исходные коды, в которых встречается объявления переменных типа
расширенной структуры.
Рисунок 27: SLIN-12
Исправление ошибки: При объявлении собственных структур в словаре данных, выбирайте
признак расширения структуры – «Без расширения».
Рисунок
SLIN-13
28:
Исправление ошибки: Наверное, вдумчиво пересмотреть используемые наборы команд системы
и перейти на одобренные лучшими «Абаповодами» новые правила языка ABAP.
Пакетная проверка – насколько я понимаю, проверяются ссылки на структуры ABAP-словаря:
являются ли эти ссылки существующими в системы и являются ли они активными.
Общие для программ тесты – Проверятся циклы LOOP.. ASSIGNING , на предмет
переопределения ссылки или ее деинициализации через UNASSIGN внутри цикла. Проверяются
операторы, приводящие к вызову COMMIT WORK внутри цикла выбора данных, используя
операции SELECT. Так же проверяется изменение параметров подпрограммы объявленных через
USING, при вызове которых передаются константы, например, такой код, вызовет ошибку проверки
синтаксиса:
Транзакция расширенной проверки программы SLIN неплохо справляется в случае проверки одной
программы, даже возможно и большой, но если в разработке участвуют несколько человек,
которые пишут не одну программу, а на пример это группа программ включающая в себя как
диалоговые модули так и различные отчеты, то использовать отдельно для каждой программы
расширенную проверку по отдельности не очень удобно. Поэтому SAP разработал отдельный
расширенный анализатор кода, транзакция «SCI – SAP инспектор кода», который позволяет
выполнить проверку группы разработок, имеет возможность настроить точные параметры
проверки в группе и т.д. Центральный экран транзакции SCI показан на Рисунке 29. Данная
транзакция доступна с версии 6.0, для более ранних версий ее можно загрузить отдельно,
используя ноту 543359.
Рисунке 29: SCI-1
В общем виде требуется создать вариант проверки программ, включающий в себя список
объектов, которые будут проверяться и вариант параметров проверки. Все это объединяется под
общим именем инспекции, но если нужно быстро проверить какой-то объект, то можно и не
создавать инспекцию для проверки, поэтому рассмотрим оба варианта работы транзакции.
Простой метод, не вводим в блоке «инспекция» никакого имени, а сразу нажимаем кнопку
создания проверки, другой вариант быстрого перехода к проверке это использование транзакции
SCII – Инспектор кода: инспекция, результат будет такой же, мы попадем на экран задания
объекта и параметров проверки кода.
Рисунок 30: SCI-2
Система перейдет к следующему экрану, где запросит у вас имя объекта для проверки параметров
выполнения, т.е. собственно говоря, спросит, как будем проверять. Фактически, данное дерево
проверки, содержит данные транзакции SLIN, но содержит дополнительные параметры по
управлению анализом кода. Стандартно некоторые ветки в дереве уже будут отмечены, однако
если галка стоит на более высоком уровне дерева, это не значит, что все ответвления ниже также
отмечены для варианта обработки, Рисунок 31.
Рисунок 31: SCI-3
Примечание: Параметры проверки, выполняемые в транзакции SLIN, находятся в данном дереве
отдельным пунктом по пути: «Проверка синт./Генерация» – «Расшир. проверка программы», там
же можно задать галки аналогичные транзакции SLIN.
На данном экране можно: или выбрать уже созданный вариант набора объектов; указать объекты,
находящиеся в общем запросе, или указать непосредственно программу или группу функций для
проверки; тип объекта выбирается из выпадающего списка. Далее можно выбрать уже созданный
ранее вариант параметров проверки или выбрать вариант временного определения и задать
нужные галки непосредственно в дереве ниже. Затем, когда мы определили объект проверки и
правила проверки, можно запустить саму проверку, Рисунок 32.
Рисунок 32: SCI-4
Результат проверки будет представлен в виде дерева, по аналогии с информацией транзакции
SLIN, например, в данном случае, как видим, критическим с точки зрения системы является
задание текстов непосредственно в тексте программы, без использования текстовых элементов,
Рисунок 33.
Рисунок 33: SCI-5
Фактически получаем те же данные, что и для транзакции SLIN, однако в отличие от нее, данная
транзакция может быть преднастроена на то, какие ошибки считать критическими, какие
предупреждением, а что считать информацией. К сожалению, не все сообщения можно
настраивать, но что-то в реакции системы можно регулировать. Для этого на первом экране
транзакции SCI нужно перейти по меню «Перейти к» – «Управление» – «Приоритеты сообщений»,
Рисунок 34. Например, если для таблицы в операции SELECT не заданы ограничения выбора в
WHERE, то система, по умолчанию, выдает сообщение класса – предупреждение.
Рисунок 34: SCI-12
Для изменения реакции, соответствующей выбранному действию, можно просто кликнуть мышью
на значёк предупреждения, в данном случае это - желтый треугольник, и в появившемся окне
система предложит вам выбрать новую реакцию на данный код. Например, можем задать, чтобы
выдавалось сообщение об ошибке, Рисунок 35. В колонке рядом, «Актуальный приоритет»,
система покажет, что текущая настройка отсутствия команды WHERE при использовании
оператора SELECT – критическая ошибка.
Рисунок 35: SCI-13
Что в этой настройке неудобно, так это то, что настройка реакции выполняется глобально и не
зависит от варианта, т.е в данном случае система будет для всех тестов выдавать критическую
ошибку, при отсутствии ограничений для оператора SELECT.
Вариант проверки: Вводим имя варианта и нажимаем создать вариант, система перейдет к
дереву, в котором нужно задать те проверки, которые мы считаем правильными для своей
разработки. После отметок нужных текстов сохраним вариант, Рисунок 36. В отличии от
транзакции SLIN, при формировании параметров проверки в транзакции SCI, можно более гибко
управлять параметрами проверки данных.
Рисунок 36: SCI-7
Например, стандартно система считает, что переменные параметров для оператора PERFROM
должны начинаться с префикса P_, а это значит, что если у вас параметры будут начинаться с
другого префикса, то система будет выдавать информационное предупреждение о не
согласованности в именах переменных. Я предпочитаю чуть изменить такое соглашение.
Например, начинать параметры для простых переменных, с префикса – P_, параметры структур –
PS_, параметры таблиц – PT_. Теперь нужно объяснить системе наши соглашения по именам. Для
этого нужно перейти к атрибутам проверки и ввести свои параметры соглашений, напротив
каждого теста, есть колонка «Атрибуты» и кнопка перехода к ведению атрибутов, Рисунок 37.
Рисунок 37: SCI-10
Нажав данную кнопку, получим большой список соглашений по всем параметрам, находим блок,
относящийся к параметрам вызова подпрограмм, Рисунок 38. Как видим, предпочтения по именам
делятся в разрезе USING / CHANGING / TABLES. В данном случае, можем добавить в параметры
USING / CHANGING свой тип PS_*, а значение в TABLES-параметра заменить на PT_*, ну и если
имеются какие-то предпочтения по именам подпрограмм, то можно заполнить поле FORM, т.е.
фактически мы говорим какие соглашения по именам считать правильными.
Рисунок 38: SCI-11
Таким образом, можно настроить инспектор кода под правила разработки, которые существуют в
вашей компании, ну если конечно они существуют.
Набор объектов: Создадим вариант, включающий в себя объекты проверки. В набор можно
включить отдельные программы и группы функций, также можно и определить более сложные
варианты выбора объектов кода для проверки, например, если уже есть созданные ранее наборы
объектов, то можно их объединить в новом варианте и т.д. В общем, вариантов включения
объектов кода для проверки существует масса, Рисунок 39.
Рисунок 39: SCI-7
Создав вариант включения объектов, сохраним его, аналогично варианту проверки данных, и
теперь можно объединить вариант проверки с вариантов набора объектов, создав инспекцию
проверки данных.
Рисунок 41: SCI-9
Параметры вывода результатов проверки будут представлены деревом. Просмотреть результат
можно в любой момент, нужно только ввести имя варианта инспекции и нажать кнопку просмотра
«Результаты». Также можно создать новый вариант запуска анализатора или удалить старые
варианты, Рисунок 42. Двойной клик мышью на тексте сообщения позволяет перейти к просмотру
текста программы, которая сгенерировала это сообщение. Кнопка информации выдает краткую
справку о причинах реакции системы и небольшие разъяснения о причинах, и как можно исправить
и отключить данное сообщение. Не все сообщения можно отключать.
Рисунок 42: SCI-14
Примечание: Транзакции SLIN и SCI анализируют написанный код. Кроме функции приведения
кода к общему стандартному виду, что само по себе немаловажно, данные транзакции позволяют
предварительно определить критические с точки зрения производительности места в программах,
без их непосредственного выполнения (фактически это потенциально критические места).
Фактические узкие места, в работе программ, анализируются другими методами, например,
включением трассировки выполнения программы и т.д.