MIGO屏幕增强

增强步骤

1.为主表添加附加结构

在这里插入图片描述

由于S4版本物料凭证表来源于MATDOC,因此也需要在MATDOC里增加附加结构。
(抬头NSDM_S_HEADER,行项目NSDM_S_ITEM)
在这里插入图片描述在这里插入图片描述

2.创建DDL视图用于扩展标准CDS视图(S4版本需要)

可参考NOTE:2686694
打开ECLIPSE ADT工具,在开发包中右键创建DDL视图
在这里插入图片描述在这里插入图片描述

创建CDS视图并激活

@AbapCatalog.sqlViewAppendName:'ZMMS_MKPF_V'
@EndUserText.label:'APPEND MKPF'
@AccessControl.authorizationCheck:#NOT_REQUIRED
EXTEND VIEW NSDM_E_MKPF with ZMMS_MKPF_E
{
   ZZWMSUSER,
   ZZWMSID
}

3.新建函数组

在这里插入图片描述

创建抬头数据的传入传出函数

FUNCTION zmmfu_migo_get_data.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  EXPORTING
*"     REFERENCE(OS_OUTPUT) TYPE  ZMMS_MKPF
*"----------------------------------------------------------------------

  MOVE-CORRESPONDING zmms_mkpf TO os_output.

ENDFUNCTION.
FUNCTION zmmfu_migo_set_data.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(IS_INPUT) TYPE  ZMMS_MKPF
*"----------------------------------------------------------------------

  MOVE-CORRESPONDING is_input TO zmms_mkpf.

ENDFUNCTION.

创建获取操作码的函数

FUNCTION zmmfu_migo_set_goaction.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(I_GOACTION) TYPE  GOACTION
*"     REFERENCE(I_REFDOC) TYPE  REFDOC
*"----------------------------------------------------------------------

  gv_goaction = i_goaction.
  gv_refdoc = i_refdoc.

ENDFUNCTION.

绘制子屏幕
TOP文件设置全局变量

FUNCTION-POOL zmmfg001.                     "MESSAGE-ID ..

* INCLUDE LZMMFG001D...                      " Local class definition

TABLES:zmms_mkpf.

DATA:gv_goaction TYPE goaction,
     gv_refdoc   TYPE refdoc,
     gv_action   TYPE action.

PBO

*----------------------------------------------------------------------*
***INCLUDE LZMMFG001O01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Module STATUS_9001 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_9001 OUTPUT.
* SET PF-STATUS 'xxxxxxxx'.
* SET TITLEBAR 'xxx'.
  LOOP AT SCREEN.
    IF screen-name+0(12) = 'ZMMS_MKPF-ZZ'.
      CASE gv_goaction.
        WHEN 'A04'.
          screen-input = '0'.
        WHEN OTHERS.
      ENDCASE.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.

ENDMODULE.

行项目需要实现PBO_DETAIL、PAI_DETAIL、LINE_MODIFY、LINE_DELETE方法

4.实施BADI

实施BADI: MB_MIGO_BADI
BADI属性中增加以下变量(保存自定义表使用,标准表可忽略)
在这里插入图片描述
实现抬头的PBO方法

  METHOD if_ex_mb_migo_badi~pbo_header.
 
    CHECK gv_class_id = i_class_id AND i_class_id IS NOT INITIAL.

    CALL FUNCTION 'ZMMFU_MIGO_SET_DATA'
      EXPORTING
        is_input = is_mkpf_badi.

    e_cprog = 'SAPLZMMFG001'.
    e_dynnr = '9001'.
    e_heading = 'WMS信息'.

  ENDMETHOD.

实现抬头的PAI方法

  METHOD if_ex_mb_migo_badi~pai_header.

    DATA:ls_mkpf_badi TYPE zmms_mkpf.

    CALL FUNCTION 'ZMMFU_MIGO_GET_DATA'
      IMPORTING
        os_output = ls_mkpf_badi.

    MOVE-CORRESPONDING ls_mkpf_badi TO is_mkpf_badi.

  ENDMETHOD.

实现抬头数据从数据库中读取的方法

  METHOD if_ex_mb_migo_badi~status_and_header.

    IF is_gohead-mblnr IS NOT INITIAL AND is_gohead-mjahr IS NOT INITIAL AND is_mkpf_badi IS INITIAL.
      SELECT SINGLE *
        FROM mkpf
        INTO @DATA(ls_mkpf)
       WHERE mblnr = @is_gohead-mblnr
         AND mjahr = @is_gohead-mjahr.

      MOVE-CORRESPONDING ls_mkpf TO is_mkpf_badi.
      CLEAR:ls_mkpf.
    ENDIF.

  ENDMETHOD.

实现重置方法

  METHOD if_ex_mb_migo_badi~reset.
    CLEAR:is_mkpf_badi.
  ENDMETHOD.

实现操作模式赋值方法


  METHOD if_ex_mb_migo_badi~mode_set.

* ACTION and REFDOC will discribe the mode of transaction MIGO.
* ----------------------------------------------------------------------
* i_action:
* A01 = Goods receipt
* A02 = Return delivery
* A03 = Cancellation
* A04 = Display
* A05 = Release GR bl.st.
* A06 = Subsequent deliv.
* A07 = Goods issue
*
* i_refdoc:
* R01 = Purchase order
* R02 = Material document
* R03 = Delivery note
* R04 = Inbound delivery
* R05 = Outbound delivery
* R06 = Transport
* R07 = Transport ID code
* R08 = Order
* R09 = Reservation
* R10 = Other GR
*-----------------------------------------------------------------------
    CALL FUNCTION 'ZMMFU_MIGO_SET_GOACTION'
      EXPORTING
        i_goaction = i_action
        i_refdoc   = i_refdoc.

  ENDMETHOD.

保存赋值有两种方式,如果使用的是自定义表保存,则需要通过更新函数实现POST_DOCUMENT方法即可

  METHOD if_ex_mb_migo_badi~post_document.

    CALL FUNCTION 'ZMIGO_BADI_UPDATE_DATA' IN UPDATE TASK
      EXPORTING
        i_zmkpf = is_mkpf_badi.

  ENDMETHOD.

而如果是在标准表中增加字段,则需要实现另一个保存BADI:MB_DOCUMENT_BADI.
由于BADI中的参数是传入参数,无法修改,因此需要找到BADI的调用点,通过更新内存变量实现
在这里插入图片描述

  METHOD if_ex_mb_document_badi~mb_document_before_update.

    DATA:lv_field(40) TYPE c,
         ls_mkpf      TYPE zmms_mkpf.

    FIELD-SYMBOLS:<lfs_xmkpf> TYPE ANY TABLE,
                  <lfs_mkpf>  TYPE mkpf.

    "需要限制前台事务码,否则BAPI传值会被清空
    IF sy-tcode = 'MIGO'.
      lv_field = '(SAPMM07M)XMKPF[]'.
      ASSIGN (lv_field) TO <lfs_xmkpf>.

      CALL FUNCTION 'ZMMFU_MIGO_GET_DATA'
        IMPORTING
          os_output = ls_mkpf.

      LOOP AT <lfs_xmkpf> ASSIGNING <lfs_mkpf>.
        MOVE-CORRESPONDING ls_mkpf TO <lfs_mkpf>.
      ENDLOOP.
    ENDIF.

  ENDMETHOD.

5.BAPI增强

注:使用自定义表的方式不需要此步骤
如果需要在BAPI中传值增强字段,也就是在EXTENSIONIN结构中赋值,需要实施对象增强点:MB_GOODSMOVEMENT中的BADI:MB_BAPI_GOODSMVT_CREATE
在这里插入图片描述
SE19中新建实施
在这里插入图片描述在这里插入图片描述在这里插入图片描述
由于是复制的示例类,可以看到方法中已经实现的代码,可根据实际情况进行调整

METHOD if_ex_mb_bapi_goodsmvt_create~extensionin_to_matdoc.

  DATA:
    c_lenstruc          TYPE i VALUE 30,
    wa_bapi_mb_header   TYPE bapi_te_xmkpf,
    wa_bapi_mb_item     TYPE bapi_te_xmseg,
    wa_extension_in     TYPE bapiparex.

  FIELD-SYMBOLS:
    <fs_imseg>          TYPE imseg.

  CHECK NOT extension_in[] IS INITIAL.

* Analyze IMSEG for document structure and assign LINE_IDs if necessary
  CALL METHOD cl_mmim_line_id_manager=>analyze_mb_create
    CHANGING
      ct_imseg          = ct_imseg[]
    EXCEPTIONS
      duplicate_line_id = 1
      OTHERS            = 2.

  LOOP AT extension_in INTO wa_extension_in.
    CASE wa_extension_in-structure.
* extension of MKPF
      WHEN 'BAPI_TE_XMKPF'.
        MOVE wa_extension_in+c_lenstruc TO wa_bapi_mb_header.
        MOVE-CORRESPONDING wa_bapi_mb_header TO cs_imkpf.
* extension of MSEG
      WHEN 'BAPI_TE_XMSEG'.
        MOVE wa_extension_in+c_lenstruc TO wa_bapi_mb_item.
        READ TABLE ct_imseg
          WITH KEY line_id = wa_bapi_mb_item-matdoc_itm
          ASSIGNING <fs_imseg>.
        IF sy-subrc EQ 0.
          MOVE-CORRESPONDING wa_bapi_mb_item TO <fs_imseg>.
        ENDIF.
    ENDCASE.
  ENDLOOP.

ENDMETHOD.

在BAPI增强结构中添加附加结构
在这里插入图片描述在这里插入图片描述

BAPI调用即可

    LOOP AT it_input ASSIGNING <lfs_input>.
      "抬头
      ls_goodsmvt_header-pstng_date = sy-datum.
      ls_goodsmvt_header-doc_date = sy-datum.
      ls_goodsmvt_header-pr_uname = sy-uname.

      lv_goodsmvt_code = '02'.

      "行项目
      ls_goodsmvt_item-stge_loc = <lfs_input>-lgort.       "存储地点
      ls_goodsmvt_item-batch = <lfs_input>-charg.          "批次
      ls_goodsmvt_item-move_type = <lfs_input>-bwart.      "移动类型
      ls_goodsmvt_item-orderid = <lfs_input>-aufnr.        "生产订单
      ls_goodsmvt_item-quantity = <lfs_input>-psmng.       "数量
      APPEND ls_goodsmvt_item TO lt_goodsmvt_item.
      CLEAR:ls_goodsmvt_item.

      AT LAST.
        "增强
        ls_extensionin-structure = 'BAPI_TE_XMKPF'.
        ls_bapi_te_xmkpf-zzwmsuser = <lfs_input>-zzwmsuser.
        ls_bapi_te_xmkpf-zzwmsid = <lfs_input>-zzwmsid.

        CALL METHOD cl_abap_container_utilities=>fill_container_c
          EXPORTING
            im_value     = ls_bapi_te_xmkpf
          IMPORTING
            ex_container = ls_extensionin-valuepart1.      "增强结构数据

        APPEND ls_extensionin TO lt_extensionin.
        CLEAR:ls_extensionin,ls_bapi_te_xmkpf.

        "创建物料凭证
        CALL FUNCTION 'BAPI_GOODSMVT_CREATE'
          EXPORTING
            goodsmvt_header  = ls_goodsmvt_header
            goodsmvt_code    = lv_goodsmvt_code
*           TESTRUN          = ' '
*           GOODSMVT_REF_EWM =
*           GOODSMVT_PRINT_CTRL           =
          IMPORTING
*           GOODSMVT_HEADRET =
            materialdocument = lv_materialdocument
            matdocumentyear  = lv_matdocumentyear
          TABLES
            goodsmvt_item    = lt_goodsmvt_item
*           GOODSMVT_SERIALNUMBER         =
            return           = lt_return
*           GOODSMVT_SERV_PART_DATA       =
            extensionin      = lt_extensionin
*           GOODSMVT_ITEM_CWM             =
          .
        IF line_exists( lt_return[ type = 'E'] ) OR line_exists( lt_return[ type = 'A'] ).
          CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

          LOOP AT lt_return INTO ls_return WHERE type CA 'EA'.
            IF lv_message IS INITIAL.
              lv_message = ls_return-message.
            ELSE.
              lv_message = lv_message && '/' && ls_return-message.
            ENDIF.
            CLEAR:ls_return.
          ENDLOOP.

          es_ret-code = 'E'.
          es_ret-msg = lv_message.
        ELSE.
          CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
            EXPORTING
              wait = 'X'.

          es_ret-code = 'S'.
          es_ret-msg = '创建成功'.
          es_ret-key1 = lv_materialdocument.
          es_ret-key2 = lv_matdocumentyear.
        ENDIF.

        CLEAR:lv_materialdocument,lv_matdocumentyear,lv_message,ls_goodsmvt_header,lv_goodsmvt_code.
        REFRESH:lt_goodsmvt_item,lt_return,lt_extensionin.
      ENDAT.
    ENDLOOP.

增强效果

在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值