如何读写长文本以及使用文本编辑器
发布日期:2024/07/26
案例:读取采购订单抬头长文本,并用文本编辑器的形式展示(默认只读),点击编辑按钮可修改保存,保存后恢复只读状态。
- 首先我们要确认采购订单长文本对象。
1.1 事务码ME23N打开采购订单抬头文本界面,并双击长文本内容进入显示界面。
1.2 菜单栏转到表头
1.3 根据表头内容确认长文本读取函数(READ_TEXT)的文本名(name),语言(language),文本标识(id ),文本对象(object)。
- 接下来就是程序逻辑
2.1 获取长文本
CALL FUNCTION ‘READ_TEXT’
2.2 将长文本内表转化为文本流
CALL FUNCTION ‘CONVERT_ITF_TO_STREAM_TEXT’
2.3 创建容器(一定要绘制屏幕)和文本编辑器对象并设置相应状态。
CREATE OBJECT g_editor_container
CREATE OBJECT g_editor
2.4 点击修改按钮,打开可编辑模式
CALL METHOD g_editor->set_readonly_mode
2.5 点击保存,获取屏幕文本流
CALL METHOD g_editor->get_text_as_stream
2.6 将文本流转化为内表
CALL FUNCTION ‘CONVERT_STREAM_TO_ITF_TEXT’
2.7 保存长文本
CALL FUNCTION ‘SAVE_TEXT’
2.8 文本编辑器刷新并关闭可编辑模式
CALL METHOD g_editor->set_text_as_stream
CALL METHOD g_editor->set_readonly_mode
完整代码如下。每一步有注解,复制即可用。
主程序完整代码:
REPORT zmm_rpt_538_wu.
TYPES: BEGIN OF stream,
default TYPE char100,
END OF stream.
DATA: g_textstream TYPE STANDARD TABLE OF stream,
gt_text_table TYPE TABLE OF tline.
DATA: g_editor TYPE REF TO cl_gui_textedit,
g_editor_container TYPE REF TO cl_gui_custom_container..
DATA: gv_name TYPE tdobname,
gv_object TYPE thead-tdobject,
gt_tline TYPE STANDARD TABLE OF tline,
gs_tline TYPE tline,
gv_id TYPE thead-tdid.
DATA: gs_header TYPE thead,
lw_ltxt TYPE tline,
gt_ltxts TYPE STANDARD TABLE OF tline.
INITIALIZATION.
START-OF-SELECTION.
gv_id = 'F01'.
gv_name = '4500000135'.
gv_object = 'EKKO'.
CLEAR: gt_tline[], g_textstream[].
*读取长文本到内表
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = gv_id
language = sy-langu
name = gv_name
object = gv_object
TABLES
lines = gt_tline
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
*将内表转换为文本流
CALL FUNCTION 'CONVERT_ITF_TO_STREAM_TEXT'
EXPORTING
language = sy-langu
TABLES
itf_text = gt_tline
text_stream = g_textstream.
CALL SCREEN 100.
MODULE status_100 OUTPUT.
SET PF-STATUS 'ZSTANDARD'.
IF g_editor IS INITIAL.
*创建容器
CREATE OBJECT g_editor_container
EXPORTING
container_name = 'ZCONTAINER' "屏幕绘制
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5.
*创建文本编辑器
CREATE OBJECT g_editor
EXPORTING
parent = g_editor_container
wordwrap_mode = cl_gui_textedit=>wordwrap_at_fixed_position
* wordwrap_mode = cl_gui_textedit=>wordwrap_at_windowborder
wordwrap_position = 86
wordwrap_to_linebreak_mode = cl_gui_textedit=>true.
*工具栏不可见
CALL METHOD g_editor->set_toolbar_mode
EXPORTING
toolbar_mode = cl_gui_textedit=>true.
*状态栏
CALL METHOD g_editor->set_statusbar_mode
EXPORTING
statusbar_mode = cl_gui_textedit=>true.
*只读
CALL METHOD g_editor->set_readonly_mode
EXPORTING
readonly_mode = cl_gui_textedit=>true.
*set文本
CALL METHOD g_editor->set_text_as_stream
EXPORTING
text = g_textstream.
ELSE.
CALL METHOD g_editor->set_text_as_stream
EXPORTING
text = g_textstream.
ENDIF.
ENDMODULE.
MODULE exit_user_command INPUT.
LEAVE TO SCREEN 0.
ENDMODULE.
MODULE user_command_0100 INPUT.
DATA: t_tdline1 TYPE TABLE OF standard .
DATA: lt_table TYPE STANDARD TABLE OF tline,
lv_modify TYPE i,
ok_code TYPE sy-ucomm.
* Texttabelle aus Control abholen
CASE ok_code.
WHEN '&ZUPD'. "编辑
CALL METHOD g_editor->set_readonly_mode
EXPORTING
readonly_mode = cl_gui_textedit=>false.
WHEN '&DATA_SAVE'. "保存
*取屏幕上输入的文本
CALL METHOD g_editor->get_text_as_stream
IMPORTING
text = g_textstream
EXCEPTIONS
error_dp = 1
error_cntl_call_method = 2
OTHERS = 3.
IF sy-subrc = 0.
*将文本流转为内表
CALL FUNCTION 'CONVERT_STREAM_TO_ITF_TEXT'
EXPORTING
language = sy-langu
TABLES
itf_text = gt_text_table
text_stream = g_textstream.
*长文本保存
gs_header-tdobject = gv_object.
gs_header-tdid = gv_id.
gs_header-tdspras = sy-langu .
gs_header-tdname = gv_name.
CALL FUNCTION 'SAVE_TEXT'
EXPORTING
client = sy-mandt
header = gs_header
savemode_direct = 'X'
TABLES
lines = gt_text_table.
IF sy-subrc <> 0.
ROLLBACK WORK .
ELSE.
COMMIT WORK AND WAIT .
ENDIF.
*文本编辑器刷新
CALL METHOD g_editor->set_text_as_stream
EXPORTING
text = g_textstream.
CALL METHOD g_editor->set_readonly_mode
EXPORTING
readonly_mode = cl_gui_textedit=>true.
ENDIF.
ENDCASE.
ENDMODULE.
屏幕100:
PROCESS BEFORE OUTPUT.
MODULE status_100.
PROCESS AFTER INPUT.
MODULE exit_user_command AT EXIT-COMMAND.
MODULE user_command_0100.
注意:这里一定要在100屏幕画出容器,否则是不会有输出的。
画出容器后100屏幕元素清单会生成CCtrl类型的元素,可以自由命名,此命名要与代码中创建容器的名称一致。一定要写入OK_CODE用来获取屏幕上的命令,否则状态栏的功能无法触发。
状态栏添加了自定义的编辑按钮
- 最后来看一下效果吧
3.1 执行后,成功获取到长文本。点击编辑
3.2 点编辑后变为可编辑模式,写入【测试编辑】后点保存。
3.3 保存成功恢复为只读状态
3.4 最后到订单界面验证,确认保存成功!