Для чтения текстов из 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. |
На вход READ_TEXT передаются:
- ID идентификатор текста
- LANGUAGE язык, для которого определен текст
- OBJECT объект текста, определяется в зависимости от типа объекта (для FI документов BELEG, для заказов VBBK, и т.п.)
- NAME имя объекта, для которого нужно считать текст
На выходе определяется LINES таблица с текстовыми данными.
Имя NAME объекта обычно является конкатинацией ключа объекта. Пример с объектом BELEG (заголовок документа FI).
Заголовки документа FI хранятся в таблице BKPF. Соответственно ключом будет конкатинация полей BUKRS, BELNR, GJAHR.
Примечание: соединять поля нужно с учетом пробелов. То есть использовать CONCATENATE с дополнением RESPECTING BLANKS.
Преобразование LINES в строку
Тексты хранятся в таблице типа TLINE, которая содержит поле TDFORMAT, отвечающее за формат и поле с текстом TDLINE. Конкатенация всех TDLINE не всегда даст желаемый результат. Корректно преобразовать таблицу TLINE в строку STRING можно через IDMX_DI_TLINE_INTO_STRING.
1 2 3 4 5 6 7 8 9 10 11 12 |
в STRING" ]DATA lt_lines TYPE TABLE OF tline. DATA lv_string TYPE string. ... CALL FUNCTION 'IDMX_DI_TLINE_INTO_STRING' EXPORTING it_tline = lt_lines IMPORTING ev_text_string = lv_string. WRITE / lv_string. |
Чтение текстов из памяти
При сохранении текста (SAVE_TEXT), тексты предварительно записываются в ABAP-память. Пример ниже показывает как можно считать текст из памяти. Данный способ может пригодится, при чтении текста в OpenFI событии, когда документ еще не был создан, но ему уже был присвоен текст.
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 |
DATA ls_bkpf TYPE bkpf. DATA lt_catalog TYPE TABLE OF tcatalog. DATA lv_memory_id TYPE char30 VALUE 'SAPLSTXD'. DATA lv_name TYPE thead-tdname. DATA lt_lines TYPE TABLE OF tline. DATA lv_string TYPE string. FIELD-SYMBOLS <ls_catalog> TYPE tcatalog. ... CONCATENATE ls_bkpf-bukrs ls_bkpf-belnr ls_bkpf-gjahr INTO lv_name RESPECTING BLANKS. CALL FUNCTION 'GET_TEXT_MEMORY' TABLES text_memory = lt_catalog. READ TABLE lt_catalog ASSIGNING <ls_catalog> WITH KEY tdobject = 'BELEG' tdname = lv_name tdid = '0001' tdspras = sy-langu. IF sy-subrc EQ 0. lv_memory_id+8(6) = <ls_catalog>-id. IMPORT tline TO lt_lines FROM MEMORY ID lv_memory_id. " LT_LINES - таблица с текстом ... ENDIF. |
Если после SAVE_TEXT был вызван COMMIT_TEXT, то GET_TEXT_MEMORY вернет пустой каталог. В таком случае считать тексты можно следующим споособом.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
DATA lv_memory_id TYPE char30 VALUE 'SAPLSTXD'. DATA lv_memory_pos TYPE tcatalog-id. DATA ls_head TYPE thead. DATA lt_lines TYPE TABLE OF tline. CLEAR lv_memory_pos. DO. CLEAR: ls_head, lt_lines[]. lv_memory_pos = lv_memory_pos + 1. lv_memory_id+8(6) = lv_memory_pos. IMPORT thead TO ls_head tline TO lt_lines FROM MEMORY ID lv_memory_id. IF sy-subrc EQ 0. " LS_HEAD - заголовок текста " LT_LINES - таблица с текстом ELSE. EXIT. ENDIF. ENDDO. |
Массовое чтение текстов
Иногда требуется считать большое число текстов для разных документов, например, при заполнении таблицы ALV. Сделать это можно через READ_TEXT_TABLE.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
DATA lt_thead TYPE TABLE OF thead. DATA ls_thead TYPE thead. DATA lt_text TYPE text_lh. ls_thead-tdobject = 'BELEG'. ls_thead-tdname = lv_name. ls_thead-tdid = '0001'. ls_thead-tdspras = sy-langu. APPEND ls_thead TO lt_thead. CALL FUNCTION 'READ_TEXT_TABLE' IMPORTING text_table = lt_text TABLES text_headers = lt_thead EXCEPTIONS OTHERS = 4. |
Если в вашей системе нет функционального модуля READ_TEXT_TABLE, можно выбрать данные напрямую из таблицы STXL.
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 |
TYPES: BEGIN OF lts_data, clustr TYPE stxl-clustr, clustd TYPE stxl-clustd, END OF lts_data. DATA lt_head TYPE TABLE OF thead. DATA lt_stxl TYPE TABLE OF stxl. DATA ls_data TYPE lts_data. DATA lt_data TYPE TABLE OF lts_data. DATA lt_lines TYPE TABLE OF tline. DATA lv_name TYPE thead-tdname. FIELD-SYMBOLS <ls_stxl> TYPE stxl. ... " В LT_HEAD заполняем объекты и тексты для чтения ... SELECT * FROM stxl INTO TABLE lt_stxl FOR ALL ENTRIES IN lt_head WHERE relid EQ 'TX' " Стандартный текст AND tdobject EQ lt_head-tdobject AND tdname EQ lt_head-tdname AND tdid EQ lt_head-tdid AND tdspras EQ lt_head-tdspras. LOOP AT lt_stxl ASSIGNING <ls_stxl> WHERE tdobject EQ 'BELEG' AND tdname EQ lv_name AND tdid EQ '0001' AND tdspras EQ sy-langu. MOVE-CORRESPONDING <ls_stxl> TO ls_data. APPEND ls_data TO lt_data. ENDLOOP. IMPORT tline = lt_lines " LT_LINES - таблица с текстом FROM INTERNAL TABLE lt_data. |
А вот как устроен STXL, чтобы его разобрать питоном например? У нас репликация во внешнюю систему, там нет никакого абапа и читать абапом на стороне ерп не можем.