1. 程式人生 > >SAP ABAP收貨或者貨物移動(MIGO,MB11,MB1A)在儲存時候的增強點

SAP ABAP收貨或者貨物移動(MIGO,MB11,MB1A)在儲存時候的增強點

增強的BADI是:MB_DOCUMENT_BADI,特別要注意的是假如你是想在點選儲存按鈕的時候根據生成的憑證號,把某些資料更新到你的自建表的話,要用第二個方法MB_DOCUMENT_UPDATE,除錯可以在第一個方法MB_DOCUMENT_BEFORE_UPDATE裡面除錯,特別注意不能在方法MB_DOCUMENT_BEFORE_UPDATE裡面寫COMMIT WORK,因為兩個方法的引數完全一樣,所以可以在第一個方法那邊除錯,然後直接把所有的程式碼拷貝到第二個,要注意第二個方法打斷點是無法進去的,但是他確實有執行,所以說只能在第一個方法那邊除錯,下面賦一段寫的程式碼吧:

 method if_ex_mb_document_badi~mb_document_update.
  data

: gs_mseg type  mseg.
  data: gt_gdfh type table of ztmm_gdfh.
  data: gs_gdfh type ztmm_gdfh.

  data: gt_gdth type table of ztmm_gdth.
  data: gs_gdth type ztmm_gdth.
  data: gt_lxjj type table of ztmm_lxjjgl.
  data: gs_lxjj type ztmm_lxjjgl.
  data: gs_mkpf type mkpf.
  if sy-tcode eq ‘MIGO’ or sy-tcode  eq

 ‘MB11′.
    read table xmkpf into gs_mkpf index 1.

    loop at xmseg into gs_mseg.

      if   gs_mseg-bwart eq ‘201′ and gs_mseg-sobkz eq  .
        select single zgngo into gs_lxjj-zlxjjbm from marc where matnr eq gs_mseg-matnr and werks eq gs_mseg-werks.
        if sy-subrc eq 0.
          gs_lxjj-mblnr = gs_mseg-mblnr.
          gs_lxjj-matnr = gs_mseg-matnr.
          gs_lxjj-werks = gs_mseg-werks.
          gs_lxjj-bldat = gs_mkpf-bldat.
          append

 gs_lxjj to gt_lxjj.
        endif.
      endif.

      if gs_mseg-werks eq ‘SD00′ and ( ( gs_mseg-bwart eq ‘201′ and gs_mseg-sobkz eq  )  or  ( gs_mseg-bwart eq ‘201′ and gs_mseg-sobkz eq ‘K’ )
      or ( gs_mseg-bwart eq ‘221′ and gs_mseg-sobkz eq ‘Q’ ) or ( gs_mseg-bwart eq ‘251′ and gs_mseg-sobkz eq  )
     or ( gs_mseg-bwart eq ‘251′ and gs_mseg-sobkz eq ‘K’ ) or ( gs_mseg-bwart eq ‘221′ and gs_mseg-sobkz eq ‘K’ ) ).
*      BREAK ZZWANGLP.

        gs_gdfh-mblnr = gs_mseg-mblnr.
        gs_gdfh-mjahr = gs_mseg-mjahr.
        gs_gdfh-bldat = gs_mkpf-bldat.
        gs_gdfh-budat = gs_mkpf-budat.
        gs_gdfh-cpudt = gs_mkpf-cpudt.
        gs_gdfh-cputm = gs_mkpf-cputm.
        gs_gdfh-mblpo = gs_mseg-zeile.
        gs_gdfh-matnr = gs_mseg-matnr.
        gs_gdfh-menge = gs_mseg-menge.
        gs_gdfh-charg = gs_mseg-charg.
        gs_gdfh-lgort = gs_mseg-lgort.
        gs_gdfh-lgpla = gs_mseg-lgpla.
        gs_gdfh-dmbtr = gs_mseg-dmbtr.
        gs_gdfh-pspel   = gs_mseg-ps_psp_pnr.
        gs_gdfh-zdj   = gs_gdfh-dmbtr / gs_gdfh-menge.“單價=(本位幣金額/發放數量)
**序列號:通過MBLNR&MJAHR& MBLPO在表SER03中找到OBKNR,再通過OBKNR在表OBJK找到SERNR作為序列號更新到表ZTMM_GDFH
*        SELECT SINGLE SERNR INTO GS_GDFH-SERNR FROM OBJK
*          JOIN SER03 ON SER03~OBKNR = OBJK~OBKNR
*        WHERE MBLNR EQ GS_MSEG-MBLNR AND MJAHR EQ GS_MSEG-MJAHR AND ZEILE EQ GS_MSEG-ZEILE.

*      供應商:通過CHARG在表MCHA找到LIFNR
        select single lifnr into gs_gdfh-lifnr from mcha where charg eq gs_gdfh-charg and matnr eq gs_gdfh-matnr and werks eq ‘SD00′.
*      合同號:通過CHARG在表EKBE中找到EBELN,再通過EBELN在表EKKO找到SUBMI。
        select single submi into gs_gdfh-submi from ekko
          join ekbe on ekbe~ebeln = ekko~ebeln
        where charg eq gs_gdfh-charg and matnr eq gs_gdfh-matnr and werks eq ‘SD00′.

*       採購訂單及行號:通過CHARG在表EKBE中找到EBELN,再通過EBELN在表EKPO找到EKPO-EBELP。
        select single ekbe~ebeln ebelp into (gs_gdfh-ebeln,gs_gdfh-ebelp)
          from ekko
          join ekbe on ekbe~ebeln = ekko~ebeln
          where charg eq gs_gdfh-charg and matnr eq gs_gdfh-matnr and werks eq ‘SD00′.“EBELP EQ GS_MSEG-ZEILE.

*    依據預留編號及預留專案編號作為關鍵欄位,在表ZTMM_GDXX找到工單、作業工種(工序)、工單行號欄位
        select single zgd zgx zhxmbh into (gs_gdfh-zgd,gs_gdfh-zgx,gs_gdfh-zgdhh) from ztmm_gdxx where rsnum eq gs_mseg-rsnum and rspos eq gs_mseg-rspos.
        if sy-subrc ne 0.
          clear gs_gdfh.
        else.
          gs_gdfh-zyfh = ‘X’.
          append gs_gdfh to gt_gdfh.
        endif.

      endif.

      if gs_mseg-werks eq ‘SD00′ and ( ( gs_mseg-bwart eq ‘202′ and gs_mseg-sobkz eq  ) or ( gs_mseg-bwart eq ‘202′ and gs_mseg-sobkz eq ‘K’ )  or  ( gs_mseg-bwart eq ‘222′ and gs_mseg-sobkz eq ‘Q’ )
          or ( gs_mseg-bwart eq ‘252′ and gs_mseg-sobkz eq  ) or ( gs_mseg-bwart eq ‘222′ and gs_mseg-sobkz eq ‘K’ )
         or ( gs_mseg-bwart eq ‘252′ and gs_mseg-sobkz eq ‘K’ ) ).“OR ( GS_MSEG-BWART EQ ’242′ AND GS_MSEG-SOBKZ EQ ” )dete by libin 20120516 bc songwenbin
*      BREAK ZZWANGLP.

        gs_gdth-mblnr = gs_mseg-mblnr.
        gs_gdth-mjahr = gs_mseg-mjahr.
        gs_gdth-bldat = gs_mkpf-bldat.
        gs_gdth-budat = gs_mkpf-budat.
        gs_gdth-cpudt = gs_mkpf-cpudt.
        gs_gdth-cputm = gs_mkpf-cputm.
        gs_gdth-mblpo = gs_mseg-zeile.
        gs_gdth-matnr = gs_mseg-matnr.
        gs_gdth-menge = gs_mseg-menge.
        gs_gdth-charg = gs_mseg-charg.
        gs_gdth-lgort = gs_mseg-lgort.
        gs_gdth-lgpla = gs_mseg-lgpla.
        gs_gdth-dmbtr = gs_mseg-dmbtr.
        gs_gdth-pspel   = gs_mseg-ps_psp_pnr.
        gs_gdth-zdj   = gs_gdth-dmbtr / gs_gdth-menge.“單價=(本位幣金額/發放數量)
**序列號:通過MBLNR&MJAHR& MBLPO在表SER03中找到OBKNR,再通過OBKNR在表OBJK找到SERNR作為序列號更新到表ZTMM_GDFH
*        SELECT SINGLE SERNR INTO GS_GDFH-SERNR FROM OBJK
*          JOIN SER03 ON SER03~OBKNR = OBJK~OBKNR
*        WHERE MBLNR EQ GS_MSEG-MBLNR AND MJAHR EQ GS_MSEG-MJAHR AND ZEILE EQ GS_MSEG-ZEILE.

*    依據預留編號及預留專案編號作為關鍵欄位,在表ZTMM_GDXX找到工單、作業工種(工序)、工單行號欄位
        select single zgd zgx zhxmbh into (gs_gdth-zgd,gs_gdth-zgx,gs_gdth-zgdhh) from ztmm_gdxx where rsnum eq gs_mseg-rsnum and rspos eq gs_mseg-rspos.
        if sy-subrc ne 0.
          clear gs_gdfh.
        else.
          gs_gdth-zyfh = ‘X’.
          append gs_gdth to gt_gdth.
        endif.
      endif.
    endloop.
    if gt_gdfh is not initial.
      modify ztmm_gdfh from table gt_gdfh.
    endif.
    if gt_gdth is not initial.
      modify ztmm_gdth from table gt_gdth.
    endif.
    if gt_lxjj is not initial.
      modify ztmm_lxjjgl from table gt_lxjj.
    endif.

  endif.
endmethod.