长文本
维护长文本对象
SO10
READ_TEXT
长文本可以用函数 READ_TEXT 取出
perform frm_text_get using 'VBBK' gt_head-vbeln 'Z005' changing gt_head-text1.
form frm_text_get using uv_object
uv_name
uv_id
changing cv_text.
data:
lv_object like thead-tdobject,
lv_name like thead-tdname,
lv_id like thead-tdid,
lt_lines like table of tline with header line.
lv_object = uv_object.
lv_name = uv_name.
lv_id = uv_id.
call function 'READ_TEXT'
exporting
id = lv_id
language = sy-langu
name = lv_name
object = lv_object
tables
lines = lt_lines
exceptions
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.
* Implement suitable error handling here
endif.
loop at lt_lines.
cv_text = cv_text && lt_lines-tdline.
endloop.
endform.
- READ_TEXT在查不到对应的长文本时会报错(E),所以要先判断长文本是否存在
判断有没有长文本的方法(查看STXL中是否有TDNAME)
- 查看长文本抬头方法:双击文本编辑器(或点击‘编辑器’按钮),进入WORD编辑模式,转到表头,查看长文本信息
也可以在FUNCTION READ_TEXT中打断点,调试得出
在读取长文本时,LINES中TDLINE的长度刚好是长文本的一行
- 采购订单长文本可以用BAPI读出
DATA: IT_POTXT LIKE TABLE OF BAPIEKPOTX WITH HEADER LINE ."订单项目文本
CALL FUNCTION 'BAPI_PO_GETDETAIL'
EXPORTING
PURCHASEORDER = ITAB_PAGECTRL-EBELN
ITEM_TEXTS = 'X'
TABLES
PO_ITEM_TEXTS = IT_POTXT.
SAVE_TXT 保存长文本
注:如果文本对象和name不存在,使 用SAVE_TXT是不行的,必须要用CREATE_TEXT
不写savemode_direct = 'X' 时有个BUG,第二次写入的行长度小于第一行时,末尾会有一部分字符没有改掉;第二次写入的行数少于第一次时,第一次多出来的部分不会被清空掉
perform set_text using 'KNA1' kunnr 'Z001' is_generaldata-z001.
form set_text using uv_object
uv_name
uv_id
uv_text.
data:
ls_header type thead,
ls_stxl like stxl,
lt_ltxts type standard table of tline with header line.
ls_header-tdobject = uv_object .
ls_header-tdid = uv_id.
ls_header-tdspras = '1'.
ls_header-tdname = uv_name.
lt_ltxts-tdformat = '*'.
lt_ltxts-tdline = uv_text.
append lt_ltxts.
select single *
into ls_stxl
from stxl
where tdobject = uv_object and tdid = uv_id and tdspras = '1' and tdname = uv_name.
if sy-subrc = 0.
call function 'SAVE_TEXT'
exporting
client = sy-mandt
header = ls_header
savemode_direct = 'X'
tables
lines = lt_ltxts
exceptions
id = 1
language = 2
name = 3
object = 4
others = 5.
if sy-subrc = 0.
endif.
else.
call function 'CREATE_TEXT'
exporting
fid = ls_header-tdid
flanguage = '1'
fname = ls_header-tdname
fobject = ls_header-tdobject
* SAVE_DIRECT = 'X'
* FFORMAT = '*'
tables
flines = lt_ltxts
exceptions
no_init = 1
no_save = 2
others = 3.
endif.
endform.
长文本是以LRAW类型存在STXL表中的,在使用函数SAVE_TEXT时,就自动实现了文本到LRAW的转换和储存
注意:在有些业务中,比如保存生产订单长文本,需要savemode_direct = 'X',且保存完了之后,修改AUFK的LTEXT = SY-LANGU。
长文本控件
查看例子:输入SAPTEXTEDIT*,F4,选择一个例子,如SAPTEXTEDIT_DEMO_3
拆分长字符串,防止自己拆乱码
SWA_STRING_SPLIT
长文本控件代码

......
DATA:BEGIN OF IT_TEXT OCCURS 0, "长文本内表
LINE(220), "可自定义长度,220为SMARTFORMS文本最大输出长度
END OF IT_TEXT.
DATA LONG_TEXT(440).
DATA:
CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
EDITOR TYPE REF TO CL_GUI_TEXTEDIT.
MODULE STATUS_2001 OUTPUT.
SET PF-STATUS '2001'.
SET TITLEBAR '2001'.
IF CONTAINER IS INITIAL.
CREATE OBJECT CONTAINER
EXPORTING
CONTAINER_NAME = 'TEXT_EDITOR'.
CREATE OBJECT EDITOR
EXPORTING
MAX_NUMBER_CHARS = 220
STYLE = 0 "0显示,非0不显示
PARENT = CONTAINER
WORDWRAP_MODE = CL_GUI_TEXTEDIT=>WORDWRAP_AT_FIXED_POSITION "自动截断长文本适应内表字段LINE长度
WORDWRAP_TO_LINEBREAK_MODE = CL_GUI_TEXTEDIT=>TRUE.
ENDIF.
ENDMODULE. " STATUS_2001 OUTPUT
MODULE EXIT INPUT.
CALL METHOD CONTAINER->FREE. "用METHOD FREE会清空对象,但没有清空地址
CALL METHOD EDITOR->FREE.
CLEAR:CONTAINER,EDITOR,IS_INPUT,LONG_TEXT.
LEAVE TO SCREEN 0.
ENDMODULE. " EXIT INPUT
MODULE USER_COMMAND_2001 INPUT.
CALL METHOD EDITOR->GET_TEXT_AS_R3TABLE
IMPORTING
TABLE = IT_TEXT[]. "按换行位置分割,并非按LINE最大长度分割
LOOP AT IT_TEXT.
LONG_TEXT = LONG_TEXT && IT_TEXT-LINE.
ENDLOOP.
IS_INPUT-TEXT1 = LONG_TEXT+0(220).
IS_INPUT-TEXT2 = LONG_TEXT+220(220).
ENDMODULE. " USER_COMMAND_2001 INPUT
......
批量取长文本
FORM GET_TEXT_BATCH . types: begin of ty_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.
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.
data:
lt_stxh type table of stxh with header line, "抬头
lt_stxl type table of ty_stxl with header line. "项目
data lt_stxl_raw type table of ty_stxl_raw with header line.
data lt_tline type standard table of tline with header line.
data lt_text type table of ty_text with header line.
loop at gt_alv.
lt_stxh-tdobject = 'QMEL'.
lt_stxh-tdname = gt_alv-qmnum.
lt_stxh-tdid = 'LTXT'.
append lt_stxh.
endloop.
*项目
select tdobject tdid tdname clustr clustd
into corresponding fields of table lt_stxl
from stxl
for all entries in lt_stxh "WITH APPLICATION DATA AND TDNAME
where relid = 'TX' "standard text
and tdobject = lt_stxh-tdobject
and tdname = lt_stxh-tdname
and tdid = lt_stxh-tdid
and tdspras = sy-langu.
* 解压文本
loop at lt_stxl.
clear:lt_stxl_raw,lt_stxl_raw[], lt_tline,lt_tline[],lt_text.
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.
lt_text-tdline = lt_text-tdline && lt_tline-tdline.
endloop.
lt_text-tdobject = lt_stxl-tdobject.
lt_text-tdid = lt_stxl-tdid.
lt_text-tdname = lt_stxl-tdname.
append lt_text.
endloop.
sort lt_text by tdobject tdid tdname.
*写入gt_alv
loop at gt_alv.
read table lt_text
with key
tdobject = 'QMEL'
tdid = 'LTXT'
tdname = gt_alv-qmnum
binary search.
if sy-subrc = 0.
gt_alv-ltext = lt_text-tdline.
endif.
modify gt_alv.
endloop. ENDFORM.
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
