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.......不知道有没有漏,将就用吧,不行在百度

     

     

     

  • 相关阅读:
    Oracle Core 学习笔记二 Transactions 和 Consistency 说明
    Oracle AUTO_SPACE_ADVISOR_JOB 说明
    Windows 下 ftp 上传文件 脚本
    Oracle 11g 中 Direct path reads 特性 说明
    Linux 使用 wget 下载 Oracle 软件说明
    Oracle 10g read by other session 等待 说明
    Oracle 11g RAC INS06006 Passwordless SSH connectivity not set up between the following node(s) 解决方法
    SecureCRT 工具 上传下载数据 与 ASCII、Xmodem、Ymodem 、Zmodem 说明
    Oracle RAC root.sh 报错 Timed out waiting for the CRS stack to start 解决方法
    Oracle RESETLOGS 和 NORESETLOGS 区别说明
  • 原文地址:https://www.cnblogs.com/seven1314pp/p/15490954.html
Copyright © 2011-2022 走看看