事由:今天领导心情好多喝几杯,喝多之后闲暇无事打开MM报表想看看数据 点击运行报表等待10分钟没有出结果,于是领导就在座位上睡着了 不知道过了多久领导酒醒发现报名还没出结果于是大怒 叫来业务组长二狗子 痛骂一顿。二狗子回到工位上 叫来业务顾问 相同方式把怒火传给MM业务顾问,业务顾问拿着中午食堂发的苹果找我来解决。
需求锁定:报表除读取mara物料数据之外还要读取两个长文本:中文、客户
代码分析:目前逻辑 根据输入条件读取mara表数据,然后loop物料数据根据id等信息使用函数READ_TEXT读取每一个长文本。
找病根:读取mara等相关都是主键或者索引没问题,经过分析读取READ_TEXT读取长文本慢,经过查找sap-help 发现S4最新版本出一个函数READ_TEXT_TABLE批量读取长文本。
解决:批量放入ID、批量读取长文本数据、生成需要需要的长文本 源代码如下:
后来送苹果的业务顾问说优化完快了8倍,没办法只能接过来苹果吃掉 哈
DATA: ls_thead TYPE thead.
DATA: lt_thead TYPE TABLE OF thead.
DATA: lt_mt_lh TYPE TABLE OF ty_matkx_lh.
DATA: ls_mt_lh TYPE ty_matkx_lh.
DATA: lt_text_headers TYPE TABLE OF thead,
lt_text_table TYPE text_lh.
REFRESH:lt_thead.
"1、批量放入ID
LOOP AT gt_alv ASSIGNING <fs_alv>.
ls_thead-tdobject = 'MATERIAL'.
ls_thead-tdname = <fs_alv>-matnr.
ls_thead-tdid = 'GRUN'.
ls_thead-tdspras = 1.
APPEND ls_thead TO lt_thead.
ls_thead-tdspras = 'Z'.
APPEND ls_thead TO lt_thead.
CLEAR ls_thead.
ENDLOOP.
lt_text_headers = CORRESPONDING #( lt_thead[] ).
"2、批量读取长文本数据
IF lt_thead[] IS NOT INITIAL.
CALL FUNCTION 'READ_TEXT_TABLE'
IMPORTING
text_table = lt_text_table
TABLES
text_headers = lt_text_headers
EXCEPTIONS
wrong_access_to_archive = 1.
IF sy-subrc EQ 0.
"3、生成需要需要的长文本
CLEAR lt_mt_lh[].
LOOP AT lt_text_table INTO DATA(ls_text_table).
ls_mt_lh-matnr = ls_text_table-header-tdname.
ls_mt_lh-spras = ls_text_table-header-tdspras.
LOOP AT ls_text_table-lines ASSIGNING FIELD-SYMBOL(<ls_line>).
ls_mt_lh-maktx_lh = ls_mt_lh-maktx_lh && <ls_line>-tdline.
ENDLOOP.
APPEND ls_mt_lh TO lt_mt_lh.
CLEAR ls_mt_lh.
ENDLOOP.
SORT lt_mt_lh BY matnr spras.
LOOP AT gt_alv ASSIGNING <fs_alv>.
READ TABLE lt_mt_lh INTO ls_mt_lh WITH KEY matnr = <fs_alv>-matnr
spras = '1'
BINARY SEARCH.
IF sy-subrc = 0.
<fs_alv>-maktx_l = ls_mt_lh-maktx_lh.
ENDIF.
READ TABLE lt_mt_lh INTO ls_mt_lh WITH KEY matnr = <fs_alv>-matnr
spras = 'Z'
BINARY SEARCH.
IF sy-subrc = 0.
<fs_alv>-maktx_lz = ls_mt_lh-maktx_lh.
ENDIF.
ENDLOOP.
ENDIF.
ENDIF.