Read TEXT优化

发布时间 2024-01-08 14:26:13作者: YangMercy
*&---------------------------------------------------------------------*
*& Report ZREAD_TEXT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZREAD_TEXT.


TYPES : BEGIN OF TY_VBAK ,
          VBELN  TYPE VBAK-VBELN,
          TDLINE TYPE TLINE-TDLINE,
        END OF TY_VBAK.

DATA:lt_VBAK TYPE TABLE OF ty_VBAK,
     ls_VBAK TYPE ty_VBAK.

DATA: IL_TLINE LIKE TLINE OCCURS 0 WITH HEADER LINE.

SELECT
  VBELN  "采购凭证号
  INTO  TABLE lt_VBAK
  FROM VBAK
**  UP TO 20 ROWS.
  WHERE  VBELN  =  '0000000101'.
DATA : VL_TDNAME LIKE THEAD-TDNAME.

LOOP AT LT_VBAK INTO ls_VBAK.

  VL_TDNAME = ls_VBAK-VBELN.

  CALL FUNCTION 'READ_TEXT'
    EXPORTING
      CLIENT                  = SY-MANDT
      ID                      = '0001'            " 文本ID的值
      LANGUAGE                = '1'              " 语言的值  1表示中文
      NAME                    = VL_TDNAME        " 文本名的值
      OBJECT                  = 'VBBK'           " 文本对象的值
    TABLES
      LINES                   = IL_TLINE
    EXCEPTIONS
      " EXCEPTIONS必须写,否则表头文本为空时程序将dump
      ID                      = 1
      LANGUAGE                = 2
      NAME                    = 3
      NOT_FOUND               = 4
      OBJECT                  = 5
      REFERENCE_CHECK         = 6
      WRONG_ACCESS_TO_ARCHIVE = 7
      OTHERS                  = 8.

  IF SY-SUBRC <> 0.

  ELSE.

    LOOP AT IL_TLINE.
      CONCATENATE LS_VBAK-TDLINE IL_TLINE-TDLINE INTO LS_VBAK-TDLINE.
    ENDLOOP.
    MODIFY LT_VBAK FROM LS_VBAK.

  ENDIF.

ENDLOOP.

SORT LT_VBAK BY VBELN.

* 输出
DATA: I_TABLE      TYPE REF TO CL_SALV_TABLE.
DATA: LR_COLUMNS   TYPE REF TO CL_SALV_COLUMNS_TABLE.
DATA: LR_FUNCTIONS TYPE REF TO CL_SALV_FUNCTIONS.

TRY.
    CL_SALV_TABLE=>FACTORY(
      IMPORTING
        R_SALV_TABLE = I_TABLE
      CHANGING
        T_TABLE      = LT_VBAK ).
  CATCH CX_SALV_MSG.
ENDTRY.



TYPES: BEGIN OF ty_stxl_raw, "压缩的文本
         clustr TYPE stxl-clustr,
         clustd TYPE stxl-clustd,
       END OF ty_stxl_raw.

TYPES:BEGIN OF ty_text, "解压的文本
        tdobject TYPE stxl-tdobject,
        tdid     TYPE stxl-tdid,
        tdname   TYPE stxl-tdname,
        tdline   TYPE string,
      END OF ty_text.
*
TYPES: BEGIN OF ty_stxl, "直接查询stxl的数据格式
         tdobject TYPE stxl-tdobject,
         tdid     TYPE stxl-tdid,
         tdname   TYPE stxl-tdname,
         clustr   TYPE stxl-clustr,
         clustd   TYPE stxl-clustd,
       END OF ty_stxl.
*
DATA: lt_stxl TYPE  TABLE OF ty_stxl WITH HEADER LINE. "

DATA: lt_stxl_raw TYPE TABLE OF ty_stxl_raw WITH HEADER LINE,
      ls_stxl_raw TYPE ty_stxl_raw.
DATA lt_tline TYPE STANDARD TABLE OF tline WITH HEADER LINE.

DATA lt_text TYPE  TABLE OF ty_text .
DATA ls_text TYPE ty_text.
*
*"查询销售订单以及订单行
SELECT vbak~vbeln,
       vbap~posnr,
       vbak~ernam,
      CAST( vbak~ernam AS CHAR( 200 ) ) AS longtexth,"抬头长文本
      CAST( vbak~ernam AS CHAR( 200 ) ) AS longtext, "定义一个200长度的字段,里面的内容后面直接清空掉
   concat(  vbak~vbeln  ,vbap~posnr  )  AS tdname "订单 + 订单行  = TDNAME
  FROM vbak
 INNER JOIN vbap ON vbak~vbeln EQ vbap~vbeln
WHERE vbak~vbeln = '0000000101'  "指定的销售订单号,作为测试
  INTO TABLE @DATA(lts_vbak).

SELECT stxl~tdobject,
       stxl~tdid,
       stxl~tdname,
       stxl~clustr,
       stxl~clustd
   FROM stxl
INNER JOIN  @lts_vbak AS l ON l~vbeln EQ stxl~tdname
WHERE stxl~tdobject = 'VBBK'
AND  stxl~tdid = '0001'
AND   stxl~tdspras = @sy-langu
INTO CORRESPONDING FIELDS OF TABLE @lt_stxl.



*"解压文本
LOOP AT lt_stxl.
  CLEAR:lt_stxl_raw,lt_stxl_raw[], lt_tline,lt_tline[].
  lt_stxl_raw-clustr = lt_stxl-clustr.
  lt_stxl_raw-clustd = lt_stxl-clustd.
  APPEND lt_stxl_raw.
  IMPORT tline = lt_tline FROM INTERNAL TABLE lt_stxl_raw.

  LOOP AT lt_tline.
    ls_text-tdline = ls_text-tdline && lt_tline-tdline.
  ENDLOOP.
  ls_text-tdobject = lt_stxl-tdobject.
  ls_text-tdid = lt_stxl-tdid.
  ls_text-tdname = lt_stxl-tdname.
  IF ls_text-tdline NE ''.
    INSERT ls_text INTO TABLE lt_text.
  ENDIF.
  CLEAR ls_text.
ENDLOOP.

SORT lt_text BY tdobject  tdid   tdname   ."排序为二分法做准备
DELETE ADJACENT DUPLICATES FROM lt_text COMPARING tdobject  tdid   tdname.