文章目录
1 Instruction
Cwms send data to sap and posting(The movemoment type is 643). And interface is
webservice.
2 code
FUNCTION ZCWMS_SRV_0009_IN.
*"----------------------------------------------------------------------
*"*"Local interface:
*" IMPORTING
*" VALUE(ITB_CWMS_IN) TYPE ZTA_CWMS009 OPTIONAL
*" EXPORTING
*" VALUE(MBLNR) TYPE MBLNR
*" VALUE(ZEBELN) TYPE ZEBELN
*" VALUE(REID) TYPE CHAR1
*" VALUE(REMSG) TYPE CHAR200
*" VALUE(VBELN) TYPE VBELN
*"----------------------------------------------------------------------
DEFINE add_pre_zero.
call function 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = &1
IMPORTING
output = &1.
END-OF-DEFINITION.
DEFINE delete_pre_zero.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
INPUT = &1
IMPORTING
OUTPUT = &1.
END-OF-DEFINITION.
*&---------------------------------------------------------------------*
*& Form FRM_GET_KYL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_WERKS text
* -->P_LGORT text
* -->P_MATNR text
* -->P_MENGE text
*----------------------------------------------------------------------*
" FRM_GET_KYL
" 采购订单创建交货单BAPI使用的参数定义
DATA:
L_DELIVERY TYPE VBELN_VL,
L_NUM_DELIVERIES TYPE VBNUM,
LT_STOCK_TRANS_ITEMS TYPE STANDARD TABLE OF BAPIDLVREFTOSTO,
LT_DELIVERIES TYPE STANDARD TABLE OF BAPISHPDELIVNUMB,
LT_CREATED_ITEMS TYPE STANDARD TABLE OF BAPIDLVITEMCREATED,
LT_RETURN TYPE STANDARD TABLE OF BAPIRET2,
WA_RETURN LIKE BAPIRET2,
LT_PROT TYPE STANDARD TABLE OF PROTT,
LT_BAPIOBDLVITEMCHG LIKE STANDARD TABLE OF BAPIOBDLVITEMCHG WITH HEADER LINE,
LT_BAPIOBDLVITEMCHG_C LIKE STANDARD TABLE OF BAPIOBDLVITEMCTRLCHG WITH HEADER LINE,
LT_ITEM_DATA_SPL TYPE STANDARD TABLE OF /SPE/BAPIOBDLVITEMCHG.
DATA:
WA_HEADER_DATA TYPE BAPIOBDLVHDRCHG,
WA_HEADER_CONTROL TYPE BAPIOBDLVHDRCTRLCHG,
WA_ITEM_DATA_SPL TYPE /SPE/BAPIOBDLVITEMCHG,
WA_STOCK_TRANS_ITEMS TYPE BAPIDLVREFTOSTO,
WA_CREATED_ITEMS TYPE BAPIDLVITEMCREATED,
WA_DELIVERIES TYPE BAPISHPDELIVNUMB,
WA_VBKOK TYPE VBKOK,
L_EF_ERROR_ANY_0 TYPE XFELD.
"MIGO收货BAPI参数定义
DATA: GT_GOODSMVT_HEADER LIKE BAPI2017_GM_HEAD_01,
GT_GOODSMVT_ITEM LIKE BAPI2017_GM_ITEM_CREATE OCCURS 0 WITH HEADER LINE,
GT_RETURN LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE.
DATA: GT_GOODSMVT_HEADRET LIKE BAPI2017_GM_HEAD_RET,
GOODSMVT_CODE_TMP TYPE BAPI2017_GM_CODE.
DATA: L_RETURN LIKE BAPIRET2.
DATA:lv_meins like mara-meins,"基本计量单位
lv_usnam LIKE MKPF-USNAM,
lv_MBLNR LIKE MKPF-MBLNR,"物料凭证
lv_MJAHR like MKPF-MJAHR, "会计年度
lv_VBELN like LIPS-VBELN,
lv_POSNR like LIPS-POSNR,
lv_kyl like ZTCWMS016-MENGE, "可用量
lv_MENGE like ZTCWMS016-MENGE,"总数量
lv_LFIMG like lips-LFIMG,"交货单总数
lv_dn like lips-VBELN,"交货号
p_guid LIKE ZTCWMS016-guid,
GT_ZTCWMS016 LIKE TABLE OF ZTCWMS016 , " 日志内表
GW_ZTCWMS016 LIKE LINE OF GT_ZTCWMS016,
GT_ZTCWMS018 LIKE TABLE OF ZTCWMS016 WITH HEADER LINE , " 日志内表
GW_ZTCWMS018 LIKE LINE OF GT_ZTCWMS018.
DATA: GT_ZTCWMS017 LIKE TABLE OF ZTCWMS017 WITH HEADER LINE, " 原始数据表
GW_ZTCWMS017 LIKE LINE OF GT_ZTCWMS017.
DATA: BEGIN OF gw_ekpo, "采购凭证项目内表
EBELN LIKE ekpo-EBELN,
EBELP LIKE ekpo-EBELP,
MATNR LIKE ekpo-MATNR,
MENGE like ekpo-MENGE, "订单数量
MENGE1 like ekpo-MENGE, "交货单数量
MENGE2 like ekpo-MENGE, "还未交货数量
END OF gw_ekpo.
DATA: gt_ekpo LIKE STANDARD TABLE OF gw_ekpo with HEADER LINE.
DATA: wa_cwms_in LIKE ZST_CWMS009 .
DATA: gv_uname LIKE sy-uname.
DATA: lv_sum type ekpo-menge,
lv_str type string,
lv_str1 type string.
DATA: BEGIN OF gw_ekpo1, " 准备收货采购订单行项目表
EBELN LIKE ekpo-EBELN,
EBELP LIKE ekpo-EBELP,
MENGE like ekpo-MENGE,
matnr like ekpo-matnr,
owerks like zst_cwms009-owerks,
iwerks like zst_cwms009-iwerks,
olgort like zst_cwms009-olgort,
ilgort like zst_cwms009-ilgort,
END OF gw_ekpo1.
DATA: gt_ekpo1 LIKE STANDARD TABLE OF gw_ekpo1 WITH HEADER LINE ,
gt_ekpo2 LIKE STANDARD TABLE OF gw_ekpo1 WITH HEADER LINE .
DATA: BEGIN OF gw_sum, "
iwerks like ZTCWMS017-iwerks, "工厂
matnr like ZTCWMS017-matnr, "物料
MENGE like ZTCWMS017-MENGE, "数量
zebeln like ztcwms017-zebeln, " cwms交货号
owerks like ztcwms017-owerks, "输入工厂
olgort like ztcwms017-olgort, " 输入仓库
END OF gw_sum.
DATA: gt_sum LIKE STANDARD TABLE OF gw_sum .
DATA: GT_CWMS009 LIKE TABLE OF ZST_CWMS009 WITH HEADER LINE." 输入参数内表
IF itb_cwms_in[] IS INITIAL.
reid = 'E'.
remsg = '您未发送数据'.
EXIT.
ENDIF.
"校验重复
SELECT * INTO TABLE GT_ZTCWMS016
FROM ZTCWMS016
FOR ALL ENTRIES IN itb_cwms_in
WHERE zebeln = itb_cwms_in-zebeln.
LOOP AT GT_ZTCWMS016[] INTO GW_ZTCWMS016.
IF GW_ZTCWMS016 IS NOT INITIAL AND GW_ZTCWMS016-REID5 = 'S'.
reid = 'E'.
remsg = '数据已重复发送'.
EXIT.
ENDIF.
ENDLOOP.
CLEAR: GT_ZTCWMS016, GW_ZTCWMS016.
**************** 数据校验 ************************************
clear: wa_cwms_in.
LOOP AT itb_cwms_in INTO wa_cwms_in.
add_pre_zero:wa_cwms_in-MATNR.
IF wa_cwms_in-zebeln IS INITIAL.
reid = 'E'.
remsg = 'ZEBELN 不能为空'.
EXIT.
ENDIF.
IF wa_cwms_in-DOCLINENO IS INITIAL.
reid = 'E'.
remsg = 'SO单据不能为空'.
EXIT.
ENDIF.
IF wa_cwms_in-iwerks IS INITIAL.
reid = 'E'.
remsg = '收货工厂不能为空'.
EXIT.
ENDIF.
IF wa_cwms_in-ilgort IS INITIAL.
reid = 'E'.
remsg = '收货库存地不能为空'.
EXIT.
ENDIF.
IF wa_cwms_in-matnr IS INITIAL.
reid = 'E'.
remsg = 'matnr 不能为空'.
EXIT.
ENDIF.
IF wa_cwms_in-menge IS INITIAL.
reid = 'E'.
remsg = 'menge 不能为空'.
EXIT.
ENDIF.
IF wa_cwms_in-owerks IS INITIAL.
reid = 'E'.
remsg = '发货工厂不能为空'.
EXIT.
ENDIF.
IF wa_cwms_in-olgort IS INITIAL.
reid = 'E'.
remsg = '发货库存地不能为空'.
EXIT.
ENDIF.
IF wa_cwms_in-cwmsname IS INITIAL.
reid = 'E'.
remsg = 'wmsname 不能为空'.
EXIT.
ENDIF.
IF wa_cwms_in-budat IS INITIAL.
reid = 'E'.
remsg = '不能为空'.
EXIT.
ENDIF.
" 更新上传原始日志到日志表
MODIFY itb_cwms_in FROM wa_cwms_in.
clear: p_guid.
call function 'GUID_CREATE'
IMPORTING "EV_GUID_16 = P_GUID.
ev_guid_32 = p_guid."
GW_ZTCWMS017-guid = p_guid.
GW_ZTCWMS017-zebeln = wa_cwms_in-zebeln.
GW_ZTCWMS017-DOCLINENO = wa_cwms_in-DOCLINENO.
GW_ZTCWMS017-iwerks = wa_cwms_in-iwerks.
GW_ZTCWMS017-ilgort = wa_cwms_in-ilgort.
GW_ZTCWMS017-matnr = wa_cwms_in-matnr.
GW_ZTCWMS017-menge = wa_cwms_in-menge.
GW_ZTCWMS017-owerks = wa_cwms_in-owerks.
GW_ZTCWMS017-olgort = wa_cwms_in-olgort.
GW_ZTCWMS017-cwmsname = wa_cwms_in-cwmsname.
GW_ZTCWMS017-budat = wa_cwms_in-budat.
GW_ZTCWMS017-ZCDTE = sy-datum.
GW_ZTCWMS017-ZCIME = sy-uzeit.
append GW_ZTCWMS017 TO GT_ZTCWMS017[].
gw_sum-matnr = wa_cwms_in-matnr.
gw_sum-zebeln = wa_cwms_in-zebeln.
gw_sum-owerks = wa_cwms_in-owerks.
gw_sum-olgort = wa_cwms_in-olgort.
gw_sum-menge = wa_cwms_in-menge.
gw_sum-iwerks = wa_cwms_in-iwerks.
COLLECT gw_sum into gt_sum.
CLEAR:wa_cwms_in, gw_ztcwms017 , gw_sum.
ENDLOOP.
MODIFY ZTCWMS017 FROM TABLE GT_ZTCWMS017[].
COMMIT WORK.
IF reid = 'E'.
EXIT.
ENDIF.
clear: gw_sum.
loop at gt_sum into gw_sum.
add_pre_zero:gw_sum-MATNR.
SELECT COUNT(*) FROM marc
WHERE MATNR = gw_sum-MATNR
and WERKS = gw_sum-IWERKS.
IF sy-subrc <> 0.
REID = 'E'.
REMSG = '失败:物料在工厂下不存在'.
ELSE.
SELECT a~EBELN a~EBELP a~MATNR a~MENGE " 找出这个供应商这种的采购订单
FROM ekpo as a
INNER JOIN ekko as b on a~EBELN = b~EBELN
INTO CORRESPONDING FIELDS OF TABLE gt_EKPO
WHERE a~MATNR = gw_sum-MATNR
and a~WERKS = gw_sum-IWERKS
and a~LOEKZ = space "删除标识 L
and a~ELIKZ <> 'X' "交货完成
and b~FRGKE = 'Y' "审批标识
and b~BSART = 'ZSTO'
and b~LIFNR = '0008800106'. "0008800101
delete_pre_zero:gw_sum-MATNR.
SORT gt_EKPO by EBELN EBELP .
clear:gw_EKPO.
loop at gt_EKPO INTO gw_EKPO. " 找出采购未交货单数
SELECT sum( menge ) INTO gw_EKPO-menge1
FROM EKBE
WHERE EBELN = gw_EKPO-EBELN
and EBELP = gw_EKPO-EBELP
and VGABE = 8 ."交货单
gw_EKPO-menge2 = gw_EKPO-menge - gw_EKPO-menge1.
MODIFY gt_EKPO FROM gw_EKPO.
CLEAR:gw_EKPO.
ENDLOOP.
"采购订单的交货单总数 >= 订单数量。
"只要有交货单了,就不计算可交货数量了。
DELETE gt_EKPO WHERE menge2 <= 0. " 删除货交完了的采购单
"计算可交货的PO总数
" IMP_DATA-menge
CLEAR:lv_sum.
loop at gt_EKPO INTO gw_EKPO. " 计算可交货的总数
lv_sum = gw_EKPO-menge2 + lv_sum.
ENDLOOP.
if gw_sum-menge > lv_sum. "采购凭证数量不足
REID = 'E'.
lv_str = lv_sum.
lv_str1 = gw_sum-menge.
CONCATENATE '失败:SAP采购订单数量不足:' lv_str '小于' lv_str1
INTO REMSG.
ZEBELN = gw_sum-ZEBELN.
ELSE.
REID = 'S'.
REMSG = '成功:采购订单读取成功'.
ZEBELN = gw_sum-ZEBELN.
ENDIF.
CLEAR:lv_sum.
lv_sum = gw_sum-menge. "
SORT gt_EKPO by EBELN EBELP .
CLEAR: gw_EKPO , wa_cwms_in .
loop at gt_EKPO INTO gw_EKPO. "这里就每一行与传输数量相比.
READ TABLE itb_cwms_in INTO wa_cwms_in WITH KEY matnr = gw_ekpo-matnr .
IF lv_sum >= gw_EKPO-menge2.
gw_ekpo1-EBELN = gw_EKPO-EBELN.
gw_ekpo1-EBELP = gw_EKPO-EBELP.
gw_ekpo1-MENGE = gw_EKPO-menge2.
gw_ekpo1-matnr = gw_ekpo-matnr.
gw_ekpo1-owerks = wa_cwms_in-OWERKS.
gw_ekpo1-iwerks = wa_cwms_in-iWERKS.
gw_ekpo1-ilgort = wa_cwms_in-ilgort.
gw_ekpo1-olgort = wa_cwms_in-olgort.
APPEND gw_ekpo1 to gt_ekpo1 .
ELSE.
gw_ekpo1-EBELN = gw_EKPO-EBELN.
gw_ekpo1-EBELP = gw_EKPO-EBELP.
gw_ekpo1-MENGE = lv_sum."最后点余量
gw_ekpo1-matnr = gw_EKPO-matnr.
gw_ekpo1-owerks = wa_cwms_in-OWERKS.
gw_ekpo1-iwerks = wa_cwms_in-iWERKS.
gw_ekpo1-ilgort = wa_cwms_in-ilgort.
gw_ekpo1-olgort = wa_cwms_in-olgort.
APPEND gw_ekpo1 to gt_ekpo1 .
ENDIF.
lv_sum = lv_sum - gw_EKPO-menge2.
if lv_sum <= 0.
exit.
ENDIF.
CLEAR: gw_EKPO , wa_cwms_in .
ENDLOOP.
ENDIF.
"写日志到 ztcwms016
if REID = 'S'.
clear:p_guid.
call function 'GUID_CREATE'
IMPORTING "EV_GUID_16 = P_GUID.
ev_guid_32 = p_guid."
LOOP at gt_ekpo1 into gw_ekpo1.
READ TABLE itb_cwms_in INTO wa_cwms_in WITH KEY matnr = gw_ekpo1-matnr .
CLEAR: gv_uname.
gv_uname = zcl_aip=>get_uname( ).
gw_ztcwms016-zebeln = wa_cwms_in-zebeln.
GW_ZTCWMS016-guid = p_guid.
GW_ZTCWMS016-ebeln = gw_ekpo1-ebeln.
GW_ZTCWMS016-ebelp = gw_ekpo1-ebelp.
GW_ZTCWMS016-MATNR = gw_ekpo1-MATNR.
GW_ZTCWMS016-CWMSNAME = wa_cwms_in-CWMSNAME.
GW_ZTCWMS016-OWERKS = gw_ekpo1-OWERKS.
GW_ZTCWMS016-IWERKS = gw_ekpo1-IWERKS.
GW_ZTCWMS016-ilgort = gw_ekpo1-ilgort.
GW_ZTCWMS016-olgort = gw_ekpo1-olgort.
GW_ZTCWMS016-MENGE = gw_ekpo1-MENGE.
GW_ZTCWMS016-BZ1 = wa_cwms_in-BZ.
GW_ZTCWMS016-ZCDTE = sy-datum.
GW_ZTCWMS016-ZCIME = sy-uzeit.
GW_ZTCWMS016-ernam = gv_uname.
GW_ZTCWMS016-ernam = gv_uname.
lv_MENGE = lv_MENGE + gw_ekpo1-MENGE. "总数
APPEND gw_ZTCWMS016 to gt_ZTCWMS016.
endloop.
MODIFY ZTCWMS016 FROM TABLE gt_ZTCWMS016[].
COMMIT WORK.
else.
clear:p_guid.
call function 'GUID_CREATE'
IMPORTING "EV_GUID_16 = P_GUID.
ev_guid_32 = p_guid."
LOOP at gt_ekpo1 into gw_ekpo1.
READ TABLE itb_cwms_in INTO wa_cwms_in WITH KEY matnr = gw_ekpo1-matnr .
CLEAR: gv_uname.
gv_uname = zcl_aip=>get_uname( ).
gw_ztcwms016-zebeln = wa_cwms_in-zebeln.
GW_ZTCWMS016-guid = p_guid.
GW_ZTCWMS016-ebeln = gw_ekpo1-ebeln.
GW_ZTCWMS016-ebelp = gw_ekpo1-ebelp.
GW_ZTCWMS016-MATNR = gw_ekpo1-MATNR.
GW_ZTCWMS016-CWMSNAME = wa_cwms_in-CWMSNAME.
GW_ZTCWMS016-OWERKS = gw_ekpo1-OWERKS.
GW_ZTCWMS016-IWERKS = gw_ekpo1-IWERKS.
GW_ZTCWMS016-ilgort = gw_ekpo1-ilgort.
GW_ZTCWMS016-olgort = gw_ekpo1-olgort.
GW_ZTCWMS016-MENGE = gw_ekpo1-MENGE.
GW_ZTCWMS016-BZ1 = remsg.
GW_ZTCWMS016-ZCDTE = sy-datum.
GW_ZTCWMS016-ZCIME = sy-uzeit.
GW_ZTCWMS016-ernam = gv_uname.
GW_ZTCWMS016-ernam = gv_uname.
APPEND gw_ZTCWMS016 to gt_ZTCWMS016.
endloop.
MODIFY ZTCWMS016 FROM TABLE gt_ZTCWMS016[].
COMMIT WORK.
RETURN.
endif.
endloop.
"库存 可用量检查
LOOP at gt_ZTCWMS016 into gw_ZTCWMS016. "按物料汇总数量
gw_ZTCWMS018-EBELN = ''.
gw_ZTCWMS018-EBELP = ''.
gw_ZTCWMS018-matnr = gw_ZTCWMS016-matnr.
gw_ztcwms018-owerks = gw_ztcwms016-owerks.
gw_ztcwms018-olgort = gw_ztcwms016-olgort.
gw_ztcwms018-menge = gw_ztcwms016-menge.
COLLECT gw_ztcwms018 into gt_ztcwms018 .
ENDLOOP.
CLEAR:LV_KYL,gw_ztcwms018.
LOOP at gt_sum into gw_sum .
"可用量检查
READ TABLE gt_ztcwms018 INTO gw_ztcwms018 WITH KEY matnr = gw_sum-matnr .
PERFORM FRM_GET_KYL USING gw_ztcwms018-OWERKS gw_ztcwms018-OLGORT
gw_ztcwms018-MATNR LV_kyl.
IF gw_ztcwms018-MENGE > LV_KYL.
REID = 'E'.
CONCATENATE '物料'gt_ztcwms018-MATNR '库存不足,交货失败' into REMSG.
" 更新日志
CLEAR:gw_ztcwms016.
LOOP at gt_ztcwms016 INTO gw_ztcwms016.
gw_ztcwms016-REID1 = 'E'.
CONCATENATE '物料'gw_ztcwms016-MATNR '库存不足,交货失败' into gw_ztcwms016-REMSG1.
MODIFY gt_ztcwms016 FROM gw_ztcwms016.
CLEAR:gw_ztcwms016.
ENDLOOP.
MODIFY ZTCWMS016 FROM TABLE gt_ztcwms016.
COMMIT WORK.
"程序结束,不再循环。
RETURN.
ENDIF.
CLEAR:LV_KYL.
ENDLOOP .
"第一步:根据采购订单创建交货单
SORT gt_ekpo1 by EBELN EBELP.
LOOP at gt_ekpo1.
SELECT SINGLE meins INTO lv_meins
FROM mara
WHERE matnr = gt_ekpo1-MATNR.
WA_STOCK_TRANS_ITEMS-DLV_QTY = gt_ekpo1-MENGE. "采购订单数量
WA_STOCK_TRANS_ITEMS-REF_DOC = gt_ekpo1-EBELN. "采购凭证号
WA_STOCK_TRANS_ITEMS-REF_ITEM = gt_ekpo1-EBELP. "采购凭证的项目编号
WA_STOCK_TRANS_ITEMS-SALES_UNIT = lv_meins. "销售单位
APPEND WA_STOCK_TRANS_ITEMS TO LT_STOCK_TRANS_ITEMS.
CLEAR:WA_STOCK_TRANS_ITEMS,lv_meins.
ENDLOOP.
"根据采购订单创建交货单
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_STO'
* EXPORTING
* SHIP_POINT =
* DUE_DATE =
* DEBUG_FLG =
IMPORTING
DELIVERY = L_DELIVERY
NUM_DELIVERIES = L_NUM_DELIVERIES
TABLES
STOCK_TRANS_ITEMS = LT_STOCK_TRANS_ITEMS
* SERIAL_NUMBERS =
* EXTENSION_IN =
DELIVERIES = LT_DELIVERIES
CREATED_ITEMS = LT_CREATED_ITEMS
* EXTENSION_OUT =
RETURN = LT_RETURN.
"执行结果判断
CLEAR WA_RETURN.
LOOP AT LT_RETURN INTO WA_RETURN WHERE TYPE = 'E' OR ( TYPE = 'W' AND NUMBER = '030').
EXIT.
ENDLOOP.
IF SY-SUBRC <> 0 AND LINES( LT_STOCK_TRANS_ITEMS ) = LINES( LT_CREATED_ITEMS ) .
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
VBELN = L_DELIVERY."交货单号
CONCATENATE REMSG '交货单DN创建成功->' INTO REMSG.
"更新日志
CLEAR:GW_ZTCWMS016.
LOOP at GT_ZTCWMS016 into gw_ZTCWMS016 .
Gw_ZTCWMS016-VBELN = L_DELIVERY."交货单号
Gw_ZTCWMS016-REID2 = 'S'.
Gw_ZTCWMS016-REMSG2 = '交货单DN创建成功'.
MODIFY GT_ZTCWMS016 from gw_ztcwms016 .
CLEAR:Gw_ZTCWMS016.
ENDLOOP.
MODIFY ZTCWMS016 FROM TABLE GT_ZTCWMS016[].
COMMIT WORK.
"第二步:更新交货单库位
WA_HEADER_DATA-DELIV_NUMB = L_DELIVERY.
WA_HEADER_CONTROL-DELIV_NUMB = L_DELIVERY.
CLEAR:GW_EKPO1.
READ TABLE gt_ekpo1 INTO GW_EKPO1 INDEX 1.
LOOP AT LT_CREATED_ITEMS INTO WA_CREATED_ITEMS.
LT_BAPIOBDLVITEMCHG-DELIV_NUMB = L_DELIVERY.
LT_BAPIOBDLVITEMCHG-DELIV_ITEM = WA_CREATED_ITEMS-DELIV_ITEM. "交货单行项目.
LT_BAPIOBDLVITEMCHG-FACT_UNIT_NOM = 1.
LT_BAPIOBDLVITEMCHG-FACT_UNIT_DENOM = 1.
LT_BAPIOBDLVITEMCHG-MATERIAL = WA_CREATED_ITEMS-MATERIAL.
APPEND LT_BAPIOBDLVITEMCHG.
CLEAR LT_BAPIOBDLVITEMCHG.
LT_BAPIOBDLVITEMCHG_C-DELIV_NUMB = L_DELIVERY.
LT_BAPIOBDLVITEMCHG_C-DELIV_ITEM = WA_CREATED_ITEMS-DELIV_ITEM. "交货项目
APPEND LT_BAPIOBDLVITEMCHG_C.
CLEAR LT_BAPIOBDLVITEMCHG_C.
WA_ITEM_DATA_SPL-DELIV_NUMB = L_DELIVERY. "交货
WA_ITEM_DATA_SPL-DELIV_ITEM = WA_CREATED_ITEMS-DELIV_ITEM. "交货项目
WA_ITEM_DATA_SPL-PICK_DENIAL = 'X'. "拣配拒绝标记
WA_ITEM_DATA_SPL-STGE_LOC = GW_EKPO1-OLGORT."库存地点 都相同
APPEND WA_ITEM_DATA_SPL TO LT_ITEM_DATA_SPL.
ENDLOOP.
"交货单库位更新
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
EXPORTING
HEADER_DATA = WA_HEADER_DATA
HEADER_CONTROL = WA_HEADER_CONTROL
DELIVERY = L_DELIVERY
TABLES
ITEM_DATA = LT_BAPIOBDLVITEMCHG[]
ITEM_CONTROL = LT_BAPIOBDLVITEMCHG_C[]
RETURN = LT_RETURN
ITEM_DATA_SPL = LT_ITEM_DATA_SPL.
READ TABLE LT_RETURN INTO WA_RETURN WITH KEY TYPE = 'E'.
IF SY-SUBRC <> 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
CONCATENATE REMSG 'DN库位更新成功->' INTO REMSG.
"更新日志
CLEAR:GW_ZTCWMS016.
LOOP at GT_ZTCWMS016 INTO GW_ZTCWMS016.
GW_ZTCWMS016-REID3 = 'S'.
GW_ZTCWMS016-REMSG3 = 'DN库位更新成功' .
MODIFY GT_ZTCWMS016 FROM GW_ZTCWMS016 .
CLEAR:GW_ZTCWMS016.
ENDLOOP.
MODIFY ZTCWMS016 FROM TABLE GT_ZTCWMS016[].
COMMIT WORK.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
CONCATENATE REMSG 'DN库位更新失败!' INTO REMSG.
"更新日志
CLEAR:GW_ZTCWMS016.
LOOP at GT_ZTCWMS016 INTO GW_ZTCWMS016.
GW_ZTCWMS016-REID3 = 'E'.
CONCATENATE 'DN库位更新失败:' WA_RETURN-MESSAGE INTO GW_ZTCWMS016-REMSG3.
MODIFY GT_ZTCWMS016 FROM GW_ZTCWMS016.
CLEAR:GW_ZTCWMS016.
ENDLOOP.
MODIFY ZTCWMS016 FROM TABLE GT_ZTCWMS016[].
COMMIT WORK.
"删除交货单
CLEAR:WA_HEADER_DATA,WA_HEADER_CONTROL,LT_BAPIOBDLVITEMCHG[],
LT_BAPIOBDLVITEMCHG_C[],LT_RETURN, LT_ITEM_DATA_SPL.
WA_HEADER_DATA-DELIV_NUMB = L_DELIVERY.
WA_HEADER_CONTROL-DELIV_NUMB = L_DELIVERY.
WA_HEADER_CONTROL-DLV_DEL = 'X' ."删除
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
EXPORTING
HEADER_DATA = WA_HEADER_DATA
HEADER_CONTROL = WA_HEADER_CONTROL
DELIVERY = L_DELIVERY
TABLES
ITEM_DATA = LT_BAPIOBDLVITEMCHG[]
ITEM_CONTROL = LT_BAPIOBDLVITEMCHG_C[]
RETURN = LT_RETURN
ITEM_DATA_SPL = LT_ITEM_DATA_SPL.
READ TABLE LT_RETURN INTO WA_RETURN WITH KEY TYPE = 'E'.
IF SY-SUBRC <> 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
ENDIF.
ENDIF.
ELSE.
"创建交货单出错
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
CONCATENATE REMSG '交货单DN创建失败:' WA_RETURN-MESSAGE INTO REMSG.
"更新日志
CLEAR: GW_ZTCWMS016.
LOOP at GT_ZTCWMS016[] INTO GW_ZTCWMS016.
GW_ZTCWMS016-REID3 = 'E'.
CONCATENATE '交货单DN创建失败:' WA_RETURN-MESSAGE INTO GW_ZTCWMS016-REMSG3.
MODIFY GT_ZTCWMS016 FROM GW_ZTCWMS016.
CLEAR:GW_ZTCWMS016.
ENDLOOP.
MODIFY ZTCWMS016 FROM TABLE GT_ZTCWMS016 .
COMMIT WORK.
EXIT.
ENDIF.
CLEAR:GW_ZTCWMS016.
READ TABLE GT_ZTCWMS016 INTO GW_ZTCWMS016 INDEX 1.
"检查交货单数量
lv_dn = L_DELIVERY.
add_pre_zero:lv_dn.
IF GW_ZTCWMS016-REID2 = 'S' and GW_ZTCWMS016-REID3 = 'S' .
SELECT sum( LFIMG ) into lv_LFIMG
from LIPS
where VBELN = lv_dn.
if lv_menge <> lv_LFIMG.
"删除交货单
CLEAR:WA_HEADER_DATA,WA_HEADER_CONTROL,LT_BAPIOBDLVITEMCHG[],
LT_BAPIOBDLVITEMCHG_C[],LT_RETURN, LT_ITEM_DATA_SPL.
WA_HEADER_DATA-DELIV_NUMB = L_DELIVERY.
WA_HEADER_CONTROL-DELIV_NUMB = L_DELIVERY.
WA_HEADER_CONTROL-DLV_DEL = 'X' ."删除
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
EXPORTING
HEADER_DATA = WA_HEADER_DATA
HEADER_CONTROL = WA_HEADER_CONTROL
DELIVERY = L_DELIVERY
TABLES
ITEM_DATA = LT_BAPIOBDLVITEMCHG[]
ITEM_CONTROL = LT_BAPIOBDLVITEMCHG_C[]
RETURN = LT_RETURN
ITEM_DATA_SPL = LT_ITEM_DATA_SPL.
READ TABLE LT_RETURN INTO WA_RETURN WITH KEY TYPE = 'E'.
IF SY-SUBRC <> 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
ENDIF.
"更新日志
CLEAR:GW_ZTCWMS016.
LOOP at GT_ZTCWMS016 INTO GW_ZTCWMS016.
GW_ZTCWMS016-REID4 = 'E'.
CONCATENATE REMSG 'SAP创建的交货单数量不正确' INTO GW_ZTCWMS016-REMSG4.
MODIFY GT_ZTCWMS016 FROM GW_ZTCWMS016.
CLEAR:GW_ZTCWMS016.
ENDLOOP.
MODIFY ZTCWMS016 FROM TABLE GT_ZTCWMS016[].
COMMIT WORK.
REID = 'E'.
REMSG = 'SAP创建的交货单数量不正确,需重传'.
endif.
endif.
CLEAR:GW_ZTCWMS016.
READ TABLE GT_ZTCWMS016 INTO GW_ZTCWMS016 INDEX 1.
IF GW_ZTCWMS016-REID1 = 'E' or GW_ZTCWMS018-REID2 = 'E'.
EXIT.
ENDIF.
"第三步:交货单交货过账产生物料凭证
WA_VBKOK-WADAT_IST = SY-DATUM."过账日期
WA_VBKOK-VBELN_VL = L_DELIVERY. "交货单
WA_VBKOK-WABUC = 'X'. "自动过帐货物移动
CALL FUNCTION 'WS_DELIVERY_UPDATE'
EXPORTING
VBKOK_WA = WA_VBKOK
DELIVERY = L_DELIVERY
UPDATE_PICKING = 'X'
IF_DATABASE_UPDATE = '1' "COMMIT = 'X' 异步更新
IF_ERROR_MESSAGES_SEND_0 = 'X'
IMPORTING
EF_ERROR_ANY_0 = L_EF_ERROR_ANY_0
TABLES
PROT = LT_PROT
EXCEPTIONS
ERROR_MESSAGE = 1
OTHERS = 2.
"结果判断
IF SY-SUBRC = 0 AND LT_PROT[] IS INITIAL.
COMMIT WORK AND WAIT.
SELECT SINGLE MAX( VBELN )
INTO GW_ZTCWMS016-VBELN1 "过账凭证
FROM VBFA
WHERE VBELV = WA_VBKOK-VBELN_VL "交货单
AND VBTYP_N = 'R'
AND PLMIN = '+'.
MBLNR = GW_ZTCWMS016-VBELN1.
CONCATENATE REMSG 'DN发货成功。' INTO REMSG.
"更新日志
CLEAR: GW_ZTCWMS016.
LOOP at GT_ZTCWMS016 INTO GW_ZTCWMS016.
GW_ZTCWMS016-REID5 = 'S'.
GW_ZTCWMS016-REMSG5 = 'DN发货成功' .
GW_ZTCWMS016-MBLNR = MBLNR.
MODIFY GT_ZTCWMS016 FROM GW_ZTCWMS016.
CLEAR:GW_ZTCWMS016.
ENDLOOP.
MODIFY ZTCWMS016 FROM TABLE GT_ZTCWMS016[].
COMMIT WORK.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
CONCATENATE REMSG 'DN发货失败!' INTO REMSG.
"更新日志
CLEAR: GW_ZTCWMS016.
LOOP at GT_ZTCWMS016 INTO GW_ZTCWMS016.
GW_ZTCWMS016-REID5 = 'E'.
GW_ZTCWMS016-REMSG5 = 'DN发货失败' .
MODIFY GT_ZTCWMS016 FROM GW_ZTCWMS016.
CLEAR:GW_ZTCWMS016.
ENDLOOP.
MODIFY ZTCWMS016 FROM TABLE GT_ZTCWMS016.
COMMIT WORK.
"删除交货单
CLEAR:WA_HEADER_DATA,WA_HEADER_CONTROL,LT_BAPIOBDLVITEMCHG[],
LT_BAPIOBDLVITEMCHG_C[],LT_RETURN, LT_ITEM_DATA_SPL.
WA_HEADER_DATA-DELIV_NUMB = L_DELIVERY.
WA_HEADER_CONTROL-DELIV_NUMB = L_DELIVERY.
WA_HEADER_CONTROL-DLV_DEL = 'X' ."删除
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
EXPORTING
HEADER_DATA = WA_HEADER_DATA
HEADER_CONTROL = WA_HEADER_CONTROL
DELIVERY = L_DELIVERY
TABLES
ITEM_DATA = LT_BAPIOBDLVITEMCHG[]
ITEM_CONTROL = LT_BAPIOBDLVITEMCHG_C[]
RETURN = LT_RETURN
ITEM_DATA_SPL = LT_ITEM_DATA_SPL.
READ TABLE LT_RETURN INTO WA_RETURN WITH KEY TYPE = 'E'.
IF SY-SUBRC <> 0.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
ENDIF.
EXIT.
ENDIF.
CLEAR:GW_ZTCWMS016.
READ TABLE GT_ZTCWMS016 INTO GW_ZTCWMS016 INDEX 1.
IF GW_ZTCWMS016-REID3 = 'E'.
EXIT.
ENDIF.
"
"返回消息:产生交货号,更新库位,交货过账三个步骤都成功才返回成功。
CLEAR:GW_ZTCWMS016.
READ TABLE GT_ZTCWMS016 INTO GW_ZTCWMS016 INDEX 1.
if GW_ZTCWMS016-REID2 = 'S' and GW_ZTCWMS016-REID3 = 'S'
and GW_ZTCWMS016-REID5 = 'S'.
REID = 'S'.
ENDIF.
ENDFUNCTION.