abap 长文本读取效率提速优化:READ_TEXT_TABLE、READ_TEXT

事由:今天领导心情好多喝几杯,喝多之后闲暇无事打开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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值