2. 程序说明
2.1 程序说明
1. 增强实现VL01N创建交货单时, 按装运点的工厂来匹配订单行项目
2. VL01N创建交货单时, 自动更改订单行拒绝原因Z3为空值, 交货单保存后, 如果订单未完全交货, 则继续Z3冻结订单行.
2.2 程序实现
(1) 实现VL01N创建交货单时, 按装运点的工厂来匹配订单行项目:
装运点的工厂与订单行项目工厂一致的均可以创建交货单
程序FV50B101 行129, 修正程序:
DATA ZZ_WERKS TYPE WERKS_D.
SELECT SINGLE WERKS
INTO ZZ_WERKS
FROM TVSWZ
WHERE VSTEL = LIKP-VSTEL.
IF ZZ_WERKS NE CVBAP-WERKS.
PERFORM MESSAGE_HANDLING_VARIABEL(SAPMV50A)
USING CVBAP-POSNR
'037'
'I'
'VL'
CVBAP-POSNR
SPACE
SPACE
SPACE
GS_MHPAR
V50AGL-MSGVS
CHANGING LV_MSGTY
LV_RCODE.
BP_SUBRC = 4.
CHECK 1 = 2.
ENDIF.
(2) VL01N创建交货单时, 自动更改订单行拒绝原因Z3为空值, 交货单保存后, 如果订单未完全交货, 则继续Z3冻结订单行.
首先取得订单中拒绝原因为Z3的行项目, 调用BAPI全部更新为空值,
更新成功后, 将日志数据记录到表ZTSOU, 同时打开异步作业Z_UPDATE_SO, 等待订单解锁后, 判断日志表中相关记录是否全部交货完成, 对未交货完成的订单行, 拒绝原因重新更新为Z3, 同时更新日志表状态.
程序MV50AF0A 子程序auftrag_referieren实施增强Z_UPDATE_SO
CHECK GC_TRTYP = 'HVA' AND SY-TCODE = 'VL01N'.
DATA ZT_VBAP TYPE TABLE OF VBAP.
DATA LS_VBAP TYPE VBAP.
SELECT *
INTO TABLE ZT_VBAP
FROM VBAP
WHERE VBELN = LV50C-VBELN.
DATA ZZ_WERKS TYPE WERKS_D.
DATA L_LFSTA TYPE VBUP-LFSTA.
DATA L_ZECLH TYPE ZECLH.
DATA LT_SOU TYPE TABLE OF ZTSOU.
DATA LS_SOU TYPE ZTSOU.
DATA: HEADX TYPE BAPISDH1X,
LS_RETURN TYPE BAPIRET2,
RETURN TYPE TABLE OF BAPIRET2,
COND TYPE TABLE OF BAPICOND,
CONDX TYPE TABLE OF BAPICONDX,
ITEM TYPE TABLE OF BAPISDITM,
ITEMX TYPE TABLE OF BAPISDITMX,
LS_ITEM TYPE BAPISDITM,
LS_ITEMX TYPE BAPISDITMX.
SELECT SINGLE WERKS
INTO ZZ_WERKS
FROM TVSWZ
WHERE VSTEL = LIKP-VSTEL.
LOOP AT ZT_VBAP INTO LS_VBAP WHERE WERKS = ZZ_WERKS.
CLEAR L_LFSTA.
SELECT SINGLE LFSTA
INTO L_LFSTA
FROM VBUP
WHERE VBELN = LS_VBAP-VBELN
AND POSNR = LS_VBAP-POSNR.
IF L_LFSTA NE 'C' AND LS_VBAP-ABGRU = 'Z3'.
LS_ITEM-ITM_NUMBER = LS_VBAP-POSNR.
LS_ITEM-REASON_REJ = ''.
APPEND LS_ITEM TO ITEM.
LS_ITEMX-ITM_NUMBER = LS_VBAP-POSNR.
LS_ITEMX-UPDATEFLAG = 'U'.
LS_ITEMX-REASON_REJ = 'X'.
APPEND LS_ITEMX TO ITEMX.
ENDIF.
ENDLOOP.
IF ITEM[] IS NOT INITIAL.
HEADX-UPDATEFLAG = 'U'.
CALL FUNCTION 'BAPI_SALESORDER_CHANGE'
EXPORTING
SALESDOCUMENT = LV50C-VBELN
ORDER_HEADER_INX = HEADX
SIMULATION = ''
TABLES
RETURN = RETURN
ORDER_ITEM_IN = ITEM
ORDER_ITEM_INX = ITEMX.
READ TABLE RETURN INTO LS_RETURN WITH KEY TYPE = 'E'.
IF SY-SUBRC NE 0.
CALL FUNCTION 'NUMBER_RANGE_ENQUEUE'
EXPORTING
OBJECT = 'ZECLH'
EXCEPTIONS
FOREIGN_LOCK = 1
OBJECT_NOT_FOUND = 2
SYSTEM_FAILURE = 3
OTHERS = 4.
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
NR_RANGE_NR = '01'
OBJECT = 'ZECLH'
* QUANTITY = '1'
* TOYEAR = '0000'
IGNORE_BUFFER = 'X'
IMPORTING
NUMBER = L_ZECLH
* QUANTITY =
* RETURNCODE =
EXCEPTIONS
INTERVAL_NOT_FOUND = 1
NUMBER_RANGE_NOT_INTERN = 2
OBJECT_NOT_FOUND = 3
QUANTITY_IS_0 = 4
QUANTITY_IS_NOT_1 = 5
INTERVAL_OVERFLOW = 6
BUFFER_OVERFLOW = 7
OTHERS = 8.
CALL FUNCTION 'NUMBER_RANGE_DEQUEUE'
EXPORTING
OBJECT = 'ZECLH'
EXCEPTIONS
OBJECT_NOT_FOUND = 1
OTHERS = 2.
LOOP AT ITEM INTO LS_ITEM.
LS_SOU-ZECLH = L_ZECLH.
LS_SOU-VBELN = LV50C-VBELN.
LS_SOU-POSNR = LS_ITEM-ITM_NUMBER.
LS_SOU-ABGRU = ''.
LS_SOU-ERNAM = SY-UNAME.
LS_SOU-ERDAT = SY-DATUM.
LS_SOU-ERZET = SY-UZEIT.
APPEND LS_SOU TO LT_SOU.
ENDLOOP.
MODIFY ZTSOU FROM TABLE LT_SOU.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
CALL FUNCTION 'Z_UPDATE_SO' STARTING NEW TASK 'ZZUSO'
EXPORTING
ZECLH = L_ZECLH.
ENDIF.
ENDIF.