/SCWM/EX_CORE_GM_UPDATE HU收货时触发

/SCWM/EX_DLV_GM 交货单全部收货时触发(发货也进来)

LE_SHP_GOODSMOVEMENT 在内向交货单收货时触发,ewm通过qrfc触发,vl32n过账时触发(可以做在这里,前面两个位置就不用做了,注意此处还

没有检查,执行完这里可能还会报错)

/SCWM/EX_CORE_GM_UPDATE

method /scwm/if_ex_core_gm_update~update.

  call function 'Z_EWM_E007_OBJCL_UPDATE'

    starting new task 'Z_EWM_E007_OBJCL_UPDATE'

    tables

      it_ordim_c = it_ordim_c.

endmethod.

/SCWM/EX_DLV_GM

method /scwm/if_ex_dlv_gm_process~check_document.

*DATA IT_ORDIM_C TYPE /SCWM/TT_ORDIM_C.

    data:

      ls_docid type /scwm/dlv_docid_item_str,

      it_docid type standard table of /scwm/dlv_docid_item_str.

    loop at it_dlv_item into data(ls_item).

      ls_docid-doccat = ls_item-doccat.

      ls_docid-docid = ls_item-docid.

      ls_docid-itemid = ls_item-itemid.

      append ls_docid to it_docid.

    endloop.

    call function 'Z_EWM_E007_OBJCL_UPDATE'

      starting new task 'Z_EWM_E007_OBJCL_UPDATE'

      tables

*       IT_ORDIM_C       = IT_ORDIM_C

        it_docid = it_docid.

  endmethod.

LE_SHP_GOODSMOVEMENT

  method if_ex_le_shp_goodsmovement~change_input_header_and_items.

    data       ls_docid type /scwm/dlv_docid_item_str.

    data it_docid   type standard table of /scwm/dlv_docid_item_str.

*取it_docid

*  read document

    select docid,

           doccat

      from /scdl/db_refdoc

     where refdoccat eq 'ERO'

       and doccat    eq 'PDI'

       and itemid    eq '00000000000000000000000000000000'

       and refdocno  eq @is_likp-vbeln

      union

      select docid,

             doccat

        from /scdl/db_refdoc

     where refdoccat eq 'ASN'

       and doccat    eq 'PDI'

       and refdocno  eq @is_likp-vbeln

      into table @data(lt_refdoc).

    if sy-subrc eq 0.

*    Read inbound delivery status

      data(lo_query) = new /scwm/cl_dlv_management_prd( ).

      try.

          call method lo_query->query

            exporting

              it_docid   = value /scwm/dlv_docid_item_tab( ( docid  = lt_refdoc[ 1 ]-docid

                                                             doccat = lt_refdoc[ 1 ]-doccat ) )

              " Order Document Identification with ID and Category

            importing

              et_headers = data(lt_header)                 " Delivery Header (PRD) for Read Operations

              et_items   = data(lt_items).                 " Delivery Item (PRD) for Read Operations

        catch /scdl/cx_delivery. " Exception Class of Delivery

      endtry.

      loop at lt_items into data(ls_item).

        ls_docid-doccat = ls_item-doccat.

        ls_docid-docid = ls_item-docid.

        ls_docid-itemid = ls_item-itemid.

        append ls_docid to it_docid.

      endloop.

      call function 'Z_EWM_E007_OBJCL_UPDATE'

*    starting new task 'Z_EWM_E007_OBJCL_UPDATE'

        tables

*          it_ordim_c = it_ordim_c

          it_docid   = it_docid.

    endif.

  endmethod.

Z_EWM_E007_OBJCL_UPDATE

function z_ewm_e007_objcl_update.

*"----------------------------------------------------------------------

*"*"本地接口:

*"  TABLES

*"      IT_ORDIM_C TYPE  /SCWM/TT_ORDIM_C OPTIONAL

*"      IT_DOCID STRUCTURE  /SCWM/DLV_DOCID_ITEM_STR OPTIONAL

*"----------------------------------------------------------------------

*取交货单数据

  types:

    begin of ty_hu_dlv_cache,

      include type /scwm/hu_dlv,

      docid   type /scwm/de_docid,

      itmid   type /scwm/de_itmid,

    end of ty_hu_dlv_cache.

  data: ls_hu_dlv         type /scwm/hu_dlv,

        lt_hu_dlv         type /scwm/tt_hu_dlv,

        lt_hu_dlv_exist   type /scwm/tt_hu_dlv,

        ls_hu_dlv_cache   type  ty_hu_dlv_cache,

        lt_hu_dlv_cache   type table of ty_hu_dlv_cache,

        lt_docid_package  type /scwm/dlv_docid_item_tab,

        ls_docid_package  type /scwm/dlv_docid_item_str,

        ls_read_options   type /scwm/dlv_query_contr_str,

        ls_include_data   type /scwm/dlv_query_incl_str_prd,

        lt_headers        type /scwm/dlv_header_out_prd_tab,

        lt_items          type /scwm/dlv_item_out_prd_tab,

        lo_dlv_management type ref to /scwm/cl_dlv_management_prd,

        lo_hu_dlv         type ref to /scwm/cl_hu_dlv,

        lv_counter        type int4,

        ls_selopt         type rsdsselopt,

        lt_huident_so     type rseloption.

  field-symbols: <ls_ordim_c>      type /scwm/ordim_c,

                 <ls_refdoc>       type /scdl/dl_refdoc_str,

                 <ls_header>       type /scwm/dlv_header_out_prd_str,

                 <ls_hu_dlv>       type /scwm/hu_dlv,

                 <ls_hu_dlv_cache> type ty_hu_dlv_cache.

  clear: lt_hu_dlv, ls_hu_dlv, lt_docid_package.

  lv_counter = 0.

  read table it_ordim_c assigning <ls_ordim_c> index 1.

  if sy-subrc = 0.

    create object lo_hu_dlv exporting iv_lgnum = <ls_ordim_c>-lgnum.

  endif.

  loop at it_ordim_c assigning <ls_ordim_c>.

    if <ls_ordim_c>-trart = wmegc_trart_gr and <ls_ordim_c>-flghuto = 'X'. " 1 entry

      ls_hu_dlv_cache-include-lgnum = <ls_ordim_c>-lgnum.

      ls_hu_dlv_cache-include-confirmed_at =  <ls_ordim_c>-confirmed_at.

      if <ls_ordim_c>-nlenr is not initial.

        ls_hu_dlv_cache-include-huident = <ls_ordim_c>-nlenr.

        if <ls_ordim_c>-rdocid is not initial.

          ls_docid_package-doccat = <ls_ordim_c>-rdoccat.

          ls_docid_package-docid = <ls_ordim_c>-rdocid.

          ls_docid_package-itemid = <ls_ordim_c>-ritmid.

          append ls_docid_package to lt_docid_package.

          ls_hu_dlv_cache-docid = <ls_ordim_c>-rdocid.

          ls_hu_dlv_cache-itmid = <ls_ordim_c>-ritmid.

          append ls_hu_dlv_cache to lt_hu_dlv_cache.

        endif.

        if <ls_ordim_c>-qdocid is not initial.

          ls_docid_package-doccat = <ls_ordim_c>-qdoccat.

          ls_docid_package-docid = <ls_ordim_c>-qdocid.

          ls_docid_package-itemid = <ls_ordim_c>-qitmid.

          append ls_docid_package to lt_docid_package.

          ls_hu_dlv_cache-docid = <ls_ordim_c>-qdocid.

          ls_hu_dlv_cache-itmid = <ls_ordim_c>-qitmid.

          append ls_hu_dlv_cache to lt_hu_dlv_cache.

        endif.

      endif.

      if <ls_ordim_c>-vlenr is not initial.

        ls_hu_dlv-huident = <ls_ordim_c>-vlenr.

        if <ls_ordim_c>-rdocid is not initial.

          ls_docid_package-doccat = <ls_ordim_c>-rdoccat.

          ls_docid_package-docid = <ls_ordim_c>-rdocid.

          ls_docid_package-itemid = <ls_ordim_c>-ritmid.

          append ls_docid_package to lt_docid_package.

          ls_hu_dlv_cache-docid = <ls_ordim_c>-rdocid.

          ls_hu_dlv_cache-itmid = <ls_ordim_c>-ritmid.

          append ls_hu_dlv_cache to lt_hu_dlv_cache.

        endif.

        if <ls_ordim_c>-qdocid is not initial.

          ls_docid_package-doccat = <ls_ordim_c>-qdoccat.

          ls_docid_package-docid = <ls_ordim_c>-qdocid.

          ls_docid_package-itemid = <ls_ordim_c>-qitmid.

          append ls_docid_package to lt_docid_package.

          ls_hu_dlv_cache-docid = <ls_ordim_c>-qdocid.

          ls_hu_dlv_cache-itmid = <ls_ordim_c>-qitmid.

          append ls_hu_dlv_cache to lt_hu_dlv_cache.

        endif.

      endif.

      "Set flag for GI reverse

      clear: ls_selopt, lt_huident_so, lt_hu_dlv_exist.

      ls_selopt-sign = wmegc_sign_inclusive.

      ls_selopt-option = wmegc_option_eq.

      ls_selopt-low = <ls_ordim_c>-nlenr.

      append ls_selopt to lt_huident_so.

      call method lo_hu_dlv->query

        exporting

          ir_huident = lt_huident_so

        importing

          et_data    = lt_hu_dlv_exist.

      loop at lt_hu_dlv_exist assigning <ls_hu_dlv>.

        if <ls_hu_dlv>-doccat = /scdl/if_dl_doc_c=>sc_doccat_out_prd.

          <ls_hu_dlv>-reversed = 'X'.

          <ls_hu_dlv>-confirmed_at =  <ls_ordim_c>-confirmed_at.

          append <ls_hu_dlv> to lt_hu_dlv.

        endif.

      endloop.

    elseif <ls_ordim_c>-trart = wmegc_trart_gi and <ls_ordim_c>-flghuto = 'X'. "1 entry

      ls_hu_dlv_cache-include-lgnum = <ls_ordim_c>-lgnum.

      ls_hu_dlv_cache-include-confirmed_at =  <ls_ordim_c>-confirmed_at.

      if <ls_ordim_c>-vlenr is not initial.

        ls_hu_dlv_cache-include-huident = <ls_ordim_c>-vlenr.

        if <ls_ordim_c>-rdocid is not initial.

          ls_docid_package-doccat = <ls_ordim_c>-rdoccat.

          ls_docid_package-docid = <ls_ordim_c>-rdocid.

          ls_docid_package-itemid = <ls_ordim_c>-ritmid.

          append ls_docid_package to lt_docid_package.

          ls_hu_dlv_cache-docid = <ls_ordim_c>-rdocid.

          ls_hu_dlv_cache-itmid = <ls_ordim_c>-ritmid.

          append ls_hu_dlv_cache to lt_hu_dlv_cache.

        endif.

        if <ls_ordim_c>-qdocid is not initial.

          ls_docid_package-doccat = <ls_ordim_c>-qdoccat.

          ls_docid_package-docid = <ls_ordim_c>-qdocid.

          ls_docid_package-itemid = <ls_ordim_c>-qitmid.

          append ls_docid_package to lt_docid_package.

          ls_hu_dlv_cache-docid = <ls_ordim_c>-qdocid.

          ls_hu_dlv_cache-itmid = <ls_ordim_c>-qitmid.

          append ls_hu_dlv_cache to lt_hu_dlv_cache.

        endif.

      endif.

      if <ls_ordim_c>-nlenr is not initial.

        ls_hu_dlv-huident = <ls_ordim_c>-nlenr.

        if <ls_ordim_c>-rdocid is not initial.

          ls_docid_package-doccat = <ls_ordim_c>-rdoccat.

          ls_docid_package-docid = <ls_ordim_c>-rdocid.

          ls_docid_package-itemid = <ls_ordim_c>-ritmid.

          append ls_docid_package to lt_docid_package.

          ls_hu_dlv_cache-docid = <ls_ordim_c>-rdocid.

          ls_hu_dlv_cache-itmid = <ls_ordim_c>-ritmid.

          append ls_hu_dlv_cache to lt_hu_dlv_cache.

        endif.

        if <ls_ordim_c>-qdocid is not initial.

          ls_docid_package-doccat = <ls_ordim_c>-qdoccat.

          ls_docid_package-docid = <ls_ordim_c>-qdocid.

          ls_docid_package-itemid = <ls_ordim_c>-qitmid.

          append ls_docid_package to lt_docid_package.

          ls_hu_dlv_cache-docid = <ls_ordim_c>-qdocid.

          ls_hu_dlv_cache-itmid = <ls_ordim_c>-qitmid.

          append ls_hu_dlv_cache to lt_hu_dlv_cache.

        endif.

      endif.

      " Set reverse flag for GR reverse

      clear: ls_selopt, lt_huident_so, lt_hu_dlv_exist.

      ls_selopt-sign = wmegc_sign_inclusive.

      ls_selopt-option = wmegc_option_eq.

      ls_selopt-low = <ls_ordim_c>-vlenr.

      append ls_selopt to lt_huident_so.

      call method lo_hu_dlv->query

        exporting

          ir_huident = lt_huident_so

        importing

          et_data    = lt_hu_dlv_exist.

      loop at lt_hu_dlv_exist assigning <ls_hu_dlv>.

        if <ls_hu_dlv>-doccat = /scdl/if_dl_doc_c=>sc_doccat_out_prd. "'PDO'.

          <ls_hu_dlv>-phystat = 'C'.

          <ls_hu_dlv>-confirmed_at =  <ls_ordim_c>-confirmed_at.

        elseif <ls_hu_dlv>-doccat = /scdl/if_dl_doc_c=>sc_doccat_inb_prd. "'PDI'.

          <ls_hu_dlv>-reversed = 'X'.

          <ls_hu_dlv>-confirmed_at =  <ls_ordim_c>-confirmed_at.

        endif.

        append <ls_hu_dlv> to lt_hu_dlv.

      endloop.

    else. "for other warehouse tasks, only record the HU, no linkage

      clear ls_hu_dlv_cache.

      ls_hu_dlv_cache-include-lgnum = <ls_ordim_c>-lgnum.

      if <ls_ordim_c>-vlenr is not initial.

        ls_hu_dlv_cache-include-huident = <ls_ordim_c>-vlenr.

        append ls_hu_dlv_cache to lt_hu_dlv_cache.

      endif.

      if <ls_ordim_c>-nlenr is not initial.

        ls_hu_dlv-huident = <ls_ordim_c>-nlenr.

        append ls_hu_dlv_cache to lt_hu_dlv_cache.

      endif.

    endif.

  endloop.

*从全部收货的badi进来

  append lines of it_docid to lt_docid_package.

*---------Read delivery---------*

  if lt_docid_package is not initial.

    if lo_dlv_management is not bound.

      create object lo_dlv_management.

    endif.

    ls_read_options-data_retrival_only       = abap_true.

    ls_read_options-docflow_succ_1level_only = abap_true.

    ls_include_data-head_refdoc = abap_true.

    ls_include_data-item_refdoc = abap_true. "po在 item refdoc

    sort lt_docid_package.

    delete adjacent duplicates from lt_docid_package.

    try.

        lo_dlv_management->query(

          exporting

            it_docid        = lt_docid_package

            is_read_options = ls_read_options

            is_include_data = ls_include_data

          importing

            et_headers            = lt_headers

            et_items                    = lt_items

            ).

      catch /scdl/cx_delivery.

    endtry.

  endif.

*开始

  data:

    lv_ebeln     like ekpo-ebeln,

    lv_ebelp     like ekpo-ebelp,

    lv_out_str   type char255,

    lv_charg(10).

  data:

    ls_header   like bapi2017_gm_head_01,

    ls_headret  like bapi2017_gm_head_ret,

    ls_document type bapi2017_gm_head_ret-mat_doc,

    ls_docyear  type bapi2017_gm_head_ret-doc_year,

    lt_item     like bapi2017_gm_item_create occurs 0 with header line,

    lt_return   like bapiret2 occurs 0 with header line.

  data:

    lt_objectkeytable type standard table of bapi1003_object_keys with header line,

    lv_clobjectkeyout type bapi1003_key-object_guid.

  data:

    lv_objectkey       type bapi1003_key-object,

    lv_object_long     type bapi1003_key-object_long,

    lv_objecttable     type bapi1003_key-objecttable,

    lv_classtype       type bapi1003_key-classtype,

    lv_classnum        type bapi1003_key-classnum,

    lv_status          type            bapi1003_key-status,

    lt_allocvaluesnum  type standard table of bapi1003_alloc_values_num,

    lt_allocvalueschar type standard table of bapi1003_alloc_values_char with header line,

    lt_allocvaluescurr type standard table of bapi1003_alloc_values_curr.

  data:

    lv_werks like marc-werks,

    lv_matnr like marc-matnr.

  select single low

    into @data(lv_low)

    from tvarvc

    where name = 'DOCTYPE'.

  read table lt_headers into data(ls_headers) index 1.

  check ls_headers-doctype = lv_low.

  loop at lt_items into data(ls_item). "传进来的是一张单子的所有行项目

    lv_charg = ls_item-product-batchno.

    check lv_charg is not initial. "批次为空会dump

    read table ls_item-refdoc into data(ls_rfdoc) with key refdoccat = 'PO'.

    if sy-subrc = 0.

      select single werks matnr

        into (lv_werks ,lv_matnr)

        from ekpo

        where ebeln = ls_rfdoc-refdocno and ebelp = ls_rfdoc-refitemno.

      select single xchar

        into @data(lv_xchar)

        from marc

        where matnr = @lv_matnr and werks = @lv_werks and xchar = 'X'.

      check sy-subrc = 0.

      lv_ebeln = ls_rfdoc-refdocno.

      lv_ebelp = ls_rfdoc-refitemno.

      data(lv_name) = lv_ebeln && lv_ebelp.

      clear lv_out_str.

      perform frm_read_text using 'EKPO'

                                  '1'

                                  lv_name

                                  'F90'

                                  lv_out_str.

      clear:lv_object_long,lv_objecttable,lv_classtype,lv_classnum.

      call function 'VB_BATCH_2_CLASS_OBJECT'

        exporting

          i_matnr = ls_item-product-productno

          i_charg = lv_charg

          i_werks = lv_werks

        importing

          e_objek = lv_object_long

          e_obtab = lv_objecttable

          e_klart = lv_classtype

          e_class = lv_classnum.

*取特性值

      clear:lt_return,lt_return[],lt_allocvaluesnum[],lt_allocvalueschar[],lt_allocvaluescurr[].

      call function 'BAPI_OBJCL_GETDETAIL'

        exporting

*         objectkey       = lv_objectkey

          objecttable     = lv_objecttable

          classnum        = lv_classnum

          classtype       = lv_classtype

          objectkey_long  = lv_object_long

        tables

          allocvaluesnum  = lt_allocvaluesnum

          allocvalueschar = lt_allocvalueschar

          allocvaluescurr = lt_allocvaluescurr

          return          = lt_return.

      loop at lt_return into data(ls_return) where type ca 'AEX'.

*        move-corresponding lt_return to return.

*        append return.

      endloop.

      if sy-subrc ne 0.

        lv_out_str = lv_out_str(4).

        loop at lt_allocvalueschar where charact = 'B00009'.

          lt_allocvalueschar-value_char = lv_out_str.

          lt_allocvalueschar-value_char_long = lv_out_str.

          lt_allocvalueschar-value_neutral  = lv_out_str.

          lt_allocvalueschar-value_neutral_long  = lv_out_str.

          modify lt_allocvalueschar.

        endloop.

        if sy-subrc ne 0.

          lt_allocvalueschar-charact = 'B00009'.

          lt_allocvalueschar-value_char = lv_out_str.

          lt_allocvalueschar-value_char_long = lv_out_str.

          lt_allocvalueschar-value_neutral  = lv_out_str.

          lt_allocvalueschar-value_neutral_long  = lv_out_str.

          append lt_allocvalueschar.

        endif.

*修改

        clear:lt_return,lt_return[].

        call function 'BAPI_OBJCL_CHANGE'

          exporting

*           objectkey          = lv_objectkey

            objecttable        = lv_objecttable

            classnum           = lv_classnum

            classtype          = lv_classtype

            objectkey_long     = lv_object_long

*           status             = '1'

*           keydate            = sy-datum

          importing

            classif_status     = lv_status

          tables

            allocvaluesnumnew  = lt_allocvaluesnum

            allocvaluescharnew = lt_allocvalueschar

            allocvaluescurrnew = lt_allocvaluescurr

            return             = lt_return.

        loop at lt_return where type ca 'AEX'.

*          move-corresponding lt_return to return.

*          append return.

        endloop.

        if sy-subrc = 0 .

          call function 'BAPI_TRANSACTION_ROLLBACK'.

        else.

          call function 'BAPI_TRANSACTION_COMMIT'

            exporting

              wait = 'X'.

        endif.

      endif.

    endif.

  endloop.

endfunction.