ABAP长文本框屏幕增强(交货单行)

说明:和上一篇帖子(ABAP 交货单行项目屏幕增强_weixin_49689040的博客-优快云博客)是一起的,在其基础之上增加长文本框。

一、在屏幕创建容器

容器名称:CON_9001 

二、定义容器及其他变量

DATA : custom_container1 TYPE REF TO cl_gui_custom_container,
       editor1           TYPE REF TO cl_gui_textedit,
       lines             TYPE STANDARD TABLE OF tline,
       header            TYPE thead,
       texttable         TYPE TABLE OF textline.

在PBO初始化模块添加代码

* 创建容器
    create object custom_container1
      exporting
        container_name              = 'CONTAINER_9001' "容器(表控件)名
      exceptions
        cntl_error                  = 1
        cntl_system_error           = 2
        create_error                = 3
        lifetime_error              = 4
        lifetime_dynpro_dynpro_link = 5
        others                      = 6.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE 'I'
    NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
  CREATE OBJECT editor1
    EXPORTING
      wordwrap_mode              = cl_gui_textedit=>wordwrap_at_fixed_position
      wordwrap_to_linebreak_mode = cl_gui_textedit=>true
      parent                     = custom_container1
    EXCEPTIONS
      error_cntl_create          = 1
      error_cntl_init            = 2
      error_cntl_link            = 3
      error_dp_create            = 4
      gui_type_not_supported     = 5
      OTHERS                     = 6.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE 'I'
    NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
* 去掉状态栏
  CALL METHOD editor1->set_statusbar_mode
    EXPORTING
      statusbar_mode = cl_gui_textedit=>false.
* 去掉工具栏
  CALL METHOD editor1->set_toolbar_mode
    EXPORTING
      toolbar_mode = cl_gui_textedit=>false.
* 文本框不可编辑
  IF gv_trtyp EQ 'A'."显示
    CALL METHOD editor1->set_readonly_mode
      EXPORTING
        readonly_mode          = '1'
      EXCEPTIONS
        error_cntl_call_method = 1
        invalid_parameter      = 2
        OTHERS                 = 3.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid
      TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
  ENDIF .

这时长文本框已经出来了,但是不能存表啥的,我们需要在进一步处理

 三、SE75创建文本对象

 之后保存

由于是在屏幕增强中写的,创建完文本对象后,我们要在PBO的时候读取文本对象,写入屏幕中,在PAI的时候创建位版本对象,保存数据

四、在PBO INIT_DATA初始化模块添加读取文本对象,放置屏幕的逻辑

* 读取文本对象的文本
  CALL FUNCTION 'READ_TEXT'
    EXPORTING
      id                      = 'ZT01'"header-tdid
      language                = '1'"header-tdspras
      name                    = '123123123'"header-tdname
      object                  = 'ZSD001_TXT'"header-tdobject
    TABLES
      lines                   = 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.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
* 转换文本流
  CALL FUNCTION 'CONVERT_ITF_TO_STREAM_TEXT'
    EXPORTING
      language    = sy-langu
    TABLES
      itf_text    = lines
      text_stream = texttable.
* 将取到的文本写入画面的文本框中
  CALL METHOD editor1->set_text_as_stream
    EXPORTING
      text            = texttable
    EXCEPTIONS
      error_dp        = 1
      error_dp_create = 2
      OTHERS          = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

五、在PAI SAVE_READTXT模块添加保存文本对象的逻辑

MODULE save_readtxt INPUT.
  FIELD-SYMBOLS <fs> TYPE REF TO cl_gui_textedit.
  FIELD-SYMBOLS <fs2>  ##NEEDED
                 TYPE i.
  DATA : lt_table  TYPE STANDARD TABLE OF tdline,
         l_modi    TYPE i,
         lt_tlines TYPE TABLE OF tline,
         ls_tlines TYPE tline,
         l_thead   TYPE thead.
  ASSIGN ('EDITOR1') TO <fs>.
  header-tdobject = 'ZSD001_TXT'. "文本对象
  header-tdname = '123123123'."文本名
  header-tdid = 'ZT01'. "文本ID
  header-tdspras = 1. "语言
* 获取长文本输入框的内容
  CALL METHOD <fs>->get_text_as_r3table
    IMPORTING
      table                  = lt_table
      is_modified            = l_modi
    EXCEPTIONS
      error_dp               = 1
      error_cntl_call_method = 2
      error_dp_create        = 3
      OTHERS                 = 4.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSEIF l_modi = 1.
    LOOP AT lt_table INTO ls_tlines-tdline.
      APPEND ls_tlines TO  lt_tlines.
    ENDLOOP.
    l_thead-tdid = 'ZT01'.
    l_thead-tdspras = '1'.
    l_thead-tdname = '123123123'.
    l_thead-tdobject = 'ZSD001_TXT' .
* 调用方法创建保存文本对象
    CALL FUNCTION 'CREATE_TEXT'
      EXPORTING
        fid       = l_thead-tdid
        flanguage = l_thead-tdspras
        fname     = l_thead-tdname
        fobject   = l_thead-tdobject
      TABLES
        flines    = lt_tlines
      EXCEPTIONS
        no_init   = 1
        no_save   = 2
        OTHERS    = 3.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
  ENDIF.
ENDMODULE.

 完成代码(和正常字段增强一起)

屏幕

 包含文件:LZFG_VL01N_ITEMO01

*----------------------------------------------------------------------*
***INCLUDE LZFG_VL01N_ITEMO01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module INTI_DATA OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE init_data OUTPUT.

  IF gv_trtyp EQ 'A'."显示
    LOOP AT  SCREEN .
      screen-input = 0 .
      MODIFY SCREEN .
    ENDLOOP.
  ELSEIF gv_trtyp EQ 'V' OR gv_trtyp EQ 'H'.
    LOOP AT  SCREEN .
      screen-input = 1 .
      MODIFY SCREEN .
    ENDLOOP.
  ENDIF.


* 创建容器
  CREATE OBJECT custom_container1
    EXPORTING
      container_name              = 'CON_9001' "容器(表控件)名
    EXCEPTIONS
      cntl_error                  = 1
      cntl_system_error           = 2
      create_error                = 3
      lifetime_error              = 4
      lifetime_dynpro_dynpro_link = 5
      OTHERS                      = 6.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE 'I'
    NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
  CREATE OBJECT editor1
    EXPORTING
      wordwrap_mode              = cl_gui_textedit=>wordwrap_at_fixed_position
      wordwrap_to_linebreak_mode = cl_gui_textedit=>true
      parent                     = custom_container1
    EXCEPTIONS
      error_cntl_create          = 1
      error_cntl_init            = 2
      error_cntl_link            = 3
      error_dp_create            = 4
      gui_type_not_supported     = 5
      OTHERS                     = 6.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE 'I'
    NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

* 去掉状态栏
  CALL METHOD editor1->set_statusbar_mode
    EXPORTING
      statusbar_mode = cl_gui_textedit=>false.
* 去掉工具栏
  CALL METHOD editor1->set_toolbar_mode
    EXPORTING
      toolbar_mode = cl_gui_textedit=>false.
* 文本框不可编辑
  IF gv_trtyp EQ 'A'."显示
    CALL METHOD editor1->set_readonly_mode
      EXPORTING
        readonly_mode          = '1'
      EXCEPTIONS
        error_cntl_call_method = 1
        invalid_parameter      = 2
        OTHERS                 = 3.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid
      TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
  ENDIF .

* 读取文本对象的文本
  CALL FUNCTION 'READ_TEXT'
    EXPORTING
      id                      = 'ZT01'"header-tdid
      language                = '1'"header-tdspras
      name                    = '123123123'"header-tdname
      object                  = 'ZSD001_TXT'"header-tdobject
    TABLES
      lines                   = 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.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
* 转换文本流
  CALL FUNCTION 'CONVERT_ITF_TO_STREAM_TEXT'
    EXPORTING
      language    = sy-langu
    TABLES
      itf_text    = lines
      text_stream = texttable.
* 将取到的文本写入画面的文本框中
  CALL METHOD editor1->set_text_as_stream
    EXPORTING
      text            = texttable
    EXCEPTIONS
      error_dp        = 1
      error_dp_create = 2
      OTHERS          = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.


ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  SAVE_READTXT  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE save_readtxt INPUT.

  FIELD-SYMBOLS <fs> TYPE REF TO cl_gui_textedit.
  FIELD-SYMBOLS <fs2>  ##NEEDED
                 TYPE i.
  DATA : lt_table  TYPE STANDARD TABLE OF tdline,
         l_modi    TYPE i,
         lt_tlines TYPE TABLE OF tline,
         ls_tlines TYPE tline,
         l_thead   TYPE thead.
  ASSIGN ('EDITOR1') TO <fs>.
  header-tdobject = 'ZSD001_TXT'. "文本对象
  header-tdname = '123123123'."文本名
  header-tdid = 'ZT01'. "文本ID
  header-tdspras = 1. "语言
* 获取长文本输入框的内容
  CALL METHOD <fs>->get_text_as_r3table
    IMPORTING
      table                  = lt_table
      is_modified            = l_modi
    EXCEPTIONS
      error_dp               = 1
      error_cntl_call_method = 2
      error_dp_create        = 3
      OTHERS                 = 4.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ELSEIF l_modi = 1.
    LOOP AT lt_table INTO ls_tlines-tdline.
      APPEND ls_tlines TO  lt_tlines.
    ENDLOOP.
    l_thead-tdid = 'ZT01'.
    l_thead-tdspras = '1'.
    l_thead-tdname = '123123123'.
    l_thead-tdobject = 'ZSD001_TXT' .
* 调用方法创建保存文本对象
    CALL FUNCTION 'CREATE_TEXT'
      EXPORTING
        fid       = l_thead-tdid
        flanguage = l_thead-tdspras
        fname     = l_thead-tdname
        fobject   = l_thead-tdobject
      TABLES
        flines    = lt_tlines
      EXCEPTIONS
        no_init   = 1
        no_save   = 2
        OTHERS    = 3.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
  ENDIF.

ENDMODULE.

包含文件:LZFG_VL01N_ITEMTOP

FUNCTION-POOL zfg_vl01n_item.               "MESSAGE-ID ..

* INCLUDE LZFG_VL01N_ITEMD...                " Local class definition
* INCLUDE LZFG_VL01N_ITEMD...                " Local class definition
DATA:gs_info_tab TYPE lips.
DATA:gv_trtyp TYPE trtyp.
TABLES :lips.

DATA : custom_container1 TYPE REF TO cl_gui_custom_container,
       editor1           TYPE REF TO cl_gui_textedit,
       lines             TYPE STANDARD TABLE OF tline,
       header            TYPE thead,
       texttable         TYPE TABLE OF textline.

包含文件 : LZFG_VL01N_ITEMUXX(创建完函数模块自动生成)

*****************************************************************
*   THIS FILE IS GENERATED BY THE FUNCTION LIBRARY.             *
*   NEVER CHANGE IT MANUALLY, PLEASE!                           *
*****************************************************************
INCLUDE LZFG_VL01N_ITEMU01.
                    "ZSD_FM_TRANS_ITEM_TO_SCREEN
INCLUDE LZFG_VL01N_ITEMU02.
                    "ZFM_GET_DATA_FROM_SCREEN

 SE19->ZSD_SHP_TAB_CUST_ITEM

<think>好的,用户想了解ABAP中关于交货单的功能增强方法。首先,我需要回忆一下ABAP中常见的增强技术。交货单相关的增强通常涉及到用户出口、BADI、屏幕增强,可能还有隐式增强点。 记得用户提到过交货单行项目的屏幕增强,比如文本框增强,这个应该属于屏幕增强的部分,可能使用屏幕增强技术,比如在SPRO中找到对应的增强点,或者使用用户出口。另外,BADI(Business Add-In)也是SAP中常用的增强方式,比如交货单的保存、检查等环节可能有对应的BADI。 然后,隐式增强点也是需要考虑的,尤其是在标准程序的子程序中,可以通过SE38找到对应的程序,插入自己的代码。比如在保存逻辑前后添加自定义验证或数据处理。 用户可能还需要知道具体的实现步骤,比如如何查找用户出口,如何激活和实施BADI,以及如何创建屏幕增强。需要分步骤说明这些方法,并给出示例代码,这样用户能更直观地理解。 还要注意引用之前提到的参考文献,比如用户提供的引用[1]和[2],特别是引用[1]中提到的交货单行项目的屏幕增强,可能需要提到这个博客中的内容作为参考。同时,确保回答结构清晰,分点列出不同的增强方法,并解释每种方法的适用场景和实现步骤。 另外,用户可能对如何选择不同的增强方法有疑问,比如何时使用用户出口,何时使用BADI,所以需要简要比较这些方法的优缺点。例如,用户出口是较旧的技术,而BADI更灵活,支持面向对象的方法。 最后,生成相关问题时要围绕交货增强的其他方面,比如性能优化、数据校验增强、与其他模块的集成等,这样用户可以有进一步的学习方向。</think>### ABAP交货单功能增强实现方式 在ABAP中实现交货单功能增强主要包含以下四种方法,需根据具体需求选择合适的技术方案: #### 一、用户出口(User Exit)增强 1. **定位出口** 使用事务码`CMOD`创建项目,通过「增强分配」搜索与交货单相关的模块池程序(如`MV45AFZZ`)。 2. **代码注入** 在出口函数`EXIT_<程序名>_<编号>`中添加逻辑,例如在保存前校验数据: ```abap IF vbap-werks = '1000' AND vbap-lgort = ''. MESSAGE e888(sabapdocu) WITH '库存地点必填'. ENDIF. ``` #### 二、BADI增强(推荐方法) 1. **查找BADI** 交货单相关BADI包括: - `LE_SHP_DELIVERY_PROC`(交货单处理) - `LE_SHP_TABLES_CONTROL`(表控制) - `LE_SHP_ITEM_DIALOG`(行项目交互) 2. **BADI实现示例** 在`METHOD if_ex_le_shp_delivery_proc~change_delivery_header`中添加自定义逻辑: ```abap METHOD if_ex_le_shp_delivery_proc~change_delivery_header. IF cs_likp-vsart = '01' AND cs_likp-lfart <> 'LF'. cs_likp-lfart = 'LF'. ENDIF. ENDMETHOD. ``` #### 三、隐式增强点(Enhancement Spot) 1. **定位增强点** 使用事务码`SE38`打开标准程序(如`SAPLV50A`),通过编辑菜单的「增强操作」查找可插入代码的位置。 2. **典型应用场景** 在`FORM delivery_save`前后添加自定义校验或数据写入: ```abap ENHANCEMENT 1 ZENH_DELIV_SAVE. "隐式增强激活 PERFORM z_check_delivery_before_save. ENDENHANCEMENT. ``` #### 四、屏幕增强 1. **标准屏幕扩展** 通过事务码`SPRO`路径: `后勤执行 -> 装运 -> 交货 -> 定义交货类型的屏幕格式`,可添加自定义字段至标准屏幕。 2. **自定义子屏幕** 使用用户出口`EXIT_SAPLV50A_001`注入子屏幕(参考引用[1]中的文本框实现)[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

消气伟消消气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值