*&---------------------------------------------------------------------*
*& 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.