交货单过账详解编程语言

CTS

FUNCTION Z_SD_DN_PGI1. 
*"---------------------------------------------------------------------- 
*"*"Local Interface: 
*"  IMPORTING 
*"     REFERENCE(I_VBELN) TYPE  VBELN 
*"     REFERENCE(I_BUDAT) TYPE  BUDAT DEFAULT SY-DATUM 
*"  EXPORTING 
*"     REFERENCE(E_MBLNR) TYPE  MBLNR 
*"  TABLES 
*"      T_DATA STRUCTURE  ZSDS0015 
*"      IT_RETURN STRUCTURE  BAPIRET2 OPTIONAL 
*"---------------------------------------------------------------------- 
DATA : LS_DATA LIKE LINE OF  T_DATA, 
LT_DATA LIKE TABLE OF ZSDS0015. 
DATA: LV_VBELN LIKE LIKP-VBELN, 
LW_VBKOK LIKE VBKOK, 
IT_PROTT LIKE PROTT OCCURS 0 WITH HEADER LINE,  "Return Message 
IT_VBPOK LIKE VBPOK OCCURS 0 WITH HEADER LINE.  "Delivery items 
DATA : LV_PGI, 
LV_VBTYP_N TYPE VBFA-VBTYP_N, 
LV_COUNT   TYPE I. 
REFRESH IT_RETURN. 
* 检查交货单是否已经过账 
SELECT  VBELN VBTYP_N INTO (E_MBLNR,LV_VBTYP_N) 
FROM VBFA 
WHERE VBELV = I_VBELN 
AND POSNV = 10 
AND VBTYP_N IN ('R','h').  "货物移动 
ENDSELECT. 
IF SY-SUBRC EQ 0 AND LV_VBTYP_N EQ 'R'."交货 h 取消交货 
EXIT. 
ENDIF. 
LW_VBKOK-VBELN_VL   = I_VBELN.   "<- Delivery number 
LW_VBKOK-WABUC      = 'X'.       "<- Automatic PGI 
LW_VBKOK-WADAT_IST  = I_BUDAT. "<- Automatic PGI Date 
 
LT_DATA[] = T_DATA[]. 
LOOP AT LT_DATA INTO LS_DATA. 
CLEAR IT_VBPOK. 
IT_VBPOK-VBELN_VL = I_VBELN. 
IT_VBPOK-POSNR_VL = LS_DATA-POSNR. 
IT_VBPOK-VBELN    = I_VBELN. 
IT_VBPOK-POSNN    = LS_DATA-POSNR. 
IT_VBPOK-CHARG    = LS_DATA-CHARG. "批次 
IT_VBPOK-LGORT    = LS_DATA-LGORT. "库存地点 
IT_VBPOK-KZLGO    = 'X'.           "库存地点可修改 
IT_VBPOK-PIKMG    = LS_DATA-PIKMG. "捡配数量 
IT_VBPOK-LFIMG    = LS_DATA-LFIMG. "交货数量 
APPEND IT_VBPOK. 
ENDLOOP. 
PERFORM FRM_LOCK_DELIVERY(ZSDS0002) USING I_VBELN. 
* DO PGI 
LV_PGI = 'X'. 
FREE MEMORY ID 'PGI'. 
EXPORT LV_PGI TO MEMORY ID 'PGI'. 
FREE MEMORY ID 'PGI_DATA'. 
EXPORT LT_DATA FROM LT_DATA TO MEMORY ID 'PGI_DATA'. 
* Perform Pick and PGI 
CALL FUNCTION 'WS_DELIVERY_UPDATE' 
EXPORTING 
VBKOK_WA                 = LW_VBKOK 
SYNCHRON                 = 'X' 
UPDATE_PICKING           = 'X' 
COMMIT                   = ' ' 
DELIVERY                 = I_VBELN 
NICHT_SPERREN            = 'X' 
IF_ERROR_MESSAGES_SEND_0 = 'X' 
TABLES 
PROT                     = IT_PROTT 
VBPOK_TAB                = IT_VBPOK 
EXCEPTIONS 
ERROR_MESSAGE            = 1 
OTHERS                   = 2. 
IF SY-SUBRC <> 0. 
ROLLBACK WORK. 
ELSE. 
LOOP AT IT_PROTT WHERE MSGTY EQ 'E' OR MSGTY EQ 'A' OR MSGTY EQ 'X'. 
EXIT. 
ENDLOOP. 
IF SY-SUBRC NE 0. 
COMMIT WORK AND WAIT. 
SELECT COUNT(*) INTO LV_COUNT 
FROM LIPS 
WHERE VBELN = I_VBELN 
AND LFIMG NE 0. 
IF LV_COUNT NE LINES( LT_DATA ). 
PERFORM FRM_REVERSE_POSTING(ZSDS0002) TABLES IT_RETURN USING I_VBELN I_BUDAT. 
MAC_APPEND_IT_RETURN: '00' '000' 'E' '实际交货数量与请求交货数量不一致,停止交货' 
'实际交货数量与请求交货数量不一致' 
',停止交货' 
I_VBELN 
''. 
EXIT. 
ENDIF. 
SELECT MBLNR 
INTO E_MBLNR 
FROM MKPF 
WHERE LE_VBELN = I_VBELN 
AND BUDAT = I_BUDAT. 
ENDSELECT. 
ELSE. 
ROLLBACK WORK. 
ENDIF. 
ENDIF. 
LOOP AT IT_PROTT. 
CLEAR GS_RETURN. 
MOVE : IT_PROTT-MSGTY TO GS_RETURN-TYPE, 
IT_PROTT-MSGID TO GS_RETURN-ID, 
IT_PROTT-MSGNO TO GS_RETURN-NUMBER, 
IT_PROTT-MSGV1 TO GS_RETURN-MESSAGE_V1, 
IT_PROTT-MSGV2 TO GS_RETURN-MESSAGE_V2, 
IT_PROTT-MSGV3 TO GS_RETURN-MESSAGE_V3, 
IT_PROTT-MSGV4 TO GS_RETURN-MESSAGE_V4. 
MESSAGE ID IT_PROTT-MSGID TYPE IT_PROTT-MSGTY NUMBER IT_PROTT-MSGNO 
WITH IT_PROTT-MSGV1 IT_PROTT-MSGV2 IT_PROTT-MSGV3 IT_PROTT-MSGV4 
INTO GS_RETURN-MESSAGE. 
APPEND GS_RETURN TO IT_RETURN. 
ENDLOOP. 
ENDFUNCTION.
FORM frm_lock_delivery  USING    p_delivery. 
DATA : lv_time TYPE p DECIMALS 2 VALUE '0.50'. 
CHECK p_delivery IS NOT INITIAL. 
DO 50 TIMES. 
CALL FUNCTION 'ENQUEUE_EVVBLKE' 
EXPORTING 
vbeln          = p_delivery 
EXCEPTIONS 
foreign_lock   = 1 
system_failure = 2 
OTHERS         = 3. 
IF sy-subrc <> 0. 
* Implement suitable error handling here 
ENDIF. 
IF sy-subrc EQ 0. 
CALL FUNCTION 'DEQUEUE_EVVBLKE' 
EXPORTING 
mode_likp = 'E' 
mandt     = sy-mandt 
vbeln     = p_delivery 
x_vbeln   = ' ' 
_scope    = '3' 
_synchron = ' ' 
_collect  = ' '. 
WAIT UP TO lv_time SECONDS. 
EXIT. 
ELSE. 
WAIT UP TO lv_time SECONDS. 
ENDIF. 
ENDDO. 
ENDFORM.                    " FRM_LOCK_DELIVERY
FORM frm_reverse_posting TABLES it_return USING p_vbeln p_budat. 
DATA:   BEGIN OF lt_mesg OCCURS 0. 
INCLUDE STRUCTURE mesg. 
DATA:   END OF lt_mesg. 
DATA :  lv_vbeln TYPE likp-vbeln, 
lv_budat TYPE sy-datlo. 
lv_vbeln = p_vbeln. 
lv_budat = p_budat. 
PERFORM frm_lock_delivery(zsds0002) USING p_vbeln. 
DO 10 TIMES. 
CALL FUNCTION 'WS_REVERSE_GOODS_ISSUE' 
EXPORTING 
i_vbeln                   = lv_vbeln 
i_budat                   = lv_budat 
i_tcode                   = 'VL09' 
i_vbtyp                   = 'J' 
TABLES 
t_mesg                    = lt_mesg 
EXCEPTIONS 
error_reverse_goods_issue = 1 
OTHERS                    = 2. 
IF sy-subrc =  0. 
*   删除交货单 
COMMIT WORK. 
PERFORM  frm_delete_delivery_note TABLES it_return USING p_vbeln. 
EXIT. 
ENDIF. 
WAIT UP TO 1 SECONDS. 
ENDDO. 
ENDFORM.                    " FRM_REVERSE_POSTING
FORM frm_delete_delivery_note TABLES it_return STRUCTURE bapiret2 
USING p_vbeln. 
DATA : lv_delivery TYPE likp-vbeln. 
CHECK p_vbeln IS NOT INITIAL. 
lv_delivery = p_vbeln. 
PERFORM frm_lock_delivery(zsds0002) USING lv_delivery. 
REFRESH bdcdata. 
* Go to VL02N 
* Init Screen and input DN number 
PERFORM bdc_dynpro      USING 'SAPMV50A' '4004'. 
PERFORM bdc_field       USING 'BDC_CURSOR' 
'LIKP-VBELN'. 
PERFORM bdc_field       USING 'BDC_OKCODE' 
'/00'. 
PERFORM bdc_field       USING 'LIKP-VBELN' 
lv_delivery. 
*  Delete DN 
PERFORM bdc_dynpro      USING 'SAPMV50A' '1000'. 
PERFORM bdc_field       USING 'BDC_OKCODE' 
'/ELOES_T'. 
PERFORM bdc_transaction TABLES it_return USING 'VL02N'. 
ENDFORM.

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/18706.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论