设为首页收藏本站

SAP Best Business Solution

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1735|回复: 0

replace BAPI_GOODSMVT_CREATE with ZMB_CREATE_GOODS_MOVEMENT

[复制链接]

20

主题

21

帖子

164

积分

注册会员

Rank: 2

积分
164
发表于 2016-8-15 14:50:43 | 显示全部楼层 |阅读模式
replace BAPI_GOODSMVT_CREATE withZMB_CREATE_GOODS_MOVEMENT
use the BAPI to post a goods receipt for apurchase order that is subject to acknowledgment.
  The goods receipt always updates the first order acknowledgment.
Background: At present, you cannot assign the sequence number for the purchaseorder confirmation (EKES-ETENS) to the BAPI at item level in the interface. Forthis reason, the system posts all goods receipts against the first orderacknowledgment. For customers using Release 600 or higher, the solution isprovided in Note 906314.

For the sap release lower 600, pleaseuse the below code to PO GR with confirmation:
STEP 1: Copy the function group LMDE toZLMDE
Step 2: Copy the function module L_IDOC_INPUT_WMMBXYTO ZMB_CREATE_GOODS_MOVEMENT
Codeas below
functionzmb_create_goods_movement.
*"----------------------------------------------------------------------
*"*"Globalinterface:
*"  IMPORTING
*"     VALUE(IN_MKPF) LIKE  IMKPF STRUCTURE  IMKPF
*"  EXPORTING
*"     VALUE(RETURN) LIKE  BAPIRET2 STRUCTURE  BAPIRET2
*"     VALUE(OUT_MKPF) LIKE  EMKPF STRUCTURE  EMKPF
*"  TABLES
*"      IN_MSEG STRUCTURE  IMSEG
*"  EXCEPTIONS
*"      OTHERS
*"----------------------------------------------------------------------
  clear i_imkpf.
  refresh i_imseg.
  refresh i_emseg.
  clear i_imseg.
  clear i_emseg.
  clear OUT_MKPF.
  clear return.
  i_imkpf = in_mkpf.
  i_imseg[] = in_mseg[].
  returncode = r_ok.
*  Do GR and posting
  perform wmmbid01_verarbeiten usingidoc_nummer.
  perform get_message changing return.
  if return-type = 'E'.
    rollback work.
  else.
    out_mkpf = i_emkpf.
    commit work.
  endif.
  refresh in_mseg.
  clear in_mseg.
  clear in_mkpf.
endfunction.
*&---------------------------------------------------------------------*
*&      Form get_message
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->RETURN     text
*----------------------------------------------------------------------*
form get_message changingreturn type bapiret2.
  data: l_mstring(200).
  select single * from t100 where sprsl = 'E'
                            and   arbgb = lmess-msgid
                            and   msgnr = lmess-msgno.
  if sy-subrc = 0.
    l_mstring = t100-text.
    if l_mstring cs '&1'.
      replace '&1' with lmess-msgv1 intol_mstring.
      replace '&2' with lmess-msgv2 intol_mstring.
      replace '&3' with lmess-msgv3 intol_mstring.
      replace '&4' with lmess-msgv4 intol_mstring.
    else.
      replace '&' with lmess-msgv1 intol_mstring.
      replace '&' with lmess-msgv2 intol_mstring.
      replace '&' with lmess-msgv3 intol_mstring.
      replace '&' with lmess-msgv4 intol_mstring.
    endif.
    condense l_mstring.
  else.
  endif.
  return-type = lmess-msgty.
  return-id = lmess-msgid.
  return-number = lmess-msgno.
  return-message = l_mstring.
  return-message_v1 = lmess-msgv1.
  return-message_v2 = lmess-msgv2.
  return-message_v3 = lmess-msgv3.
  return-message_v4 = lmess-msgv4.
endform.                    "GET_MESSAGE
*----------------------------------------------------------------------*
*        Unterroutinen:                                                *
*                                                                     *
*        FORM E1LTCOH_SEGMENT_UEBERNEHMEN                              *
*        FORM E1LTCOI_SEGMENT_UEBERNEHMEN                              *
*        FORM IKOPF_PRUEFEN_mstyp_mb                                   *
*        FORM WMTCID01_SEGMENT_UEBERNEHMEN                             *
*        FORM WMTCID01_VERARBEITEN                                     *
*                                                                      *
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
*        FORM E1MBXYH_SEGMENT_UEBERNEHMEN                              *
*----------------------------------------------------------------------*
*        Aus dem übergebenen IDOC-SegmentE1MBXYH (Kopf-Daten für die  *
*        Warenbewegung ) die Anwendungsdatenübernehmen.               *
*----------------------------------------------------------------------*
*        INPUT:     IKOPF               Header des IDOCs (Verwalt.Daten*
*                   ISEGM               Aktuelles IDOC-Segment         *
*----------------------------------------------------------------------*
forme1mbxyh_segment_uebernehmen.
  clear e1mbxyh.
*........Anwendungsdaten ausdem Segment übernehmen.....................
  move isegm-sdata to e1mbxyh.
*........Anwendungsdatenaufbereiten....................................
  move-corresponding e1mbxyh to i_imkpf.
* IS-PS: special logic becausethe length of domain XBLNR1 could be 35
  call function 'REF_DOC_NO_CONVERSION_INBOUND'
    exporting
      i_ref_doc_no      = e1mbxyh-xblnr
      i_ref_doc_no_long = e1mbxyh-xblnr_long
    importing
      e_ref_doc_no_long = i_imkpf-xblnr.
* IS-PS: special logic becausethe length of domain XBLNR1 could be 35
  call function 'REF_DOC_NO_CONVERSION_INBOUND'
    exporting
      i_ref_doc_no      = e1mbxyh-frbnr
      i_ref_doc_no_long = e1mbxyh-frbnr_long
    importing
      e_ref_doc_no_long = i_imkpf-frbnr.
endform.                   "E1MBXYH_SEGMENT_UEBERNEHMEN
*----------------------------------------------------------------------*
*        FORM E1MBXYI_SEGMENT_UEBERNEHMEN                              *
*----------------------------------------------------------------------*
*        Aus dem übergebenen IDOC-SegmentE1MBXYI Segment entnehmen:   *
*        Warenbewegungsposition                                        *
*----------------------------------------------------------------------*
*        INPUT:     IDOC_KOPF           Header des IDOCs (Verwalt.Daten*
*                   IDOC_SEGMENT        Aktuelles IDOC-Segment         *
*----------------------------------------------------------------------*
forme1mbxyi_segment_uebernehmen.
  data:  hlp_vfdat like imseg-vfdat.
* Clear old data from formersegment or data from user-exit.
  clear i_imseg.
*........Anwendungsdaten ausdem Segment übernehmen.....................
  move isegm-sdata to e1mbxyi.
*........Anwendungsdatenaufbereiten und in interner Tabelle sichern....
  move-corresponding e1mbxyi to i_imseg.
*........IS-PS: special logicbecause of lengthen Commitment-Item
  call function 'CMMT_ITEM_CONVERSION_INBOUND'
    exporting
      i_cmmt_item      = e1mbxyi-fipos
      i_cmmt_item_long = e1mbxyi-fipex
    importing
      e_cmmt_item      = i_imseg-fipos
    exceptions
      not_found        = 1
      others           = 2.
  if sy-subrc <> 0.
    perform lmess_fill using sy-msgid sy-msgnosy-msgv1  sy-msgv2
            sy-msgv3 sy-msgv4  c_wf_par_error_idocs
            c_wf_result_error.
    perform error_updates.
    returncode = r_no_ok.
  endif.
*........set initial valuesfor date fields
  clear hlp_vfdat.
  if e1mbxyi-vfdat is initial.
    move hlp_vfdat  to i_imseg-vfdat.
  endif.
  append i_imseg.
*........append segnum ofIDoc segment to i_number........
  move isegm-segnum to i_number-segnum.
  append i_number.
endform.                    "E1MBXYI_SEGMENT_UEBERNEHMEN
*----------------------------------------------------------------------*
*        FORM E1MBXYJ_SEGMENT_UEBERNEHMEN                              *
*----------------------------------------------------------------------*
*        Aus dem übergebenen IDOC-SegmentE1MBXYJ Segment entnehmen:   *
*        Warenbewegungsposition add-ons 4.0                            *
*----------------------------------------------------------------------*
forme1mbxyj_segment_uebernehmen.
  data:  hlp_mhdat like imseg-mhdat.
*........Anwendungsdaten ausdem Segment übernehmen.....................
  move isegm-sdata to e1mbxyj.
*........Read last entry ofi_imseg for modify.........................
  read table i_imseg from i_imseg.
  if sy-subrc = 0 or sy-subrc = 2.
*........Anwendungsdatenaufbereiten und in interner Tabelle sichern....
    move-corresponding e1mbxyj to i_imseg.
*........IS-PS: special logicbecause of lengthen Functional Area
    call function'FUNC_AREA_CONVERSION_INBOUND'
      exporting
        i_func_area      = e1mbxyj-fkber
        i_func_area_long =e1mbxyj-func_area_long
      importing
        e_func_area_long = i_imseg-fkber.
*........set initial values fordate fields ..
    if e1mbxyj-mhdat is initial.
      clear hlp_mhdat.
      move hlp_mhdat to i_imseg-mhdat.
    endif.
    modify i_imseg index sy-tabix.
  else.
    perform lmess_fill using 'LK' '059'sy-msgv1  sy-msgv2
            sy-msgv3 sy-msgv4  c_wf_par_error_idocs
            c_wf_result_error.
    perform error_updates.
    returncode = r_no_ok.
  endif.
endform.                   "E1MBXYJ_SEGMENT_UEBERNEHMEN
*----------------------------------------------------------------------*
*        FORM IKOPF_PRUEFEN                                            *
*----------------------------------------------------------------------*
*        Der CONTRL-Satz des IDOCs wirdgeprüft.                      *
*        Es wird geprüft, ob der Nachrichtentypvon dem Funktionsbau-  *
*        stein bearbeitet werden kann.                                 *
*----------------------------------------------------------------------*
*        INPUT:     IKOPF               Header des IDOCs (Verwalt.Daten*
*----------------------------------------------------------------------*
form ikopf_pruefen_mestyp_mb.
*........Nachrichtentypprüfen..........................................
  if ikopf-mestyp ne mestyp_mb.
    move r_no_ok to returncode.
    message e012 with ikopf-mestyp
            raising wrong_function_called.
  endif.
endform.                   "IKOPF_PRUEFEN_MESTYP_MB
*----------------------------------------------------------------------*
*        FORM WMMBID01_SEGMENT_UEBERNEHMEN                             *
*----------------------------------------------------------------------*
*        Aus dem übergebenen IDOC werden dieeinzelnen Segmente identi-*
*        fiziert und die Anwendungsdaten übernommen.                   *
*----------------------------------------------------------------------*
*        INPUT:     IKOPF               Header des IDOCs (Verwalt.Daten*
*                   ISEGM               Aktuelles IDOC-Segment         *
*----------------------------------------------------------------------*
formwmmbid01_segment_uebernehmen.
  case isegm-segnam.
*........E1MBXYH-Segment -Header segment.............................
    when seg_mb_header.
      perform e1mbxyh_segment_uebernehmen.
*........E1MBXYI-Segment - Itemsegment 3.0 ..........................
    when seg_mb_item.
      perform e1mbxyi_segment_uebernehmen.
*........E1MBXYJ-Segment -additional item segment 4.0 ................
    when seg_mb_itemj.
      perform e1mbxyj_segment_uebernehmen.
  endcase.
endform.                   "WMMBID01_SEGMENT_UEBERNEHMEN
*---------------------------------------------------------------------*
*       FORM WMMBID01_VERARBEITEN                                     *
*---------------------------------------------------------------------*
*       Einen IDOC WMMBID01 Verarbeiten                               *
*       Es wird pro IDOC der Funktionsbausteinangesteuert, welcher   *
*       die im IDOC übergebenen TA/TA-Positionenquittiert            *
*---------------------------------------------------------------------*
*       INPUT:  P_DOCNUM              IDOC-Nummer                   *
*                E1MBXYH                IDOC-Kopf                     *
*                T_E1MBXYI              Tabelle der IDOC-Positionen   *
*                                                                    *
*       OUTPUT:                                                      *
*                                                                     *
*---------------------------------------------------------------------*
form wmmbid01_verarbeiten usingvalue(p_docnum).
  data: p_xallp     type c,
         p_xallr     type c,
         p_xallb     type c,                                "572574
         p_tcode     like sy-tcode.
*........Initialisierungen undParameter vor User-Exit.................
  clear: flg_error, h_subrc.
  clear lmess.
  move:  con_x          to p_xallp,
          con_x          to p_xallb,                        "572574
          con_x          to p_xallr,
*         space          to p_xallr,
          e1mbxyh-tcode  to p_tcode.
  move   2         to i_imkpf-bfwms.
*........User-EXIT umUser-Daten zu übernehmen und Zusatzaktiv. anzust.
  set update task local.
  call function 'STATUS_BUFFER_REFRESH'
    exporting
      i_free = ' '.
*  call customer-function '002'
*       exporting
*            i_idoc_control =  ikopf
*            x_xallr        = p_xallp
*            x_xallp        = p_xallr
*            x_tcode        = p_tcode
*            x_imkpf        = i_imkpf
*       importing
*            x_xallr        = p_xallp
*            x_xallp        = p_xallr
*            x_tcode        = p_tcode
*            x_imkpf        = i_imkpf
*       tables
*            t_imseg        = i_imseg
*            t_idoc_data    = idoc_data.
*.........I_EMKPF und I_EMSEGwerden zurückgebracht, dh. sind nicht
*         veränderbar duch User-Exit..................................
  p_tcode = 'MB01'.
  call function 'MB_CREATE_GOODS_MOVEMENT'
    exporting
      imkpf         = i_imkpf
      xallp         = p_xallp
      xallb         = p_xallb                               "572574
      xallr         = p_xallr
      ctcod         = p_tcode
    importing
      emkpf         = i_emkpf
    tables
      emseg         = i_emseg
      imseg         = i_imseg
    exceptions
      error_message = 99.
*........Fehlerhandling...............................................
  h_subrc = sy-subrc.
  perform error_handling.
*........new USER-EXIT forfollowing activities.........................
*  call customer-function '006'
*       exporting
*            i_mestyp             = mestyp_mb
*            i_docnum             = idoc_nummer
*            i_subrc              = h_subrc
*            i_flg_error_rollback =flg_error_rollback
*            x_lmess              = lmess
*            x_returncode         = flg_error
*            x_categorie          = fehler_kategorie
*            x_result             = resultat
*            x_flg_error_rollback =flg_error_rollback
*            x_emkpf              = i_emkpf
*        importing
*            x_lmess              = lmess
*            x_returncode         = flg_error
*            x_categorie          = fehler_kategorie
*            x_result             = resultat
*            x_flg_error_rollback =flg_error_rollback
*
*        tables
*            x_imseg              = i_imseg
*            x_emseg              = i_emseg
*            x_idoc_data          = idoc_data.
*........USER-EXIT, um dieErrors kundespezifisch auswerten zu können...
*  call customer-function '001'
*       exporting
*            i_mestyp             = mestyp_mb
*            i_docnum             = idoc_nummer
*            i_subrc              = h_subrc
*            i_flg_error_rollback =flg_error_rollback
*            x_lmess              = lmess
*            x_returncode         = flg_error
*            x_categorie          = fehler_kategorie
*            x_result             = resultat
*            x_flg_error_rollback =flg_error_rollback
*       importing
*            x_lmess              = lmess
*            x_returncode         = flg_error
*            x_categorie          = fehler_kategorie
*            x_result             = resultat
*            x_flg_error_rollback =flg_error_rollback.
*  perform error_updates.
*........Items generated (notyet updated), status ok -> proceed......
  if i_emkpf-subrc = 1 and
     ( flg_error is initial andflg_error_rollback is initial ).
    call function 'MB_POST_GOODS_MOVEMENT'
      exporting
        xblnr_sd = i_imkpf-xblnr
      importing
        emkpf   = i_emkpf.
*........Fehlerhandling...............................................
    h_subrc = sy-subrc.
*........everything is fine,set the subrc to 1 for error_handling ....
    if i_emkpf-subrc = 0.
      i_emkpf-subrc = 1.
    endif.
    perform error_handling.
  endif.
endform.                    "WMMBID01_VERARBEITEN
*---------------------------------------------------------------------*
*        FORM ERROR_UPDATES                                           *
*---------------------------------------------------------------------*
*        Update internal tables that arereturned to ALE              *
*---------------------------------------------------------------------*
form error_updates.
  if not flg_error_rollback is initial.
    flg_error = 1.
    move c_wf_par_error_idocs tofehler_kategorie.
  endif.
*.........Fortschreiben derIDOC-Status Tabellen......................
  if flg_error = 1.
    call function 'L_IDOC_ERROR_SAVE'
      exporting
        i_docnum    = idoc_nummer
        i_mestyp    = mestyp_mb
        i_lmess     = lmess
        i_categorie = fehler_kategorie
        i_result    = resultat
        i_segnum    = sav_segnum.
  else.
    call function 'L_IDOC_OK_SAVE'
      exporting
        i_docnum = idoc_nummer
        i_mestyp = mestyp_mb.
*........MerkenMaterialbelegnummer ..................................*
*   clear i_emseg.
*   read table i_emseg index 1.
    if sy-subrc eq 0 and  not i_emkpf-mblnr is initial.
      move:
        i_emkpf-mblnr to  hlp_fld_im(10),
        i_emkpf-mjahr to  hlp_fld_im+10(4).
      call function'L_IDOC_CREATED_OBJECTS_SAVE'
        exporting
          i_docnum         = idoc_nummer
          i_mestyp         = mestyp_mb
          i_created_object = hlp_fld_im.
    endif.
  endif.
  clear sav_segnum.
endform.                    "ERROR_UPDATES
*---------------------------------------------------------------------*
*        FORM ERROR_HANDLING                                          *
*---------------------------------------------------------------------*
*        1. call after MB_CREATE_... 2. callafter MB_POST_....       *
*---------------------------------------------------------------------*
form error_handling.
*.......Error in MB_POST,normal subrc ................................
  if h_subrc <> 0.
    perform lmess_fill using sy-msgid  sy-msgno sy-msgv1  sy-msgv2
            sy-msgv3 sy-msgv4  c_wf_par_error_idocs
            c_wf_result_error.
  endif.
*.......Error and entry inEMSEG for subrc: 4,5,6,7 ...............*
  loop at i_emseg.
    if not i_emseg-msgid is initial.
      if i_emkpf-subrc <> 1 andlmess-msgno is initial.
        perform lmess_fill using  i_emseg-msgid i_emseg-msgno
                i_emseg-msgv1 i_emseg-msgv2i_emseg-msgv3 i_emseg-msgv4
                c_wf_par_error_idocs c_wf_result_error.
* ......I_EMSEG-TABIX  refres to the original I_IMSEG item that
*       proved to have anerror........................................
        read table i_number indexi_emseg-tabix.
        if sy-subrc = 0.
          move i_number-segnum to sav_segnum.
        endif.
        exit.
      endif.
    endif.
  endloop.
*........Error and entry inEMKPF ?...................................*
  if i_emkpf-subrc <> 1 and lmess-msgnois initial.
    perform lmess_fill using  i_emkpf-msgid i_emkpf-msgno
            i_emkpf-msgv1 i_emkpf-msgv2i_emkpf-msgv3 i_emkpf-msgv4
            c_wf_par_error_idocsc_wf_result_error.
*........no entry in EMKPFneither => set your own error..............*
    if i_emkpf-subrc <> 1 and lmess-msgnois initial.
      perform lmess_fill using 'LK'  '047' sy-msgv1 sy-msgv2
              sy-msgv3 sy-msgv4  c_wf_par_error_idocs
              c_wf_result_error.
    endif.
  endif.
endform.                    "ERROR_HANDLING
*---------------------------------------------------------------------*
*        FORM LMESS_FILL                                              *
*---------------------------------------------------------------------*
form lmess_fill using  p_id p_no p_t1 p_t2 p_t3 p_t4 p_cat p_res.
  move:
    'E'  to lmess-msgty,
    p_id to lmess-msgid,
    p_no to lmess-msgno,
    p_t1 to lmess-msgv1,
    p_t2 to lmess-msgv2,
    p_t3 to lmess-msgv3,
    p_t4  to lmess-msgv4,
    p_cat to fehler_kategorie,
    p_res to resultat.
  flg_error = 1.
endform.                    "LMESS_FILL

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



QQ|Archiver|手机版|小黑屋|www.sapbbs.com    

GMT+8, 2019-4-23 14:55 , Processed in 1.079032 second(s), 28 queries .

声明:本站严禁任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论!

本站内容由网友原创或转载,如果侵犯了您的合法权益,请及时联系处理!© admin@sapbbs.com

快速回复 返回顶部 返回列表