zoukankan      html  css  js  c++  java
  • 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.......不知道有没有漏,将就用吧,不行在百度

     

     

     

  • 相关阅读:
    2015抢票记事
    Provide your license server administrator with the following information.error code =-42,147
    微信支付现金红包接口
    SQL Server 触发器
    SQL增删查改注意的事项
    SQL while循环
    SQL SERVER 中is null 和 is not null 将会导致索引失效吗?
    HTML中head里的内容经浏览器解析后全到body里了
    sqLSERVER 计划缓存
    通用分页存储过程
  • 原文地址:https://www.cnblogs.com/seven1314pp/p/15490954.html
Copyright © 2011-2022 走看看