BBP_INB_DELIVERY_CREATE
FUNCTION zmm_srm_inb_delivery.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(IN_DATA) TYPE ZSLIKP
*" EXPORTING
*" VALUE(ZJHD) TYPE CHAR10
*" VALUE(VBELN) TYPE VBELN
*" VALUE(MSGTY) TYPE MSGTY
*" VALUE(MSGTX) TYPE BAPI_MSG
*"----------------------------------------------------------------------
*接口逻辑:
*根据参考凭证LIPS-VGBEL =EKKO-EBELN取出采购订单类型EKKO-BSART=ZTH,生成退货交货类型RL、行项目交货类别为RLN。
*根据参考凭证LIPS-VGBEL =EKKO-EBELN取出采购订单类型EKKO-BSART IN( NB、ZSTO),生成交货类型为EL、行项目交货类别是ELN。
DATA: ls_in TYPE zslikp,
lv_pstyv LIKE lips-pstyv.
CHECK in_data IS NOT INITIAL.
ls_in = in_data.
DATA(lv_vgbel) = ls_in-item[ 1 ]-vgbel.
SELECT SINGLE bsart INTO @DATA(lv_bsart)
FROM ekko
WHERE ebeln = @lv_vgbel.
IF sy-subrc NE 0.
msgty = 'E'.
msgtx = '采购订单' && lv_vgbel && '不存在'.
RETURN.
ENDIF.
CASE lv_bsart.
WHEN 'ZTH'."退货交货单
ls_in-lfart = 'RL'.
lv_pstyv = 'RLN'.
PERFORM frm_vl01n USING ls_in lv_pstyv
CHANGING zjhd vbeln msgty msgtx.
WHEN 'NB' OR 'ZSTO'."普通交货单
ls_in-lfart = 'EL'.
lv_pstyv = 'ELN'.
PERFORM frm_inb_delivery_create USING ls_in lv_pstyv
CHANGING zjhd vbeln msgty msgtx.
WHEN OTHERS.
ENDCASE.
ENDFUNCTION.
1. 退货交货单
*&---------------------------------------------------------------------*
*& Form frm_VL01N
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LS_IN
*& --> LV_PSTYV
*& <-- ZJHD
*& <-- VBELN
*& <-- MSGTY
*& <-- MSGTX
*&---------------------------------------------------------------------*
FORM frm_vl01n USING ps_in TYPE zslikp
pv_pstyv
CHANGING cv_zjhd
cv_vbeln
cv_msgty
cv_msgtx.
DATA: ls_req TYPE bapideliciousrequest,
lt_req TYPE TABLE OF bapideliciousrequest,
createditems TYPE bapideliciouscreateditems OCCURS 0 WITH HEADER LINE,
return TYPE bapiret2,
it_return LIKE TABLE OF return WITH HEADER LINE,
it_tab LIKE TABLE OF ls_req WITH HEADER LINE,
it_items LIKE TABLE OF createditems WITH HEADER LINE,
iid LIKE bapideliciousrequest-id,
iitem LIKE bapideliciousrequest-document_item,
saleorder(150) TYPE c,
sales_uom LIKE bapideliciousrequest-quantity_sales_uom VALUE '1'.
DATA lv_posnr TYPE posnr.
cv_zjhd = ps_in-zjhd.
DATA(lt_in_item) = ps_in-item[].
lv_posnr = '000000'.
LOOP AT lt_in_item ASSIGNING FIELD-SYMBOL(<lf_item>).
lv_posnr = lv_posnr + 10.
<lf_item>-vgpos = lv_posnr.
iid = iid + 10.
ls_req-id = iid.
ls_req-document_numb = <lf_item>-vgbel.
ls_req-document_item = <lf_item>-vgpos.
ls_req-plant = <lf_item>-werks.
ls_req-stge_loc = <lf_item>-lgort.
ls_req-quantity_sales_uom = <lf_item>-lfimg.
ls_req-document_type = 'B'. "B表示采购订单,A销售订单
ls_req-document_type_delivery = ps_in-lfart.
ls_req-delivery_date = sy-datum."+0(6).
IF ps_in-erdat IS NOT INITIAL.
ls_req-delivery_date = ps_in-erdat.
ELSE.
ls_req-delivery_date = sy-datum.
ENDIF.
APPEND ls_req TO lt_req.
ENDLOOP.
CALL FUNCTION 'RV_DELIVERY_INIT'.
CALL FUNCTION 'BAPI_DELIVERYPROCESSING_EXEC'
TABLES
request = lt_req
createditems = it_items
return = it_return.
LOOP AT it_return ASSIGNING FIELD-SYMBOL(<fs_ret>) WHERE type CA 'EAX'.
cv_msgty = 'E'.
MESSAGE ID <fs_ret>-id TYPE <fs_ret>-type NUMBER <fs_ret>-number
INTO DATA(mtext)
WITH <fs_ret>-message_v1 <fs_ret>-message_v2 <fs_ret>-message_v3 <fs_ret>-message_v4.
cv_msgtx = cv_msgtx && mtext.
ENDLOOP.
IF cv_msgty = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.
cv_vbeln = VALUE #( it_items[ 1 ]-document_numb ).
cv_msgty = 'S'.
MESSAGE s208(00) WITH |内向交货单{ cv_vbeln }创建成功.| INTO cv_msgtx.
ENDIF.
ENDFORM.
2.普通交货单
*&---------------------------------------------------------------------*
*& Form frm_inb_delivery_create
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LS_IN
*& --> LV_PSTYV
*& <-- ZJHD
*& <-- VBELN
*& <-- MSGTY
*& <-- MSGTX
*&---------------------------------------------------------------------*
FORM frm_inb_delivery_create USING ps_in TYPE zslikp
pv_pstyv
CHANGING cv_zjhd
cv_vbeln
cv_msgty
cv_msgtx.
**1,BBP_INB_DELIVERY_CREATE
DATA: ls_head LIKE bbp_inbd_l,
ls_item LIKE bbp_inbd_d,
lt_item LIKE TABLE OF bbp_inbd_d,
lt_ret LIKE TABLE OF bapireturn.
DATA lv_dn LIKE likp-vbeln.
DATA lv_posnr TYPE posnr.
cv_zjhd = ps_in-zjhd.
DATA(lt_in_item) = ps_in-item[].
IF ps_in-erdat IS NOT INITIAL.
ls_head-deliv_date = ps_in-erdat.
ELSE.
ls_head-deliv_date = sy-datum.
ENDIF.
*ls_head-ship_point = '2000'.
lv_posnr = '000000'.
LOOP AT lt_in_item ASSIGNING FIELD-SYMBOL(<is_item>).
* ls_item-deliv_item = '000010'. "is_item-POSNR
lv_posnr = lv_posnr + 10.
<is_item>-posnr = lv_posnr.
ls_item-deliv_item = <is_item>-posnr.
ls_item-material = <is_item>-matnr.
ls_item-deliv_qty = <is_item>-lfimg.
ls_item-unit = <is_item>-meins.
ls_item-po_number = <is_item>-vgbel.
ls_item-po_item = <is_item>-vgpos.
APPEND ls_item TO lt_item.
CLEAR ls_item.
ENDLOOP.
CALL FUNCTION 'BBP_INB_DELIVERY_CREATE'
EXPORTING
is_inb_delivery_header = ls_head
IMPORTING
ef_delivery = lv_dn
TABLES
it_inb_delivery_detail = lt_item
return = lt_ret.
IF lv_dn IS INITIAL .
****在程序 LBBP_SIC_40F02 691 行 写入。
IMPORT lv_vbeln = lv_dn FROM MEMORY ID zcl_memory_id=>c001.
ENDIF.
LOOP AT lt_ret INTO DATA(ls_ret) WHERE type CA 'EAX'.
cv_msgty = 'E'.
MESSAGE ID ls_ret-code TYPE ls_ret-type NUMBER ls_ret-log_msg_no
INTO DATA(mtext)
WITH ls_ret-message_v1 ls_ret-message_v2 ls_ret-message_v3 ls_ret-message_v4.
cv_msgtx = cv_msgtx && mtext.
ENDLOOP.
IF lv_dn IS INITIAL.
IMPORT lv_msg = cv_msgtx FROM MEMORY ID zcl_memory_id=>c002.
ENDIF.
IF cv_msgty = 'E' OR cv_msgtx IS NOT INITIAL.
cv_msgty = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
LOOP AT lt_in_item ASSIGNING <is_item>.
IF <is_item>-lichn IS NOT INITIAL.
UPDATE lips SET lichn = <is_item>-lichn
WHERE vbeln = lv_dn
AND posnr = <is_item>-posnr.
ENDIF.
* IF <is_item>-arktx IS NOT INITIAL.
* UPDATE lips SET arktx = <is_item>-arktx
* WHERE vbeln = del_no
* AND posnr = <is_item>-posnr.
* ENDIF.
IF sy-subrc EQ 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
cv_vbeln = lv_dn.
ENDIF.
cv_msgty = 'S'.
cv_msgtx = '创建成功'.
ENDLOOP.
ENDIF.
ENDFORM.
3. 针对 BBP_INB_DELIVERY_CREATE 创建 VL31N 创建入库交货,不能返回错误消息或者不返回交货单的问题,
在程序 LBBP_SIC_40F02 691 行做隐式增强:
ENHANCEMENT 1 ZES_STP_LBBP_SIC. "active version
**出现交货单创建成功,但是DN号不返回的情况,使用MEMORY ID 传值
IF ef_delivery IS INITIAL AND LT_VBLS[] IS NOT INITIAL .
READ TABLE LT_VBLS INDEX 1.
EXPORT lv_vbeln = LT_VBLS-VBELN_LIF TO MEMORY ID ZCL_MEMORY_ID=>C001.
ENDIF .
data: lv_msg(220) type C.
if LT_VBFS[] is NOT INITIAL.
loop at LT_VBFS WHERE msgty = 'E'.
MESSAGE ID LT_VBFS-msgid TYPE LT_VBFS-msgty NUMBER LT_VBFS-msgno
INTO DATA(mtext)
WITH LT_VBFS-msgv1 LT_VBFS-msgv2 LT_VBFS-msgv3 LT_VBFS-msgv4.
lv_msg = lv_msg && mtext.
ENDLOOP.
IF lv_msg IS NOT INITIAL.
EXPORT lv_msg = lv_msg TO MEMORY ID ZCL_MEMORY_ID=>C002.
ENDIF.
ENDIF.
ENDENHANCEMENT.