TIPS:执行EWM事务码时前面需要加/N再加事务码/SCWM/PRDO
执行的流程有打包,收货,创建仓库任务并确认仓库任务
1.检查交货单有没有传到EWM
DATA O_RETURN TYPE ZST_FM_EXPMSG.
DATA lv_num TYPE i.
DO .
SELECT *
FROM /scdl/db_refdoc
WHERE refdocno = @v_wa_in-vbeln " 根据交货单取值
* AND substring( refitemno,5,6 ) EQ @v_wa_in-POSNR
AND refdoccat = 'ERP' INTO TABLE @DATA(gt_refdoc).
IF sy-subrc EQ 0 AND gt_refdoc IS NOT INITIAL.
SORT gt_refdoc BY refdocno refitemno.
DATA(v_wa_refdoc) = gt_refdoc[ 1 ].
o_return-zzmessage_v1 = lv_num.
CONDENSE o_return-zzmessage_v1 .
EXIT.
ELSE.
IF lv_num GE '1200'.
o_return-zztype = 'E'.
o_return-zzmessage = |{ lv_num } 交货单( { v_wa_in-vbeln }) 传EWM时超时! |."
RETURN .
ENDIF.
ENDIF.
ADD 1 TO lv_num .
WAIT UP TO '0.1' SECONDS .
ENDDO.
2.创建HU条码,并绑定物料信息 --- 代码就是执行如下界面操作
DATA:lo_dlv_pack TYPE REF TO /scwm/cl_dlv_pack_ibdl,
wa_huhdr TYPE /scwm/s_huhdr_int,
iv_pmat TYPE /scwm/de_matid.
DATA(lo_pack) = NEW /scwm/cl_pack( ).
/scwm/cl_tm=>cleanup( iv_lgnum = iv_lgnum )."仓库号
CREATE OBJECT lo_dlv_pack."实例化
* 数据初始化
CALL METHOD lo_dlv_pack->init
EXPORTING
iv_lgnum = iv_lgnum
it_docid = VALUE /scwm/tt_docid( ( docid = v_wa_refdoc-docid ) )
iv_doccat = 'PDI'
iv_no_refresh = 'X'
iv_lock_dlv = 'X'.
* 启用检查
/scwm/cl_dlv_pack_ibdl=>gv_online = 'X'.
* 检查条码是否存在
SELECT COUNT(*) FROM /scwm/huhdr
WHERE huident = v_wa_hu-huident .
IF sy-subrc = 0.
CONTINUE .
ENDIF.
* 条码物料转换
CALL FUNCTION 'CONVERSION_EXIT_MDLPD_INPUT'
EXPORTING
input = 'BOX'
IMPORTING
output = iv_pmat.
* 创建HU
CLEAR:wa_huhdr.
CALL METHOD lo_dlv_pack->/scwm/if_pack_bas~create_hu
EXPORTING
iv_pmat = iv_pmat
iv_huident = v_wa_hu-huident
RECEIVING
es_huhdr = wa_huhdr
EXCEPTIONS
error = 1
OTHERS = 2.
IF sy-subrc EQ 0 OR ( sy-msgno EQ '017' AND sy-msgid EQ '/SCWM/HU_WM' ).
APPEND VALUE #( huident = wa_huhdr-huident guid_hu = wa_huhdr-guid_hu ) TO gt_guid .
ELSE.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO DATA(lv_msg).
o_return-zztype = 'E'.
o_return-zzmessage = |{ o_return-zzmessage }交货单:({ v_wa_in-vbeln })创建HU({ v_wa_hu-huident })失败!原因:{ lv_msg }|." '交货单( ' && v_wa_in-vbeln && ' )无法进行打包!'.
RETURN .
ENDIF.
DATA wa_mat TYPE /scwm/s_pack_stock.
DATA wa_pg TYPE /scwm/s_quan."评估数量
DATA lv_guid TYPE /scwm/guid_hu.
DATA wa_quan TYPE /scwm/s_quan.
SORT gt_guid BY huident .
* 绑定物料信息
SELECT SINGLE marm~meinh
FROM lips JOIN marm ON marm~matnr = lips~matnr
WHERE lips~vbeln = @v_wa_hu-vbeln
AND lips~posnr = @v_wa_hu-posnr
AND marm~ty2tq EQ 'B' INTO @DATA(lv_meinh).
IF sy-subrc EQ 0.
DATA(lv_status) = 'A'.
wa_pg-quan = v_wa_hu-menge.
wa_pg-unit = v_wa_hu-meins.
wa_quan-quan = 1.
wa_quan-unit = lv_meinh.
ELSE.
wa_quan-quan = v_wa_hu-menge.
wa_quan-unit = v_wa_hu-meins.
ENDIF.
READ TABLE gt_refdoc INTO DATA(v_wa_id) WITH KEY refdocno = v_wa_hu-vbeln refitemno = v_wa_hu-posnr.
IF sy-subrc EQ 0.
wa_mat-qdocid = v_wa_id-docid.
wa_mat-qitmid = v_wa_id-itemid.
ENDIF.
READ TABLE gt_guid INTO DATA(v_wa_guid) WITH KEY huident = v_wa_hu-zbqbm .
IF sy-subrc = 0.
lv_guid = v_wa_guid-guid_hu .
ELSE.
CONTINUE .
ENDIF.
CALL METHOD lo_dlv_pack->/scwm/if_pack_bas~pack_stock
EXPORTING
iv_dest_hu = lv_guid
is_material = wa_mat
is_quantity = wa_quan
is_valuation = wa_pg
iv_cwexact = lv_status
IMPORTING
es_quantity = wa_quan
EXCEPTIONS
error = 1
OTHERS = 2.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
INTO lv_msg
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
o_return-zztype = 'E'.
o_return-zzmessage = |{ o_return-zzmessage }交货单:({ v_wa_in-vbeln })—执行打包时出现错误,物料包装失败,原因:{ lv_msg }|." '交货单( ' && v_wa_in-vbeln && ' )无法进行打包!'.
RETURN .
ELSE.
o_return-zztype = 'S'.
ENDIF.
IF o_return-zztype NE 'E'.
CALL METHOD lo_dlv_pack->/scwm/if_pack_bas~save
EXPORTING
iv_commit = 'X'
iv_wait = 'X'
EXCEPTIONS
error = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO lv_msg.
o_return-zztype = 'E'.
o_return-zzmessage = |{ o_return-zzmessage }交货单:({ v_wa_in-vbeln })—执行打包时出现错误,物料包装失败,原因:{ lv_msg }|.
RETURN .
ELSE.
o_return-zztype = 'S'.
o_return-zzmessage = | { o_return-zzmessage }交货单:({ v_wa_in-vbeln })打包成功!|."
ENDIF.
ENDIF.
3.收货过账
DATA:eo_message TYPE REF TO /scdl/cl_dm_message,
lo_message_box TYPE REF TO /scdl/cl_sp_message_box,
lo_sp_prd TYPE REF TO /scdl/cl_sp_prd_out,
lo_sp_prd_in TYPE REF TO /scdl/cl_sp_prd_inb,
lv_rejected TYPE boole_d,
lt_mes TYPE /scdl/dm_message_tab.
DATA it_hu TYPE /scwm/t_gm_hu .
DATA it_dlv TYPE /scwm/dlv_docid_item_tab .
TRY.
CREATE OBJECT lo_message_box.
ENDTRY.
/scwm/cl_goods_movement=>cleanup( )."初始化
/scwm/cl_tm=>cleanup( )."删除事务数据缓冲区
* DN按行项目收货
CASE v_flag.
WHEN 'A'.
/scwm/cl_goods_movement=>post_dlv(
EXPORTING
it_dlv = it_dlv
iv_gmcat = /scwm/if_docflow_c=>sc_gr
IMPORTING
eo_message = eo_message ).
WHEN 'H'.
* 按条码收货
TRY.
CALL METHOD /scwm/cl_goods_movement=>post_hu
EXPORTING
it_hu = it_hu
iv_gmcat = /scwm/if_docflow_c=>sc_gr
* iv_post_part =
IMPORTING
eo_message = eo_message.
ENDTRY.
ENDCASE.
IF eo_message IS BOUND.
lt_mes = eo_message->get_messages( )."获取返回消息
IF NOT line_exists( lt_mes[ msgty = 'E'] ) AND NOT line_exists( lt_mes[ msgty = 'A'] ) .
CASE /scwm/if_docflow_c=>sc_gr."收货
WHEN /scwm/if_docflow_c=>sc_gr OR /scwm/if_docflow_c=>sc_grr.
CREATE OBJECT lo_sp_prd_in
EXPORTING
io_message_box = lo_message_box
iv_doccat = /scdl/if_dl_doc_c=>sc_doccat_inb_prd
iv_mode = /scdl/cl_sp=>sc_mode_classic.
CALL METHOD lo_sp_prd_in->save
IMPORTING
rejected = lv_rejected.
ENDCASE.
COMMIT WORK AND WAIT.
IF iv_vbeln IS NOT INITIAL.
DO 10 TIMES .
SELECT SINGLE * FROM matdoc WHERE vbeln_im = @iv_vbeln AND bwart NE '103'
INTO @DATA(v_wa_mseg) .
IF sy-subrc EQ 0.
o_return-zvalue4 = v_wa_mseg-mblnr .
o_return-zvalue5 = v_wa_mseg-mjahr .
EXIT .
ELSE.
WAIT UP TO '0.1' SECONDS .
ENDIF.
ENDDO.
ENDIF.
o_return-zztype = 'S'.
o_return-zzmessage = |交货单收货成功--物料凭证({ o_return-zvalue4 })|." && lv_msg.
ELSE.
DATA(wa_msg) = lt_mes[ msgty = 'E' ].
MESSAGE ID wa_msg-msgid TYPE wa_msg-msgty NUMBER wa_msg-msgno
WITH wa_msg-msgv1 wa_msg-msgv2 wa_msg-msgv3 wa_msg-msgv4 INTO DATA(lv_msg).
o_return-zztype = 'E'.
o_return-zzmessage = |交货单收货失败,原因:{ lv_msg }| .
ENDIF.
/scwm/cl_goods_movement=>cleanup( ).
IF lo_sp_prd_in IS BOUND .
CALL METHOD lo_sp_prd_in->cleanup(
EXPORTING
reason = lo_sp_prd_in->sc_cleanup_commit ).
ENDIF.
ENDIF.
4. 创建|确认仓库任务----更新资源号
DATA iv_lgnum TYPE /scwm/lgnum .
DATA iv_process TYPE /scwm/de_to_whr_proc .
DATA iv_mve_hu TYPE /scwm/de_whr_mve_hu .
DATA it_create_whr TYPE /scwm/tt_to_prep_whr_int .
DATA it_crea_hu TYPE /scwm/tt_to_prep_hu_int .
DATA ev_tanum TYPE /scwm/tanum .
DATA et_ltap_vb TYPE /scwm/tt_ltap_vb .
DATA et_bapiret TYPE bapirettab.
DATA ev_severity TYPE bapi_mtype.
iv_lgnum = gt_in[ 1 ]-lgnum.
CHECK iv_lgnum NE space .
DATA(v_gt_in) = gt_in[].
SELECT b~huident,b~guid_hu
FROM @v_gt_in AS a
JOIN /scwm/huhdr AS b ON b~huident = a~zbqbm
INTO TABLE @DATA(v_gt_hu).
CHECK v_gt_hu IS NOT INITIAL .
*LOOP AT v_gt_in INTO .
*
*ENDLOOP.
DATA(v_wa_in) = v_gt_in[ 1 ].
DATA p_squit TYPE /scwm/rl03tsquit .
CLEAR:p_squit .
*IF IV_SQUIT .
*
*ENDIF.
CASE iv_flag.
WHEN 'S'.
p_squit = 'X' .
WHEN 'C'."创建仓库任务
CLEAR:p_squit .
WHEN 'M'."创建仓库任务
p_squit = 'X' .
WHEN OTHERS .
RETURN .
ENDCASE.
SELECT c~docid,c~itemid,c~doccat,a~zbqbm AS huident,a~vbeln,a~posnr,a~lgpla,d~status_value
FROM @v_gt_in AS a
JOIN /scdl/db_refdoc AS c ON c~refdocno = a~vbeln AND substring( c~refitemno ,5,6 ) = a~posnr AND c~refdoccat EQ 'ERP'
JOIN /scdl/db_status AS d ON c~docid = d~docid AND c~itemid = d~itemid AND d~status_type = 'DGR'
INTO TABLE @DATA(v_gt_refdoc).
DELETE v_gt_refdoc WHERE status_value NE '9'.
IF sy-subrc = 0.
o_return-zztype = 'E' .
o_return-zzmessage = '未完全收货,无法确认仓库任务!' .
RETURN .
ENDIF.
SORT v_gt_refdoc BY vbeln posnr .
LOOP AT v_gt_refdoc INTO DATA(v_wa_ret) GROUP BY ( vbeln = v_wa_ret-vbeln posnr = v_wa_ret-posnr ) .
CLEAR:it_create_whr,et_ltap_vb,et_bapiret,ev_severity,ev_tanum.
it_create_whr = VALUE #( BASE it_create_whr FOR wa_ref IN v_gt_refdoc WHERE ( vbeln = v_wa_ret-vbeln AND posnr = v_wa_ret-posnr )
( rdoccat = wa_ref-doccat
rdocid = wa_ref-docid
ritmid = wa_ref-itemid
vlpla = wa_ref-lgpla
* vlenr = wa_ref-huident nlenr = wa_ref-huident
)
).
DELETE ADJACENT DUPLICATES FROM it_create_whr COMPARING ALL FIELDS .
CALL FUNCTION '/SCWM/TO_CREATE_WHR'
EXPORTING
iv_lgnum = iv_lgnum
iv_process = '1'
iv_mve_hu = 'X'
* iv_mve_mat = 'X'
* iv_mve_hu_mult = 'X'
iv_squit = p_squit "确认仓库任务
* IV_FULL_PICK =
* IV_TO_INIT = 'X'
iv_bname = sy-uname
* IV_WTCODE = ' '
* IV_FILTER_HU = ' '
* IS_PARAM =
* IS_RFC_QUEUE =
it_create_whr = it_create_whr
* it_crea_hu = it_crea_hu
* IV_UPDATE_TASK = ' '
iv_commit_work = 'X'
IMPORTING
ev_tanum = ev_tanum
et_ltap_vb = et_ltap_vb
et_bapiret = et_bapiret
ev_severity = ev_severity.
IF ev_severity = 'E'.
DATA(v_wa_msg) = et_bapiret[ type = 'E' ].
o_return-zztype = 'E' .
IF iv_squit = 'X'.
o_return-zzmessage = |仓库任务创建或确认时失败,原因:{ v_wa_msg-message }| .
ELSE.
o_return-zzmessage = |仓库任务创建失败,原因:{ v_wa_msg-message }| .
ENDIF.
APPEND o_return TO t_return .
RETURN .
* CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
* CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
* EXPORTING
* wait = 'X'.
* DATA(v_wa_vb) = et_ltap_vb[ tapos = '0000' ].
IF et_ltap_vb IS NOT INITIAL.
DATA(v_wa_vb) = et_ltap_vb[ 1 ].
o_return-zztype = 'S' .
IF p_squit = 'X'.
o_return-zzmessage = |仓库任务创建且确认成功!| .
ELSE.
o_return-zzmessage = |仓库任务创建成功!| .
ENDIF.
o_return-zvalue1 = v_wa_vb-who.
o_return-zvalue2 = v_wa_vb-tanum.
o_return-zvalue3 = v_wa_vb-nlpla.
APPEND o_return TO t_return .
ENDIF.
* 更新资源号
DATA v_gt_in_up TYPE TABLE OF zpdas_dn_by_po .
v_gt_in_up = VALUE #( BASE v_gt_in_up FOR wa IN et_ltap_vb
WHERE ( who IS NOT INITIAL )
( lgnum = wa-lgnum
who = wa-who
rsrc = v_wa_in-rsrc
uname = v_wa_in-uname
)
).
DATA ls_who TYPE /scwm/s_who_int.
DATA lt_who TYPE TABLE OF /scwm/s_who_int.
DATA(v_gt_in) = gt_in[] .
SORT v_gt_in BY lgnum who .
DELETE ADJACENT DUPLICATES FROM v_gt_in COMPARING lgnum who .
LOOP AT v_gt_in INTO DATA(v_wa_in) GROUP BY ( who = v_wa_in-who lgnum = v_wa_in-lgnum ).
"更新资源
CALL FUNCTION '/SCWM/WHO_GET'
EXPORTING
iv_lgnum = v_wa_in-lgnum
iv_whoid = v_wa_in-who "WHO number
IMPORTING
es_who = ls_who
EXCEPTIONS
/scwm/cx_core = 1
OTHERS = 2.
IF sy-subrc EQ 0.
* SELECT COUNT(*) FROM /scwm/ordim_o WHERE who EQ ls_who-who.
* IF sy-subrc EQ 0.
* ls_who-status = 'D'.
* ELSE.
* ls_who-status = 'C'.
* ENDIF.
ls_who-updkz = 'U'."change indicator: D-delete.I-insert,U-update
GET TIME STAMP FIELD ls_who-confirmed_at.
* ls_who-confirmed_by = v_in-uname.
ls_who-rsrc = v_wa_in-rsrc.
APPEND ls_who TO lt_who.
CLEAR:ls_who .
ENDIF.
ENDLOOP .
IF lt_who IS NOT INITIAL.
CALL FUNCTION '/SCWM/WHO_DB_UPDATE'
EXPORTING
it_who = lt_who.
CLEAR:lt_who,ls_who .
COMMIT WORK AND WAIT.
ENDIF.
ENDIF.
ENDLOOP.