20 марта 2017

Чтение длинных текстов

Рассмотрим чтение длинных текстов на примере текста к основным данным материала (текстовый объект - MATERIAL, идентификатор - GRUN). Чтение длинного текста осуществляется с помощью функционального модуля READ_TEXT.




  DATA: lv_id         TYPE thead-tdid,
        lv_name       TYPE thead-tdname,
        lv_object     TYPE thead-tdobject,
        ls_header     TYPE thead,
        lt_lines      TYPE TABLE OF tline.

  lv_id = 'GRUN'.
  lv_name = p_matnr.
  lv_object = 'MATERIAL'.

  CALL FUNCTION 'READ_TEXT'
    EXPORTING
*     client                        = sy-mandt
      id                            = lv_id
      language                      = sy-langu
      name                          = lv_name
      object                        = lv_object
*     archive_handle                = 0
*     local_cat                     = ' '
    IMPORTING
      header                        = ls_header
    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.
    " Таблица lt_lines содержит длинный текст
  ENDIF.

Массовое чтение длинных текстов можно выполнить следующим образом.

  TYPES: BEGIN OF ty_mara,
           matnr TYPE mara-matnr,
           tdname TYPE stxl-tdname,
         END OF ty_mara.

  TYPES: BEGIN OF ty_stxl,
           tdname TYPE stxl-tdname,
           clustr TYPE stxl-clustr,
           clustd TYPE stxl-clustd,
         END OF ty_stxl.

  TYPES: BEGIN OF ty_stxl_raw,
           clustr TYPE stxl-clustr,
           clustd TYPE stxl-clustd,
         END OF ty_stxl_raw.


  DATA: lt_mara TYPE TABLE OF ty_mara,
        lt_stxl TYPE TABLE OF ty_stxl,
        lt_stxl_raw TYPE TABLE OF ty_stxl_raw,
        ls_stxl_raw TYPE ty_stxl_raw,
        lt_tline TYPE TABLE OF tline.


  FIELD-SYMBOLS: <lfs_mara> LIKE LINE OF lt_mara,
                 <lfs_stxl> TYPE ty_stxl,
                 <lfs_tline> LIKE LINE OF lt_tline.

  SELECT *
    FROM mara
    INTO CORRESPONDING FIELDS OF TABLE lt_mara
    WHERE matnr IN s_matnr.

  CHECK lt_mara[] IS NOT INITIAL.

  LOOP AT lt_mara ASSIGNING <lfs_mara>.
    <lfs_mara>-tdname = <lfs_mara>-matnr.
  ENDLOOP.

  SELECT tdname clustr clustd
    FROM stxl
    INTO TABLE lt_stxl
    FOR ALL ENTRIES IN lt_mara
    WHERE relid    = 'TX'
      AND tdobject = 'MATERIAL'
      AND tdname   = lt_mara-tdname
      AND tdid     = 'GRUN'
      AND tdspras  = sy-langu.

  LOOP AT lt_stxl ASSIGNING <lfs_stxl>.

    REFRESH: lt_stxl_raw,
             lt_tline.

    ls_stxl_raw-clustr = <lfs_stxl>-clustr.
    ls_stxl_raw-clustd = <lfs_stxl>-clustd.
    APPEND ls_stxl_raw TO lt_stxl_raw.
    IMPORT tline = lt_tline FROM INTERNAL TABLE lt_stxl_raw.
    " Таблица lt_tline содержит длинный текст

  ENDLOOP.

Неизвестный пользователь в комментариях подсказал, что есть ФМ READ_TEXT_TABLE для массового чтения текстов. ФМ присутствует в более новых версиях (в 7.40 есть, в 7.31 нет).

  DATA:
    lt_thead TYPE TABLE OF thead,
    ls_thead LIKE LINE OF lt_thead,
    lt_text TYPE text_lh.

  CLEAR ls_thead.
  ls_thead-tdobject = 'MATERIAL'.
  ls_thead-tdname = lv_matnr_01.
  ls_thead-tdid = 'GRUN'.
  ls_thead-tdspras = sy-langu.
  INSERT ls_thead INTO TABLE lt_thead.

  ls_thead-tdname = lv_matnr_02.
  INSERT ls_thead INTO TABLE lt_thead.

  CALL FUNCTION 'READ_TEXT_TABLE'
*   EXPORTING
*     client_specified              = ' '
*     archive_handle                = 0
*     local_cat                     = ' '
    IMPORTING
      text_table                    = lt_text
*     error_table                   =
    TABLES
      text_headers                  = lt_thead
    EXCEPTIONS
      wrong_access_to_archive       = 1
      OTHERS                        = 2.

  IF sy-subrc EQ 0.
    LOOP AT lt_text ASSIGNING FIELD-SYMBOL(<lfs_text>).
      " <lfs_text>-lines содержит таблицу с текстом
    ENDLOOP.
  ENDIF.


Текстовые объекты можно найти в ракурсе ведения V_TTXOBI (таблица TTXOB), идентификаторы к текстовым объектам - в ракурсе V_TTXID_N или V_TTXIDI (таблица TTXID), заголовок к длинному тексту - в таблице STXH, сам длинный текст - в таблице STXL.

Основные текстовые объекты:

ANLA - основное средство
BELEG - финансовый документ
EBAN - заявка
EBANH - заголовок заявки
EKKO - заголовок документа закупки
EKPO - позиция документа закупки
MATERIAL - материал

4 комментария: