Иногда удобно найти записи в таблице используя бинарный поиск. Конструкция LOOP AT … BINARY SEARCH в ABAP отсутствует, но можно ее смоделировать. При выполнении READ TABLE … BINARY SEARCH, в переменную sy-tabix возвращается индекс первой найденной строки. Для поиска остальных строк необходимо считать следующие строки проверить в них значения ключевых полей.
Читать дальше…Структурная печать XML документа
На ABAP уровне XML документы обычно не содержат разделители между тэгами, т.е. содержимое XML представлено в виде одной строки. Это не мешает работать программе, но если потребуется вывести XML на просмотр или сохранить в файл, то он будет не читаемый. Повысить читаемость можно если каждый новый тэг писать на новой строке и делать отступ, соответствующий уровню иерархии тэга. Ниже представлен код, который делает структурную печать XML строки.
Читать дальше…Произношение текста через ABAP
Оказывается, в SAP можно получить доступ к голосовому ассистенту
1 2 3 4 5 6 7 8 9 10 11 12 |
INCLUDE ole2incl. DATA ole TYPE ole2_object. DATA voice TYPE ole2_object. CREATE OBJECT voice 'SAPI.SpVoice'. CALL METHOD OF voice 'speak' = ole EXPORTING #1 = 'Привет, мир'. |
Не устанавливается точка прерывания в Eclipse
Если вы используете Eclipse или HANA Studio как IDE для ABAP, но при этом пользуетесь классическим отладчиком, то возможно вы сталкивались с проблемой когда /h и BREAK-POINT не запускают отладку, а при попытке установить точку прерывания возникает ошибка ED701: Невозможно установ. точки прерыв. из-за внеш. контекста (—> подр. текст). На английском звучит так: Breakpoints cannot be set because of external context (—> long text).
Читать дальше…Передача INITIAL значений в ABAP Proxy
Недавно я настраивал интеграцию одного сервиса, где из SAP необходимо было передать набор полей, часть из которых были необязательны к заполнению. На стороне ABAP использовался класс, сгенерированный на основе WSDL поставщика. До определенного момента все работало хорошо. Проблемы начались, когда потребовалось передать в опциональном параметре значение по умолчанию (INITIAL). В этом случае сгенерированная полезная нагрузка не содержала нужных тегов в окончательном XML-документе. Из-за отсутствия тэгов, сервер возвращал ошибку передачи данных.
Читать дальше…Извлечение уникальных значений из внутренней таблицы
Начиная с версии ABAP 7.4 появилась возможность быстро и эффективно извлечь уникальные значения определенного столбца из таблицы.
В общем случае код выглядит следующим образом
1 2 3 4 5 6 7 8 |
DATA lt_unique TYPE STANDARD TABLE OF fieldtype. lt_unique = VALUE #( FOR GROUPS value OF <line> IN it_itab GROUP BY <line>-field WITHOUT MEMBERS ( value ) ). |
Ниже примеры извлечения таблицы и ренджа уникальных значений TADIR-DEVCLASS.
Читать дальше…Транзакция на ракурс ведения
- Создаем транзакцию с начальным объектом «Транзакция с параметрами»
- В поле транзакция указываем SM30
- Устанавливаем флаг «Пропустить первый экран»
- Указываем параметры: VIEWNAME = «имя таблицы»; UPDATE = X
Программа для снятия скриншотов
В процессе работы часто приходится обмениваться скриншотами. Для информативности и акцентирования внимания на определенные области, на скриншотах наносятся текстовые комментарии, выделяются области, рисуются стрелки и т.п.
До недавнего времени, для снятия скриншотов я пользовался программой Lightshot, но по требованию ИБ от нее пришлось отказаться. После чего я решил написать свой Lightshot с открытым исходным кодом. Оставляю ссылки на исполняемый файл и на исходный код.
Читать дальше…Сериализация данных и типов данных
Существует несколько способов сериализации и десериализации данных. Самые популярные из них:
- В формате XML через CALL TRANSFORMATION
- В формате JSON через класс /UI2/CL_JSON
- В кластер данных через оператор EXPORT
В некоторых случаях, помимо самих данных, требуется сериализовать тип данных (например, если тип сериализуемых данных определяется в рантайме). Сделать это можно через класс CL_SALV_BS_DDIC.
Читать дальше…Доступ к приватным атрибутам класса
В языке ABAP есть реализация паттерна «снимок» (Memento), цель которого сохранять и восстанавливать состояния объектов. Под состоянием понимается значения всех его атрибутов. Используя данный паттерн можно считать PROTECTED и PRIVATE атрибуты и изменять из значения в произвольном объекте.
Читать дальше…