ABAP 之 长文本直接查底表的使用方式

举报
百里丶落云 发表于 2023/01/09 16:37:37 2023/01/09
【摘要】 Hello,小洋人百里。坚持的第二天。 序HELLO,这里是百里,一个学习中的ABAPER,这篇文章是坚持学习文章. 在工作中我们,肯定会遇到一些长文本的使用方式,在以前我讲过用过使用READ_TEXT的方式通过调用函数来实现长文本的数据读取.但是也讲了他的问题所在,就是会相对较慢,比较卡. 今天我们来讲另外的一种方式,获取长文本数据, 通过读取底表的方式 . 为什么要读取底表我们不是已经有...

Hello,小洋人百里。坚持的第二天。

HELLO,这里是百里,一个学习中的ABAPER,这篇文章是坚持学习文章. 在工作中我们,肯定会遇到一些长文本的使用方式,在以前我讲过用过使用READ_TEXT的方式通过调用函数来实现长文本的数据读取.但是也讲了他的问题所在,就是会相对较慢,比较卡. 今天我们来讲另外的一种方式,获取长文本数据, 通过读取底表的方式 .

为什么要读取底表

我们不是已经有了READ_TEXT 的方式了么,为什么还要读取底表呢…额 其实我也想过,在日常工作中其实他们的区别非常小.因为我也讲过了就是我们基本上不会在ALV中通过循环的方式讲数据进行拼接早字符串内容使用. 一般都是使用OLE,打印这种进行数据下发展示单个单号的长文本备注. 但是古语怎么说技多不压身.我们一起学学用法吧.

技术解析.

我们主要是通过调用底表STXHSTXL 这两个表进行数据调取.
具体技术是,先通过stxh 获取表头信息,在通过该STXL 找出相关的表体信息,加入到内表中在循环出来.
至于怎么查相关数据,请求参数请参考我上一篇内容 ABAP 之 长文本READ_TEXT的使用方式-

SELECT TDNAME TDOBJECT TDID  
   FROM STXH  
     INTO CORRESPONDING FIELDS OF TABLE T_STXH  
  where TDOBJECT = '表名' AND TDNAME = '单据号' and tdid = '业务id .
  
  
  
SELECT TDNAME CLUSTR CLUSTD  
        INTO TABLE T_STXL  
        FROM STXL  
        PACKAGE SIZE 3000  
        FOR ALL ENTRIES IN T_STXH "WITH APPLICATION DATA AND TDNAME  
        WHERE RELID    = 'TX'          "standard text  
          AND TDOBJECT = T_STXH-TDOBJECT  
          AND TDNAME   = T_STXH-TDNAME  
          AND TDID     = T_STXH-TDID  
          AND TDSPRAS  = SY-LANGU.  
   LOOP AT T_STXL ASSIGNING <STXL>.  
*   decompress text  
     CLEAR: T_STXL_RAW[], T_TLINE[].  
     W_STXL_RAW-CLUSTR = <STXL>-CLUSTR.  
     W_STXL_RAW-CLUSTD = <STXL>-CLUSTD.  
     APPEND W_STXL_RAW TO T_STXL_RAW.  
     IMPORT TLINE = T_TLINE FROM INTERNAL TABLE T_STXL_RAW.

实例演示

数据准备

这个数据定义内容,一定要参照我的使用,否则会遇到类型不匹配的类似的报错.

TYPES: BEGIN OF TY_STXL,  
          TDNAME TYPE STXL-TDNAME,  
          CLUSTR TYPE STXL-CLUSTR,  
          CLUSTD TYPE STXL-CLUSTD,  
        END OF TY_STXL.  
DATA:  T_STXL TYPE STANDARD TABLE OF TY_STXL.  
FIELD-SYMBOLS: <STXL> TYPE TY_STXL.  
* compressed text data without text name  
TYPES: BEGIN OF TY_STXL_RAW,  
          CLUSTR TYPE STXL-CLUSTR,  
          CLUSTD TYPE STXL-CLUSTD,  
        END OF TY_STXL_RAW.  
DATA:  T_STXL_RAW TYPE STANDARD TABLE OF TY_STXL_RAW.  
DATA:  W_STXL_RAW TYPE TY_STXL_RAW.  
* decompressed text  
DATA:  T_TLINE TYPE STANDARD TABLE OF TLINE.  
FIELD-SYMBOLS: <TLINE> TYPE TLINE.  
DATA: T_STXH TYPE STANDARD TABLE OF STXH,  
       W_STXH TYPE STXH.  
  
  
data : long_text TYPE STRing .

代码调用及成果展示

我们这里以VBBK交货单为例子,输入单号和业务id 进行获取对应的字符串内容 .

SELECT TDNAME TDOBJECT TDID  
   FROM STXH  
     INTO CORRESPONDING FIELDS OF TABLE T_STXH  
  where TDOBJECT = 'VBBK' AND TDNAME = '6000003402' and tdid = '0001' .  
  
IF T_STXH is NOT INITIAL.  
*AND THEN  
* select compressed text lines in blocks of 3000 (adjustable)  
SELECT TDNAME CLUSTR CLUSTD  
        INTO TABLE T_STXL  
        FROM STXL  
        PACKAGE SIZE 3000  
        FOR ALL ENTRIES IN T_STXH "WITH APPLICATION DATA AND TDNAME  
        WHERE RELID    = 'TX'          "standard text  
          AND TDOBJECT = T_STXH-TDOBJECT  
          AND TDNAME   = T_STXH-TDNAME  
          AND TDID     = T_STXH-TDID  
          AND TDSPRAS  = SY-LANGU.  
   LOOP AT T_STXL ASSIGNING <STXL>.  
*   decompress text  
     CLEAR: T_STXL_RAW[], T_TLINE[].  
     W_STXL_RAW-CLUSTR = <STXL>-CLUSTR.  
     W_STXL_RAW-CLUSTD = <STXL>-CLUSTD.  
     APPEND W_STXL_RAW TO T_STXL_RAW.  
     IMPORT TLINE = T_TLINE FROM INTERNAL TABLE T_STXL_RAW.  
*  access text lines for further processing  
     LOOP AT T_TLINE ASSIGNING <TLINE>.  
      " WRITE: / <TLINE>-TDLINE.  
       long_text =  long_text && <TLINE>-TDLINE .  
     ENDLOOP.  
   ENDLOOP.  
   FREE T_STXL.  
ENDSELECT.  
ENDIF.

结果

如图,我们将对应的长文本数据内容装入到内表中,在通过循环拼接的方式进行操作,从而使数据存在字符串中的目的 .

image.png

技术总结

今天讲述的内容是,如何通过读取底表的方式,进行获取长文本数据内容, 和READ_tEXT的函数相比,这种代码看起来更直接,毕竟不是标准函数,可以通过DEBUG的方式,知道每一步的操作. 和函数调用方式相同,我们尽量不要在ALV中展示这种长文本内容,因为会很长,在一个就是,不要过于长,因为STRING 的长度是有限的.

百里鸡汤

不应该追求一切种类的快乐,应该只追求高尚的快乐。

这里是百里,一个努力的学习者. 努力学习好好记录,点滴进步,就是成功.

wallhaven-o5x6gp.png

推荐

华为开发者空间发布

让每位开发者拥有一台云主机

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。