Hello,小洋人百里。坚持的第二天。
序
HELLO,这里是百里,一个学习中的ABAPER,这篇文章是坚持学习文章. 在工作中我们,肯定会遇到一些长文本的使用方式,在以前我讲过用过使用READ_TEXT的方式通过调用函数来实现长文本的数据读取.但是也讲了他的问题所在,就是会相对较慢,比较卡. 今天我们来讲另外的一种方式,获取长文本数据, 通过读取底表的方式 .
为什么要读取底表
我们不是已经有了READ_TEXT 的方式了么,为什么还要读取底表呢...额 其实我也想过,在日常工作中其实他们的区别非常小.因为我也讲过了就是我们基本上不会在ALV中通过循环的方式讲数据进行拼接早字符串内容使用. 一般都是使用OLE,打印这种进行数据下发展示单个单号的长文本备注. 但是古语怎么说技多不压身.我们一起学学用法吧.
技术解析.
我们主要是通过调用底表 STXH
和 STXL
这两个表进行数据调取.
具体技术是,先通过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.
结果
如图,我们将对应的长文本数据内容装入到内表中,在通过循环拼接的方式进行操作,从而使数据存在字符串中的目的 .
技术总结
今天讲述的内容是,如何通过读取底表的方式,进行获取长文本数据内容, 和READ_tEXT的函数相比,这种代码看起来更直接,毕竟不是标准函数,可以通过DEBUG的方式,知道每一步的操作. 和函数调用方式相同,我们尽量不要在ALV中展示这种长文本内容,因为会很长,在一个就是,不要过于长,因为STRING 的长度是有限的.
百里鸡汤
不应该追求一切种类的快乐,应该只追求高尚的快乐。
这里是百里,一个努力的学习者. 努力学习好好记录,点滴进步,就是成功.