ABAP MIGO增强实施MB_MIGO_BADI

这是一个有异议的需求,具体需求如下:

  在MIGO增强一个页签,通过页签里的数据+行项次的数据创建资产卡片,然后会写回MIGO行项次的指定栏位。

思路如下:

  1.通过MIGO的增强MB_MIGO_BADI实现增加一个页签的功能

  2.通过增强的方法LINE_MODIFY去创建资产卡片并回写数据

有异议出在,创建资产卡片需要调用BAPI:BAPI_FIXEDASSET_CREATE1,并执行COMMIT,这样存着影响MIGO功能的潜在风险

这边使用异步调用,希望能解决潜在危险!!!!!!!

具体操作如下:

  1.创建表,结构,表类型

       

 

       

此结构用于创建资产卡片的函数调用

 

  2.创建函数组(里面包括6个FUNCTION和一个屏幕):

  

   ZCREATE_ASSET :因为要异步调用,所以需要勾上远程启用的模块

  

  

  源代码如下:

复制代码
FUNCTION ZCREATE_ASSET.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_INPUT) TYPE  ZDMIGO_ITEM_ASSET
*"  EXPORTING
*"     VALUE(E_ANLN1) TYPE  BF_ANLN1
*"     VALUE(E_ANLN2) TYPE  BF_ANLN2
*"     VALUE(E_MSG) TYPE  BAPI_MSG
*"----------------------------------------------------------------------

  DATA:ls_zdmigo_item_asset TYPE zdmigo_item_asset.

  ls_zdmigo_item_asset = I_INPUT.

  DATA: ls_key                 LIKE bapi1022_key,
        ls_generaldata         LIKE bapi1022_feglg001,
        ls_timedependentdata   LIKE bapi1022_feglg003,
        ls_allocations         LIKE bapi1022_feglg004.
  DATA: ls_generaldatax        LIKE bapi1022_feglg001x,
        ls_timedependentdatax  LIKE bapi1022_feglg003x,
        ls_allocationsx        LIKE bapi1022_feglg004x.

  DATA: ls_return LIKE bapiret2.
  DATA: lv_asset TYPE bapi1022_1-assetmaino.
  DATA: lv_sub_asset TYPE bapi1022_1-assetsubno.

  DATA: lt_depreciationareas  TYPE STANDARD TABLE OF bapi1022_dep_areas,
        ls_depreciationareas  LIKE LINE OF lt_depreciationareas,
        lt_depreciationareasx TYPE STANDARD TABLE OF bapi1022_dep_areasx,
        ls_depreciationareasx LIKE LINE OF lt_depreciationareasx.

  CLEAR:  ls_key,
          ls_generaldata,
          ls_timedependentdata,
          ls_allocations.
  CLEAR:  ls_generaldatax,
          ls_timedependentdatax,
          ls_allocationsx.

  CLEAR:ls_return.
  CLEAR:lv_asset,
        lv_sub_asset.

  CLEAR:lt_depreciationareas[], ls_depreciationareas ,
        lt_depreciationareasx[], ls_depreciationareasx.


  ls_key-companycode = ls_zdmigo_item_asset-bukrs.        "公司代码

  ls_generaldata-assetclass = ls_zdmigo_item_asset-anlkl. "资产分类
  ls_generaldatax-assetclass  = 'X'.
  ls_generaldata-descript   = ls_zdmigo_item_asset-txt50. "资产描述
  ls_generaldatax-descript  = 'X'.
  ls_generaldata-main_descript = ls_zdmigo_item_asset-ztxt50."资产主号说明  BASE_UOM
  ls_generaldatax-main_descript = 'X'.
  ls_generaldata-base_uom = ls_zdmigo_item_asset-meins."单位
  ls_generaldatax-base_uom = 'X'.

  ls_timedependentdata-costcenter = ls_zdmigo_item_asset-kostl."成本中心
  ls_timedependentdatax-costcenter = 'X'.
  ls_timedependentdata-resp_cctr = ls_zdmigo_item_asset-kostlv."责任成本中心
  ls_timedependentdatax-resp_cctr = 'X'.

  ls_allocations-assetsupno = ls_zdmigo_item_asset-anlue.      "资产特技号
  ls_allocationsx-assetsupno = 'X'.


  ls_depreciationareas-area = '01'."实际折旧范围
  ls_depreciationareas-ulife_yrs = ls_zdmigo_item_asset-ndjar."计划年使用期
  ls_depreciationareas-ulife_prds = ls_zdmigo_item_asset-ndper."计划使用期间
  APPEND ls_depreciationareas TO lt_depreciationareas.

  ls_depreciationareasx-area = '01'."实际折旧范围
  ls_depreciationareasx-ulife_yrs = 'X'."计划年使用期
  ls_depreciationareasx-ulife_prds = 'X'."计划使用期间
  APPEND ls_depreciationareasx TO lt_depreciationareasx.

  CALL FUNCTION 'BAPI_FIXEDASSET_CREATE1'
    EXPORTING
      key                  = ls_key
      generaldata          = ls_generaldata 
      generaldatax         = ls_generaldatax
      timedependentdata    = ls_timedependentdata 
      timedependentdatax   = ls_timedependentdatax
      allocations          = ls_allocations 
      allocationsx         = ls_allocationsx
    IMPORTING
      asset                = lv_asset
      subnumber            = lv_sub_asset
      return               = ls_return
    TABLES
      depreciationareas    = lt_depreciationareas[]
      depreciationareasx   = lt_depreciationareasx[].

  IF lv_asset IS NOT INITIAL.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        wait = 'X'.
    E_ANLN1 = lv_asset.
    E_ANLN2 = lv_sub_asset.
  ELSE.
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
      E_MSG = ls_return-message.
  ENDIF.
  CLEAR : lv_sub_asset, lv_asset.

ENDFUNCTION.
复制代码

  ZMIGO_BADI_ITEM_CREATE_ASSET

   

  源代码如下:

复制代码
FUNCTION ZMIGO_BADI_ITEM_CREATE_ASSET.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(I_INPUT) TYPE  ZDMIGO_ITEM_ASSET
*"  EXPORTING
*"     REFERENCE(E_ANLN1) TYPE  BF_ANLN1
*"     REFERENCE(E_ANLN2) TYPE  BF_ANLN2
*"     REFERENCE(E_MSG) TYPE  BAPI_MSG
*"----------------------------------------------------------------------

  DATA:name(10).
  DATA:r_str TYPE string.

*  获取随机字符串 
  CALL FUNCTION 'GENERAL_GET_RANDOM_STRING'
    EXPORTING
      number_chars        = '10'
    IMPORTING
      RANDOM_STRING       =  r_str.
  name = r_str.

  DATA:ls_zdmigo_item_asset TYPE zdmigo_item_asset.
  ls_zdmigo_item_asset = I_INPUT.


"如下这段远程调用一定要手动敲,不要复制,不然可能数据没办法传入的异常
"NEW TASK的name我使用随机产生的名字,防止报错,详细见:https://www.cnblogs.com/seven1314pp/p/15485187.html
CALL FUNCTION 'ZCREATE_ASSET' STARTING NEW TASK name PERFORMING create_asset_ret ON END OF TASK EXPORTING I_INPUT = ls_zdmigo_item_asset. WAIT UNTIL rcv_jobs = 'X'. e_anln1 = t_bf_anln1. e_anln2 = t_bf_anln2. e_msg = t_msg. ENDFUNCTION.
复制代码

  ZMIGO_BADI_ITEM_GET_DATA

   源代码如下:

复制代码
FUNCTION ZMIGO_BADI_ITEM_GET_DATA.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  EXPORTING
*"     REFERENCE(E_OUTPUT) TYPE  ZDMIGO_ITEM
*"----------------------------------------------------------------------

  MOVE-CORRESPONDING zdmigo_item TO e_output.

ENDFUNCTION.
复制代码

 

  ZMIGO_BADI_ITEM_SET_DATA

 

  源代码如下:

复制代码
FUNCTION ZMIGO_BADI_ITEM_SET_DATA.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(I_INPUT) TYPE  ZDMIGO_ITEM
*"----------------------------------------------------------------------

  MOVE-CORRESPONDING i_input TO zdmigo_item.

ENDFUNCTION.
复制代码

  ZMIGO_BADI_ITEM_SET_GOACTION

  源代码如下:

复制代码
FUNCTION ZMIGO_BADI_ITEM_SET_GOACTION.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     REFERENCE(I_GOACTION) TYPE  GOACTION
*"     REFERENCE(I_REFDOC) TYPE  REFDOC
*"----------------------------------------------------------------------

  g_goaction = i_goaction.
  g_refdoc   = i_refdoc.

ENDFUNCTION.
复制代码

  ZMIGO_BADI_ITEM_UPDATE_DATA

 

   源代码如下:

复制代码
FUNCTION ZMIGO_BADI_ITEM_UPDATE_DATA.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  TABLES
*"      T_ZTMIGO_ITEM STRUCTURE  ZDMIGO_ITEM
*"----------------------------------------------------------------------

  DATA: ls_ztmigo_item TYPE ztmigo_item,
        lt_ztmigo_item LIKE STANDARD TABLE OF ls_ztmigo_item.

  IF t_ztmigo_item[] IS NOT INITIAL.
    LOOP AT t_ztmigo_item.
      CLEAR: ls_ztmigo_item.
      MOVE-CORRESPONDING t_ztmigo_item TO ls_ztmigo_item.
      APPEND ls_ztmigo_item TO lt_ztmigo_item.
    ENDLOOP.
    MODIFY ztmigo_item FROM TABLE lt_ztmigo_item.
  ENDIF.

ENDFUNCTION.
复制代码

   

  屏幕9001

  

   

  包含文件:LZMIGOF01

 

复制代码
*----------------------------------------------------------------------*
***INCLUDE LZMIGOF01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  SET_VRM_VALUE
*&---------------------------------------------------------------------*
*       资产特级号 下来选项 ZDMIGO_ITEM-KTOGR
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM set_vrm_value .

  DATA: fname  TYPE vrm_id VALUE 'ZDMIGO_ITEM-KTOGR',
        it_vrm TYPE vrm_values,
        wa_vrm LIKE LINE OF it_vrm.

  SELECT ktogr AS key
         ktgrtx AS text
    INTO CORRESPONDING FIELDS OF TABLE it_vrm
      FROM t095t
        WHERE ktogr IN ( '17020001', '17020002' )
          AND spras = '1'.

  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      id                    = fname
      values                = it_vrm
    EXCEPTIONS
      ID_ILLEGAL_NAME       = 1
      OTHERS                = 2
            .
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Module  ZKOSTL_HELP  INPUT
*&---------------------------------------------------------------------*
*       成本中心搜索帮助
*----------------------------------------------------------------------*
MODULE zkostl_help INPUT.
  DATA: BEGIN OF it_kostl OCCURS 0,
          kostl TYPE kostl,
          verak TYPE verak,
        END OF it_kostl.

  FIELD-SYMBOLS <fs_werks> TYPE any.
  FIELD-SYMBOLS <fs_prctr> TYPE any.
  ASSIGN ('(SAPLMIGO)GOITEM-WERKS') TO <fs_werks>.   "工厂
  ASSIGN ('(SAPLMIGO)GOITEM-PRCTR') TO <fs_prctr>.   "利润中心
  DATA:ls_bukrs TYPE bukrs.
  DATA:ls_prctr TYPE prctr.
  ls_bukrs = <fs_werks>.
  ls_prctr = <fs_prctr>.

  SELECT kostl
         verak
    INTO CORRESPONDING FIELDS OF TABLE it_kostl
      FROM csks
        WHERE kokrs = 'LSH0'
          AND bukrs = ls_bukrs.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield               = 'KOSTL'
      dynpprog               = sy-repid
      dynpnr                 = sy-dynnr
      dynprofield            = 'ZDMIGO_ITEM-KOSTL'
      value_org              = 'S'
    TABLES
      value_tab              = it_kostl
    EXCEPTIONS
      parameter_error        = 1
      no_values_found        = 2
      others                 = 3
            .
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.

ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  ZKOSTLV_HELP  INPUT
*&---------------------------------------------------------------------*
*       责任成本中心搜索帮助
*----------------------------------------------------------------------*
MODULE zkostlv_help INPUT.
    DATA: BEGIN OF it_kostlv OCCURS 0,
          kostl TYPE kostl,
          verak TYPE verak,
        END OF it_kostlv.

  FIELD-SYMBOLS <fs_werksv> TYPE any.
  FIELD-SYMBOLS <fs_prctrv> TYPE any.
  ASSIGN ('(SAPLMIGO)GOITEM-WERKS') TO <fs_werksv>.   "工厂
  ASSIGN ('(SAPLMIGO)GOITEM-PRCTR') TO <fs_prctrv>.   "利润中心
  DATA:ls_bukrsv TYPE bukrs.
  DATA:ls_prctrv TYPE prctr.
  ls_bukrsv = <fs_werksv>.
  ls_prctrv = <fs_prctrv>.

  SELECT kostl
         verak
    INTO CORRESPONDING FIELDS OF TABLE it_kostlv
      FROM csks
        WHERE kokrs = 'LSH0'
          AND bukrs = ls_bukrsv.

  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
    EXPORTING
      retfield               = 'KOSTL'
      dynpprog               = sy-repid
      dynpnr                 = sy-dynnr
      dynprofield            = 'ZDMIGO_ITEM-KOSTLV'
      value_org              = 'S'
    TABLES
      value_tab              = it_kostlv
    EXCEPTIONS
      parameter_error        = 1
      no_values_found        = 2
      others                 = 3
            .
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.
ENDMODULE.


FORM create_asset_ret USING name.

  RECEIVE RESULTS FROM FUNCTION 'ZCREATE_ASSET'
    IMPORTING
      e_anln1 = t_bf_anln1
      e_anln2 = t_bf_anln2
      e_msg   = t_msg
    EXCEPTIONS
      system_failure = 1
      communication_failure = 2.
  IF sy-subrc = 0.
    rcv_jobs = 'X'.
  ENDIF.

ENDFORM.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_9001  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_9001 INPUT.
  DATA:ls_migo_mi TYPE char8.
  CLEAR:ls_migo_mi.
  CASE sy-ucomm.
    WHEN 'Z_CREATE'.
      ls_migo_mi = 'MIGO_MI'.
      EXPORT p1 = ls_migo_mi TO MEMORY ID 'MIGOMI'.    "使用传内存的方式把数据先存起来
    WHEN OTHERS.
  ENDCASE.
ENDMODULE.
复制代码

 

  包含文件:LZMIGOO01

复制代码
*----------------------------------------------------------------------*
***INCLUDE LZMIGOO01.
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  STATUS_9001  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_9001 OUTPUT.
*  SET PF-STATUS 'xxxxxxxx'.
*  SET TITLEBAR 'xxx'.
  FIELD-SYMBOLS <fs_bwart> TYPE any.
  ASSIGN ('(SAPLMIGO)GODEFAULT_TV-BWART') TO <fs_bwart>.
  DATA:ls_bwart TYPE bwart.
  ls_bwart = <fs_bwart>.

  IF ls_bwart = '241'.          "241移动类型可输入
    FIELD-SYMBOLS <fs_lgort> TYPE any.
    ASSIGN ('(SAPLMIGO)GOITEM-LGORT') TO <fs_lgort>.
    IF <fs_lgort> = '0001' OR <fs_lgort> = '0002' OR <fs_lgort> = '0003'.   "指定仓储位置可输入
      LOOP AT SCREEN.
        IF screen-group1 = 'G1'.
          screen-input = 1.
          MODIFY SCREEN.
        ENDIF.
      ENDLOOP.
    ELSE.
*      FIELD-SYMBOLS <fs_anln1> TYPE any.
*      ASSIGN ('(SAPLMIGO)GOITEM-ANLN1') TO <fs_anln1>.
*      IF <fs_anln1> IS INITIAL.                 "资产为空可输入
*        LOOP AT SCREEN.
*          IF screen-group1 = 'G1'.
*            screen-input = 1.
*            MODIFY SCREEN.
*          ENDIF.
*        ENDLOOP.
*      ELSE.
*        LOOP AT SCREEN.
*          IF screen-group1 = 'G1'.
*            screen-input = 0.
*            MODIFY SCREEN.
*          ENDIF.
*        ENDLOOP.
*      ENDIF.
      LOOP AT SCREEN.
        IF screen-group1 = 'G1'.
          screen-input = 0.
          MODIFY SCREEN.
        ENDIF.
      ENDLOOP.
    ENDIF.

  ELSE.
    LOOP AT SCREEN.
      IF screen-group1 = 'G1'.
        screen-input = 0.
*        CASE g_goaction.
*          WHEN 'A04' OR 'A07'.  "显示或者发货
*          WHEN OTHERS.
*        ENDCASE.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ENDIF.

  PERFORM set_vrm_value.

ENDMODULE.
复制代码

  包含文件:LZMIGOTOP

复制代码
FUNCTION-POOL ZMIGO.                        "MESSAGE-ID ..

* INCLUDE LZMIGOD...                         " Local class definition
TABLES:ztmigo_item, zdmigo_item.

DATA:g_goaction TYPE goaction.
DATA:g_refdoc   TYPE refdoc.
DATA:g_action   TYPE action.

DATA:rcv_jobs TYPE c.

DATA: t_bf_anln1 TYPE bf_anln1,
      t_bf_anln2 TYPE bf_anln2.

DATA: t_msg      TYPE bapi_msg.
复制代码

  包含文件:LZMIGOUXX

复制代码
*****************************************************************
*   THIS FILE IS GENERATED BY THE FUNCTION LIBRARY.             *
*   NEVER CHANGE IT MANUALLY, PLEASE!                           *
*****************************************************************
INCLUDE LZMIGOU01.
                    "ZMIGO_BADI_ITEM_GET_DATA
INCLUDE LZMIGOU02.
                    "ZMIGO_BADI_ITEM_SET_DATA
INCLUDE LZMIGOU03.
                    "ZMIGO_BADI_ITEM_UPDATE_DATA
INCLUDE LZMIGOU04.
                    "ZMIGO_BADI_ITEM_SET_GOACTION
INCLUDE LZMIGOU05.
                    "ZMIGO_BADI_ITEM_CREATE_ASSET
INCLUDE LZMIGOU06.
                    "ZCREATE_ASSET
复制代码

 

   3.针对BADI:MB_MIGO_BADI 创建新的实施 ZMB_MIGO_BADI

 

  类/接口ZCL_IM_MB_MIGO_BADI做如下操作:

  新增属性

  

   如下几个方法 写入代码:

  

   IF_EX_MB_MIGO_BADI~INIT

  method IF_EX_MB_MIGO_BADI~INIT.
    APPEND gf_class_id to ct_init.
  endmethod.

  IF_EX_MB_MIGO_BADI~PBO_DETAIL

复制代码
  method IF_EX_MB_MIGO_BADI~PBO_DETAIL.
    DATA:ls_zdmigo_item TYPE zdmigo_item.
*   This check is obligatory, otherwise the program flow is incorrect
*   (If there would be more than one implementation of BAdI MB_MIGO_BADI,
*    only one subscreen would be displayed).

    CHECK gf_class_id = i_class_id.
*   Show screen only if there is an item
    CHECK i_line_id IS NOT INITIAL.

*   External subscreen:
*   The content of global field G_NO_INPUT (set in method MODE_SET) will
*   influence the number of external subsreen:

    FIELD-SYMBOLS <fs_bwart_pbo> TYPE any.
    ASSIGN ('(SAPLMIGO)GODEFAULT_TV-BWART') TO <fs_bwart_pbo>.

    CHECK <fs_bwart_pbo> = '241'.

     e_cprog   = 'SAPLZMIGO'.
     e_dynnr   = '9001'.
     e_heading = '移动类型241专用增强页签'.
*      ENDIF.

*   Read data
    READ TABLE it_migo_item INTO ls_zdmigo_item WITH KEY global_counter = i_line_id.
    IF sy-subrc = 0.
*   Export data to function group (for display on subscreen)
      CALL FUNCTION 'ZMIGO_BADI_ITEM_SET_DATA'
        EXPORTING
          i_input = ls_zdmigo_item.
    ENDIF.
  endmethod.
复制代码

  IF_EX_MB_MIGO_BADI~PAI_DETAIL

复制代码
  method IF_EX_MB_MIGO_BADI~PAI_DETAIL.
*-----------------------------------------------------------------------
* Changing parameter E_FORCE_CHANGE can be set to 'X'. In this case
* method LINE_MODIFY is called.
* ATTENTION:
* DO NOT SET parameter E_FORCE_CHANGE = ' '. In this case you might
* overwrite parameter E_FORCE_CHANGE of another BAdI implementation.
*-----------------------------------------------------------------------
    DATA: ls_zdmigo_item TYPE zdmigo_item.
    DATA: ls_zdmigo_item_screen TYPE zdmigo_item,
          mblnr TYPE mblnr.
*   Only if a line exists
    CHECK i_line_id <> 0.

    FIELD-SYMBOLS <fs_bwart_pai> TYPE any.
    ASSIGN ('(SAPLMIGO)GODEFAULT_TV-BWART') TO <fs_bwart_pai>.

    CHECK <fs_bwart_pai> = '241'.

*   Get data from external screen
    CALL FUNCTION 'ZMIGO_BADI_ITEM_GET_DATA'
      IMPORTING
        e_output = ls_zdmigo_item_screen.
*   Compare new data with old data
    READ TABLE it_migo_item INTO ls_zdmigo_item WITH KEY global_counter = i_line_id.
    IF sy-subrc = 0.
      ls_zdmigo_item_screen-global_counter = i_line_id.
      IF ls_zdmigo_item <> ls_zdmigo_item_screen.
*     If there were any changes, it's obligatory to force MIGO to trigger
*     method LINE_MODIFY.
        e_force_change = 'X'.
      ENDIF.
    ENDIF.

  endmethod.
复制代码

  IF_EX_MB_MIGO_BADI~LINE_MODIFY

复制代码
  method IF_EX_MB_MIGO_BADI~LINE_MODIFY.
    DATA: ls_ztmigo_item TYPE ztmigo_item.
    DATA: ls_zdmigo_item TYPE zdmigo_item.
    DATA: ls_zdmigo_item_screen TYPE zdmigo_item.
    FIELD-SYMBOLS: <fs_migo_item> LIKE ls_zdmigo_item.
    DATA: l_del TYPE sy-tabix.

    FIELD-SYMBOLS <fs_bwart_mf> TYPE any.
    ASSIGN ('(SAPLMIGO)GODEFAULT_TV-BWART') TO <fs_bwart_mf>.

    CHECK <fs_bwart_mf> = '241'.

    CHECK i_line_id <> 0.
    READ TABLE it_migo_item WITH KEY global_counter = i_line_id
                            TRANSPORTING NO FIELDS.
    IF sy-subrc = 0.
*  *************取屏幕中现有数据
      CLEAR: ls_zdmigo_item_screen.
      CALL FUNCTION 'ZMIGO_BADI_ITEM_GET_DATA'
        IMPORTING
          e_output = ls_zdmigo_item_screen.
      IF ls_zdmigo_item_screen-global_counter = i_line_id.
*  *************BADI全局变量中已存在
        DELETE it_migo_item WHERE global_counter = i_line_id.
        MOVE-CORRESPONDING cs_goitem TO ls_zdmigo_item.
        ls_zdmigo_item-ktogr  = ls_zdmigo_item_screen-ktogr.
        ls_zdmigo_item-kostl  = ls_zdmigo_item_screen-kostl.
        ls_zdmigo_item-kostlv = ls_zdmigo_item_screen-kostlv.
*        ls_zdmigo_item-ndjar  = ls_zdmigo_item_screen-ndjar.
*        ls_zdmigo_item-ndper  = ls_zdmigo_item_screen-ndper.

         DATA:ls_migo_mi TYPE char8.
         CLEAR:ls_migo_mi.
         IMPORT p1 = ls_migo_mi FROM MEMORY ID 'MIGOMI'.     "从内存把数据拿出来

******* 进行资产卡片的创建
        IF cs_goitem-anln1 IS INITIAL AND cs_goitem-anln2 IS INITIAL AND cs_goitem-bwart = '241' AND ls_migo_mi = 'MIGO_MI'.
          IF ls_zdmigo_item_screen-ktogr <> space AND ls_zdmigo_item_screen-kostl <> space
            AND ls_zdmigo_item_screen-kostlv <> space.
            DATA:i_zdmigo_item_asset TYPE zdmigo_item_asset.
            DATA:e_bf_anln1 TYPE bf_anln1,
                 e_bf_anln2 TYPE bf_anln2,
                 e_bapi_msg TYPE bapi_msg.

            FREE MEMORY ID 'MIGOMI'.            "释放内存
            CLEAR:i_zdmigo_item_asset.
            CLEAR:e_bf_anln1, e_bf_anln2, e_bapi_msg.

            i_zdmigo_item_asset-anlkl = '00001702'.  "资产分类

            i_zdmigo_item_asset-bukrs  = cs_goitem-werks.    "工厂
            i_zdmigo_item_asset-txt50  = cs_goitem-matnr && cs_goitem-maktx."物料号+描述
            i_zdmigo_item_asset-ztxt50 = cs_goitem-matnr && cs_goitem-maktx."物料号+描述
            i_zdmigo_item_asset-meins  = cs_goitem-meins. "单位

            i_zdmigo_item_asset-anlue  = ls_zdmigo_item_screen-ktogr.
            i_zdmigo_item_asset-kostl  = ls_zdmigo_item_screen-kostl.
            i_zdmigo_item_asset-kostlv = ls_zdmigo_item_screen-kostlv.
*            i_zdmigo_item_asset-ndjar  = ls_zdmigo_item_screen-ndjar.
*            i_zdmigo_item_asset-ndper  = ls_zdmigo_item_screen-ndper.

            CALL FUNCTION 'ZMIGO_BADI_ITEM_CREATE_ASSET'
              EXPORTING
                i_input       = i_zdmigo_item_asset
              IMPORTING
                E_ANLN1       = e_bf_anln1
                E_ANLN2       = e_bf_anln2
                E_MSG         = e_bapi_msg.

            IF e_bf_anln1 IS NOT INITIAL.
              cs_goitem-anln1 = e_bf_anln1.
              cs_goitem-anln2 = e_bf_anln2.
              CONCATENATE e_bf_anln1 '-' e_bf_anln2 INTO ls_zdmigo_item-assets.
            ELSE.
              MESSAGE e_bapi_msg TYPE 'S' DISPLAY LIKE 'E'.
            ENDIF.
          ENDIF.
        ENDIF.

        APPEND ls_zdmigo_item TO it_migo_item.
      ENDIF.
    ELSE.
*  *************BADI全局变量中不存在
      IF NOT cs_goitem-mblnr IS INITIAL
        AND NOT cs_goitem-mjahr IS INITIAL
         AND NOT cs_goitem-zeile IS INITIAL.
*  *************从自定义表中取数
        CLEAR: ls_ztmigo_item.
        SELECT SINGLE *
          FROM ztmigo_item
          INTO CORRESPONDING FIELDS OF ls_ztmigo_item
         WHERE mblnr EQ cs_goitem-mblnr
           AND mjahr EQ cs_goitem-mjahr
           AND zeile EQ cs_goitem-zeile.
        IF sy-subrc = 0.
          MOVE-CORRESPONDING ls_ztmigo_item TO ls_zdmigo_item.
        ELSE.
          MOVE-CORRESPONDING cs_goitem TO ls_zdmigo_item.
        ENDIF.
      ELSE.
        MOVE-CORRESPONDING cs_goitem TO ls_zdmigo_item.
      ENDIF.
      ls_zdmigo_item-global_counter = i_line_id.
      APPEND ls_zdmigo_item TO it_migo_item.
    ENDIF.
  endmethod.
复制代码

 后面不异步,直接新建一个LUW创建资产卡片:

 

 

 

  IF_EX_MB_MIGO_BADI~LINE_DELETE

  method IF_EX_MB_MIGO_BADI~LINE_DELETE.
    DELETE it_migo_item WHERE global_counter = i_line_id.
  endmethod.

  IF_EX_MB_MIGO_BADI~RESET

  method IF_EX_MB_MIGO_BADI~RESET.
    CLEAR it_migo_item.
    CLEAR: g_no_input,
           g_cancel.
  endmethod.

  IF_EX_MB_MIGO_BADI~POST_DOCUMENT

复制代码
  method IF_EX_MB_MIGO_BADI~POST_DOCUMENT.
    DATA:ls_mseg TYPE mseg.
    DATA:ls_zdmigo_item TYPE zdmigo_item.

    LOOP AT it_migo_item INTO ls_zdmigo_item.

      ls_zdmigo_item-mandt = sy-mandt.
      ls_zdmigo_item-mblnr = is_mkpf-mblnr.
      ls_zdmigo_item-mjahr = is_mkpf-mjahr.
      MODIFY it_migo_item FROM ls_zdmigo_item TRANSPORTING mandt mblnr mjahr.
    ENDLOOP.

    READ TABLE it_mseg INTO ls_mseg INDEX 1.
*   只有移动类型为241的做记录
    IF ls_mseg-bwart = '241'.
      CALL FUNCTION 'ZMIGO_BADI_ITEM_UPDATE_DATA'
        TABLES
          t_ztmigo_item = it_migo_item.
    ENDIF.

  endmethod.
复制代码

  IF_EX_MB_MIGO_BADI~MODE_SET

复制代码
  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
*-----------------------------------------------------------------------

* In case of 'DISPLAY' the global field G_NO_INPUT will be set to 'X'.
* The result is that a different external subscreen will be choosen in
* method PBO_DETAIL.
*  IF i_action = 'A04' OR i_action = 'A03'.
*    g_no_input = 'X'.
*  ENDIF.
** In case of 'CANCEL' the global field G_CANCEL will be set to 'X'.
** The result is that in method POST_DOCUMENT a different handling is
** used
*  IF i_action = 'A03'.
*    g_cancel = 'X'.
*  ENDIF.
  CALL FUNCTION 'ZMIGO_BADI_ITEM_SET_GOACTION'
    EXPORTING
      i_goaction       = i_action
      i_refdoc         = i_refdoc.

  endmethod.
复制代码

 

最后效果图:

  

 

 

 

OK.......不知道有没有漏,将就用吧,不行在百度

 

 

 

posted on   seven1314pp  阅读(3549)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示