Иногда удобно найти записи в таблице используя бинарный поиск. Конструкция 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 = 'Привет, мир'. |
Передача 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.
Читать дальше…Сериализация данных и типов данных
Существует несколько способов сериализации и десериализации данных. Самые популярные из них:
- В формате XML через CALL TRANSFORMATION
- В формате JSON через класс /UI2/CL_JSON
- В кластер данных через оператор EXPORT
В некоторых случаях, помимо самих данных, требуется сериализовать тип данных (например, если тип сериализуемых данных определяется в рантайме). Сделать это можно через класс CL_SALV_BS_DDIC.
Читать дальше…Доступ к приватным атрибутам класса
В языке ABAP есть реализация паттерна «снимок» (Memento), цель которого сохранять и восстанавливать состояния объектов. Под состоянием понимается значения всех его атрибутов. Используя данный паттерн можно считать PROTECTED и PRIVATE атрибуты и изменять из значения в произвольном объекте.
Читать дальше…Поиск объектов в ABAP-словаре
Зачастую программисту проще создать новый элемент данных, структуру или тип диапазона данных, чем найти уже существующий объект. Это связано с отсутствием удобного инструмента поиска объектов в ABAP-словаре. В связи с этим, в разработках образуется избыточное количество словарных объектов, дублирующие друг друга. Для сокращения времени поиска нужных объектов, представляю вам свою утилиту.
Древовидное представления данных на примерах
Ниже представлены различные варианты реализации древовидного представления данных.
Чтение текстов
Для чтения текстов из ABAP используется функциональный модуль READ_TEXT. Ниже представлен пример чтения текста заголовка FI документа.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
DATA ls_bkpf TYPE bkpf. DATA lv_name TYPE thead-tdname. DATA lt_lines TYPE TABLE OF tline. DATA lv_string TYPE string. ... CONCATENATE ls_bkpf-bukrs ls_bkpf-belnr ls_bkpf-gjahr INTO lv_name RESPECTING BLANKS. CALL FUNCTION 'READ_TEXT' EXPORTING id = '0001' language = sy-langu name = lv_name object = 'BELEG' TABLES lines = lt_lines EXCEPTIONS id = 1 language = 2 name = 3 not_found = 4 object = 5 reference_check = 6 wrong_access_to_archive = 7 OTHERS = 8. IF sy-subrc EQ 0. CALL FUNCTION 'IDMX_DI_TLINE_INTO_STRING' EXPORTING it_tline = lt_lines IMPORTING ev_text_string = lv_string. WRITE / lv_string. ELSE. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. |