ABAP 交货单屏幕增强 增加自建表

这篇博客详细介绍了如何在实际业务的交货单行项目中增加一个长文本框,用于显示和编辑多个传票号。实现过程包括在自定义屏幕添加控件,设置其编辑权限,以及在PBO中定义事件来处理屏幕数据的读取和保存。博主通过创建内存ID来避免覆盖用户输入,并在交货单处理过程中通过增强点更新数据库。博客还提供了相关的ABAP代码示例。
摘要由CSDN通过智能技术生成

需求描述:

实际业务中,交货单行项目存在多个传票号,所以需要在交货单行项目自定义屏幕上增加一个长文本框(或者表),如下图所示

实现过程:

1. 屏幕添加控件

①在自定义屏幕添加自定义控件

②在PBO中定义事件

 这是定义函数组全部变量

 这是创建文本框代码

 ③设置文本框可编辑/只读

2. 将数据库表数据显示在屏幕上,需要考虑修改交货时不能覆盖用户输入数据,因为屏幕数据会传入ABAP内存所以仅当该内存不存在时才查询数据库表

 3. 将屏幕输入数据保存至数据库表,通过MEMORY ID实现数据传输

①在屏幕数据回传函数中将屏幕数据传入ABAP内存

 ②对交货单处理增强点LE_SHP_DELIVERY_PROC创建实施,修改方法IF_EX_LE_SHP_DELIVERY_PROC~SAVE_DOCUMENT_PREPARE将ABAP内存数据更新数据库表

总是提示此文章质量较低,猜测是字数不够,所以附上源码

PROCESS BEFORE OUTPUT.
  MODULE TEXTEDIT_9200.
  MODULE STATUS_9200.

PROCESS AFTER INPUT.
* MODULE USER_COMMAND_9001.
*&---------------------------------------------------------------------*
*& Module STATUS_9200 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE STATUS_9200 OUTPUT.
  LOOP AT SCREEN.
    IF GS_LIPS-WBSTA = 'C'.
      SCREEN-INPUT = '0'.

      IF GC_EDITOR IS NOT INITIAL.
        GC_EDITOR->SET_READONLY_MODE( 1 ).
      ENDIF.
    ELSE.
      ASSIGN ('(SAPMV50A)T180-TRTYP') TO <FS_ANY>.
      IF <FS_ANY> IS ASSIGNED.
        IF <FS_ANY> = 'A'.
          SCREEN-INPUT = '0'.

          IF GC_EDITOR IS NOT INITIAL.
            GC_EDITOR->SET_READONLY_MODE( 1 ).
          ENDIF.
        ELSE.
          SCREEN-INPUT = '1'.

          IF GC_EDITOR IS NOT INITIAL.
            GC_EDITOR->SET_READONLY_MODE( 0 ).
          ENDIF.
        ENDIF.
      ENDIF.
    ENDIF.

    MODIFY SCREEN.
  ENDLOOP.

ENDMODULE.

*&---------------------------------------------------------------------*
*& Module TEXTEDIT_9200 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE TEXTEDIT_9200 OUTPUT.
  DATA: LT_ZTSD053   TYPE STANDARD TABLE OF ZTSD053,
        LS_ZTSD053   TYPE ZTSD053,
        LV_ZZSUMMONS TYPE STRING,
        LV_LFIMG     TYPE STRING,
        LV_STRING    TYPE STRING.

  CLEAR: LT_ZTSD053, LV_ZZSUMMONS, LV_LFIMG, LV_STRING.

* 创建文本框
  IF GC_CONTAINER IS INITIAL.
    CREATE OBJECT GC_CONTAINER
      EXPORTING
        CONTAINER_NAME              = 'GC_ZZSUMMONS'
      EXCEPTIONS
        CNTL_ERROR                  = 1
        CNTL_SYSTEM_ERROR           = 2
        CREATE_ERROR                = 3
        LIFETIME_ERROR              = 4
        LIFETIME_DYNPRO_DYNPRO_LINK = 5.
    IF SY-SUBRC <> 0.
      MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF .

    CREATE OBJECT GC_EDITOR
      EXPORTING
        "   MAX_NUMBER_CHARS       = 2000    "字数限制
        PARENT                     = GC_CONTAINER
        WORDWRAP_MODE              = CL_GUI_TEXTEDIT=>WORDWRAP_AT_WINDOWBORDER
        WORDWRAP_POSITION          = -1
        WORDWRAP_TO_LINEBREAK_MODE = CL_GUI_TEXTEDIT=>FALSE
      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 SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.

    GC_EDITOR->SET_TOOLBAR_MODE( 0 ).
    GC_EDITOR->SET_STATUSBAR_MODE( 0 ).
  ENDIF.

* 获取内存数据
  IMPORT LT_ZTSD053 = LT_ZTSD053 FROM MEMORY ID 'ZTSD053'.
  IF SY-SUBRC <> 0.
*   查询传票号
    SELECT VBELN,
           POSNR,
           ZZSUMMONS,
           LFIMG
      INTO CORRESPONDING FIELDS OF TABLE @LT_ZTSD053
      FROM ZTSD053
     WHERE VBELN = @GS_LIPS-VBELN.
    IF SY-SUBRC <> 0.
      SELECT VBELN,
             POSNR,
             ZZSUMMONS
        INTO TABLE @DATA(LT_LIPS)
        FROM LIPS
       WHERE VBELN     =  @GS_LIPS-VBELN
         AND ZZSUMMONS <> ''.
      LOOP AT LT_LIPS INTO DATA(LS_LIPS).
        SPLIT LS_LIPS-ZZSUMMONS AT '|' INTO TABLE DATA(LT_ZZSUMMONS).
        LOOP AT LT_ZZSUMMONS INTO DATA(LS_ZZSUMMONS).
          LS_ZTSD053-VBELN = LS_LIPS-VBELN.
          LS_ZTSD053-POSNR = LS_LIPS-POSNR.
          SPLIT LS_ZZSUMMONS AT ':' INTO LS_ZTSD053-ZZSUMMONS LV_LFIMG.
          LS_ZTSD053-LFIMG = LV_LFIMG.
          APPEND LS_ZTSD053 TO LT_ZTSD053.
          CLEAR: LS_ZTSD053, LV_LFIMG.
        ENDLOOP.
      ENDLOOP.
    ENDIF.

*   将传票号传入内存
    EXPORT LT_ZTSD053 = LT_ZTSD053 TO MEMORY ID 'ZTSD053'.
  ENDIF.

* 编辑传票号转成长文本
  LOOP AT LT_ZTSD053 INTO LS_ZTSD053 WHERE VBELN = GS_LIPS-VBELN
                                       AND POSNR = GS_LIPS-POSNR.
    IF LS_ZTSD053-LFIMG IS NOT INITIAL.
      LV_LFIMG = LS_ZTSD053-LFIMG.
      CONDENSE LV_LFIMG.
      CONCATENATE LS_ZTSD053-ZZSUMMONS LV_LFIMG
             INTO LV_STRING SEPARATED BY ':'.
    ELSE.
      LV_STRING = LS_ZTSD053-ZZSUMMONS.
    ENDIF.

    IF LV_ZZSUMMONS IS INITIAL.
      LV_ZZSUMMONS = LV_STRING.
    ELSE.
      CONCATENATE LV_ZZSUMMONS LV_STRING
             INTO LV_ZZSUMMONS SEPARATED BY '|'.
    ENDIF.
  ENDLOOP.

  GC_EDITOR->SET_TEXTSTREAM( LV_ZZSUMMONS ).

ENDMODULE.
FUNCTION ZSD_SHP_ITEM_FROM_SUBSCREEN .
*"----------------------------------------------------------------------
*"*"本地接口:
*"  EXPORTING
*"     REFERENCE(ES_LIPS) TYPE  LIPS
*"----------------------------------------------------------------------
  DATA: LT_LINE      TYPE TABLE OF LINE,
        LT_TLINE     TYPE TABLE OF TLINE,
        LT_ZTSD053   TYPE STANDARD TABLE OF ZTSD053,
        LS_ZTSD053   TYPE ZTSD053,
        LV_ZZSUMMONS TYPE STRING,
        LV_LFIMG     TYPE STRING.

* 获取传票号文本框内容
  LV_ZZSUMMONS = ZCL_UTIL_LONGTEXT=>GET_TXT_FROM_TE( IO_TE = GC_EDITOR ).

* 清除内存中该行项目数据
  IMPORT LT_ZTSD053 = LT_ZTSD053 FROM MEMORY ID 'ZTSD053'.
  IF SY-SUBRC = 0.
    DELETE LT_ZTSD053 WHERE VBELN = GS_LIPS-VBELN
                        AND POSNR = GS_LIPS-POSNR.
  ENDIF.

* 编辑传票号以便写入自建表
  IF LV_ZZSUMMONS IS NOT INITIAL.
    SPLIT LV_ZZSUMMONS AT '|' INTO TABLE DATA(LT_ZZSUMMONS).
    LOOP AT LT_ZZSUMMONS INTO DATA(LS_ZZSUMMONS).
      LS_ZTSD053-VBELN = GS_LIPS-VBELN.
      LS_ZTSD053-POSNR = GS_LIPS-POSNR.
      SPLIT LS_ZZSUMMONS AT ':' INTO LS_ZTSD053-ZZSUMMONS LV_LFIMG.
      LS_ZTSD053-LFIMG = LV_LFIMG.
      APPEND LS_ZTSD053 TO LT_ZTSD053.
      CLEAR: LS_ZTSD053, LV_LFIMG.
    ENDLOOP.
  ENDIF.

* 将传票号传入内存(增强ZEHM_QTC010_001 方法IF_EX_LE_SHP_DELIVERY_PROC~SAVE_DOCUMENT_PREPARE)
  EXPORT LT_ZTSD053 = LT_ZTSD053 TO MEMORY ID 'ZTSD053'.

  ES_LIPS = GS_LIPS.
  ES_LIPS-ZZSUMMONS = LV_ZZSUMMONS.

ENDFUNCTION.
  METHOD IF_EX_LE_SHP_DELIVERY_PROC~SAVE_DOCUMENT_PREPARE.
    DATA: LT_ZTSD053   TYPE STANDARD TABLE OF ZTSD053,
          LS_ZTSD053   TYPE ZTSD053,
          LV_ZZSUMMONS TYPE STRING.

*   传票号写入自建表(数据来自函数 ZSD_SHP_ITEM_FROM_SUBSCREEN )
    IMPORT LT_ZTSD053 = LT_ZTSD053 FROM MEMORY ID 'ZTSD053'.
    IF SY-SUBRC = 0.
*     先清空历史数据
      READ TABLE CT_XLIKP INTO DATA(LS_LIKP) INDEX 1.
      IF SY-SUBRC = 0.
        DELETE FROM ZTSD053 WHERE VBELN = LS_LIKP-VBELN.
      ENDIF.

      MODIFY ZTSD053 FROM TABLE LT_ZTSD053.
      FREE MEMORY ID 'ZTSD053'.
    ENDIF.


  ENDMETHOD.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值