第一次接到这种开发需求,花费了大量时间查找可行的解决方案。最终让我找到了可行的办法,本文希望能给同样走了很多弯路的你一点帮助。
大体上只需要BAPI_HU_CREATE创建HU和WS_DELIVERY_UPDATE将HU更新到交货单。
以下是亲测可行的示例代码:
FORM dr_create TABLES lt_item STRUCTURE zssdi001_item_in
USING ls_head TYPE zssdi001_head_in
l_deli TYPE bapishpdelivnumb-deliv_numb
CHANGING o_resp TYPE zsrest_out.
CONSTANTS: cv_vbtyp_notification LIKE likp-vbtyp VALUE '7',
cv_in_delivery LIKE verko-object VALUE '03', " inbound
cv_out_delivery LIKE verko-object VALUE '01', " outbound
cv_velin LIKE vepo-velin VALUE '1',
cv_pksta_packed TYPE pksta VALUE 'C'.
DATA: lt_lips TYPE STANDARD TABLE OF lips.
IF l_deli IS NOT INITIAL.
SELECT * " posnr werks lgort meins lfimg matnr charg ...
FROM lips
INTO CORRESPONDING FIELDS OF TABLE lt_lips
WHERE vbeln = l_deli.
ENDIF.
IF lt_lips IS INITIAL.
o_resp-msgty = 'E'.
o_resp-msgtx = o_resp-msgtx && ';交货单未找到,包装失败'.
EXIT.
ENDIF.
DATA: lt_hu LIKE STANDARD TABLE OF hum_rehang_hu,
ls_hu LIKE LINE OF lt_hu,
lv_pksta TYPE vbup-pksta.
DATA: lt_vekp TYPE STANDARD TABLE OF vekp,
lt_vepo TYPE STANDARD TABLE OF vepo,
lv_exidv TYPE exidv.
DATA: ls_vbkok LIKE vbkok,
lt_hus LIKE STANDARD TABLE OF vekpvb,
ls_hus LIKE LINE OF lt_hus.
" Handling-Unit Confirmation: Header Data
DATA: lt_verko LIKE STANDARD TABLE OF verko,
ls_verko TYPE verko,
" Handling Unit Confirmation: Content Data
lt_verpo LIKE STANDARD TABLE OF verpo,
ls_verpo TYPE verpo,
lt_prot LIKE STANDARD TABLE OF prott,
ls_prot TYPE prott.
FIELD-SYMBOLS: <fs_vekp> LIKE vekp,
<fs_vepo> LIKE vepo,
<fs_lips> LIKE lips.
FIELD-SYMBOLS:<fs1> TYPE matnr,
<fs2> TYPE vemng,
<fs3> TYPE vemng.
DATA:lv_str1 TYPE string,
lv_str2 TYPE string,
lv_str3 TYPE string.
LOOP AT lt_lips ASSIGNING <fs_lips>.
DO 4 TIMES. "模板中的四个包装材料
CLEAR:lv_str1 , lv_str2,lv_str3.
lv_str1 = 'VHILM' && sy-index. "包装材料
lv_str2 = 'MENGE' && sy-index. "包装总数
lv_str3 = 'VEMNG' && sy-index. "包装数量
ASSIGN COMPONENT lv_str1 OF STRUCTURE ls_head TO <fs1>.
ASSIGN COMPONENT lv_str2 OF STRUCTURE ls_head TO <fs2>.
ASSIGN COMPONENT lv_str3 OF STRUCTURE ls_head TO <fs3>.
IF <fs1> IS INITIAL.
CONTINUE.
ENDIF.
IF ( <fs_lips>-lfimg IS NOT INITIAL ) AND ( <fs_lips>-lfimg > 0 ).
" Filter already packed items
CLEAR lv_pksta.
SELECT SINGLE pksta
FROM vbup
INTO lv_pksta
WHERE vbeln = <fs_lips>-vbeln
AND posnr = <fs_lips>-posnr.
IF lv_pksta EQ cv_pksta_packed .
CONTINUE.
ENDIF.
" Create HU and assign it to the delivery (no items are yet created)
"一个材料包几次就创建几个HU
DO ( <fs2> / <fs3> ) TIMES.
CLEAR ls_hu.
"建空的HU,并赋给交货单
PERFORM get_assigned_hu USING <fs_lips>
<fs1>
<fs3>
CHANGING ls_hu.
IF ls_hu IS NOT INITIAL.
APPEND ls_hu TO lt_hu.
"创建的HU在vekp中记录
SELECT * FROM vekp
INTO TABLE lt_vekp
WHERE venum = ls_hu-venum.
LOOP AT lt_vekp ASSIGNING <fs_vekp>.
CLEAR ls_verko.
MOVE-CORRESPONDING <fs_vekp> TO ls_verko.
ls_verko-ernam = sy-uname.
ls_verko-object = cv_out_delivery. " Outbound Delivery
ls_verko-objkey = l_deli. " Object to Which the HU is Assigned
ls_verko-exidv = <fs_vekp>-exidv.
APPEND ls_verko TO lt_verko.
ENDLOOP.
" 包装行
ls_verpo-exidv_ob = ls_hu-top_hu_external.
ls_verpo-venum = ls_hu-venum.
" other lips fields
MOVE-CORRESPONDING <fs_lips> TO ls_verpo.
ls_verpo-tmeng = <fs3>. "包装数量
ls_verpo-vrkme = <fs_lips>-meins.
APPEND ls_verpo TO lt_verpo.
ENDIF.
ENDDO.
ENDIF.
ENDDO.
IF ( lt_verko IS NOT INITIAL ) AND ( lt_verpo IS NOT INITIAL ).
ls_vbkok-vbeln = <fs_lips>-vbeln.
ls_vbkok-vbeln_vl = <fs_lips>-vbeln.
ls_vbkok-vbtyp_vl = 'J'.
" Save Handling unit data, pack, update delivery
CALL FUNCTION 'WS_DELIVERY_UPDATE'
EXPORTING
vbkok_wa = ls_vbkok
synchron = abap_true
commit = abap_true
delivery = <fs_lips>-vbeln
nicht_sperren = space
TABLES
verko_tab = lt_verko
verpo_tab = lt_verpo
prot = lt_prot.
IF NOT lt_prot[] IS INITIAL.
CLEAR: ls_prot.
READ TABLE lt_prot INDEX 1 INTO ls_prot.
MESSAGE ID ls_prot-msgid
TYPE ls_prot-msgty
NUMBER ls_prot-msgno
WITH ls_prot-msgv1 ls_prot-msgv2
ls_prot-msgv3 ls_prot-msgv4.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form GET_ASSIGNED_HU
*&---------------------------------------------------------------------*
* Create empty HU and assign it to the delivery
*----------------------------------------------------------------------*
* -->PV_VBELN text
* -->PV_PACK_MAT text
* -->PV_VBTYP text
*----------------------------------------------------------------------*
FORM get_assigned_hu
USING ps_lips TYPE lips " delivery position data
pv_pack_mat TYPE mara-matnr
pv_menge TYPE vemng
CHANGING ps_hu TYPE hum_rehang_hu.
DATA: lt_return LIKE STANDARD TABLE OF bapiret2,
ls_return LIKE LINE OF lt_return,
lv_hukey TYPE bapihukey-hu_exid,
ls_huheader TYPE bapihuheader,
ls_headerproposal TYPE bapihuhdrproposal,
lt_itemproposal TYPE STANDARD TABLE OF bapihuitmproposal,
ls_itemproposal LIKE LINE OF lt_itemproposal.
DATA: cv_out_delivery1 LIKE verko-object VALUE '01'.
" HU header proposal
CLEAR:ls_headerproposal,ls_huheader.
ls_headerproposal-plant = ps_lips-werks.
MOVE ps_lips-lgort TO ls_headerproposal-stge_loc.
ls_headerproposal-pack_mat = pv_pack_mat.
" creates record in VEKP (with item proposal given also in VEPO)
CALL FUNCTION 'BAPI_HU_CREATE'
EXPORTING
headerproposal = ls_headerproposal
IMPORTING
huheader = ls_huheader
hukey = lv_hukey
TABLES
itemsproposal = lt_itemproposal
return = lt_return.
IF lt_return[] IS INITIAL.
CLEAR ls_return.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'
IMPORTING
return = ls_return.
ELSE.
PERFORM get_bapi_error TABLES lt_return.
ENDIF.
" Wait to avoid lock in production environment
WAIT UP TO 1 SECONDS.
" Set connection to the outbound delivery type (pack_mat_object)
MOVE cv_out_delivery1 TO ls_huheader-pack_mat_object.
MOVE ps_lips-vbeln TO ls_huheader-pack_mat_obj_key.
REFRESH lt_return.
CALL FUNCTION 'BAPI_HU_CHANGE_HEADER'
EXPORTING
hukey = ls_huheader-hu_exid
huchanged = ls_huheader
IMPORTING
huheader = ls_huheader
TABLES
return = lt_return.
IF lt_return[] IS INITIAL.
CLEAR ls_return.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'
IMPORTING
return = ls_return.
ELSE.
PERFORM get_bapi_error TABLES lt_return.
ENDIF.
CLEAR ps_hu.
" note: hu_exid + hu_id are stored in VEKP - Handling Unit - Header Table
ps_hu-top_hu_external = ls_huheader-hu_exid.
ps_hu-top_hu_internal = ls_huheader-hu_id.
ps_hu-venum = ls_huheader-hu_id.
ps_hu-rfbel = ps_lips-vbeln.
ps_hu-rfpos = ps_lips-posnr.
ENDFORM. " GET_ASSIGNED_HU
*&---------------------------------------------------------------------*
*& Form GET_BAPI_ERROR
*&---------------------------------------------------------------------*
* Checks errors in result table
*----------------------------------------------------------------------*
* -->P_LT_RETURN text
*----------------------------------------------------------------------*
FORM get_bapi_error
TABLES pt_return STRUCTURE bapiret2.
FIELD-SYMBOLS: <fs_return> LIKE bapiret2.
LOOP AT pt_return ASSIGNING <fs_return>.
IF <fs_return>-type = 'E' OR <fs_return>-type = 'A'.
MESSAGE ID <fs_return>-id
TYPE <fs_return>-type
NUMBER <fs_return>-number
WITH <fs_return>-message_v1 <fs_return>-message_v2
<fs_return>-message_v3 <fs_return>-message_v4.
LEAVE SCREEN.
ENDIF.
ENDLOOP.
ENDFORM. " GET_BAPI_ERROR