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