SAP ABAP 长文本读写与文本编辑器的使用

如何读写长文本以及使用文本编辑器

发布日期:2024/07/26

案例:读取采购订单抬头长文本,并用文本编辑器的形式展示(默认只读),点击编辑按钮可修改保存,保存后恢复只读状态。

  1. 首先我们要确认采购订单长文本对象。
    1.1 事务码ME23N打开采购订单抬头文本界面,并双击长文本内容进入显示界面。
    在这里插入图片描述

1.2 菜单栏转到表头
在这里插入图片描述

1.3 根据表头内容确认长文本读取函数(READ_TEXT)的文本名(name),语言(language),文本标识(id ),文本对象(object)。
在这里插入图片描述

  1. 接下来就是程序逻辑
    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用来获取屏幕上的命令,否则状态栏的功能无法触发。
在这里插入图片描述

状态栏添加了自定义的编辑按钮
在这里插入图片描述

  1. 最后来看一下效果吧
    3.1 执行后,成功获取到长文本。点击编辑
    在这里插入图片描述
    3.2 点编辑后变为可编辑模式,写入【测试编辑】后点保存。
    在这里插入图片描述
    3.3 保存成功恢复为只读状态
    在这里插入图片描述
    3.4 最后到订单界面验证,确认保存成功!
    在这里插入图片描述
  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值