/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.