



FUNCTION ZRFC_DNORDER_AUTO_CERATE.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(DELIV_NUMB) TYPE VBELN_VL
*" EXPORTING
*" VALUE(E_CODE) TYPE CHAR1
*" VALUE(E_MSG) TYPE STRING
*" VALUE(E_VBELN_NEW) TYPE VBELN_VL
*" TABLES
*" IN_TABLE STRUCTURE ZWMS009
*"----------------------------------------------------------------------
DATA: LV_VBELN_N TYPE LIKP-VBELN,
LV_REMAINING_WEIGHT TYPE LIPS-BRGEW,
LV_UNIT_WEIGHT TYPE LIPS-BRGEW,
LV_UNIT TYPE I,
LV_NUMKI TYPE TVLK-NUMKI,
LS_LIKP TYPE LIKP,
LS_ITEMDATA TYPE BAPIOBDLVITEMDSP,
LT_ITEMDATA TYPE STANDARD TABLE OF BAPIOBDLVITEMDSP,
LT_RETURN TYPE STANDARD TABLE OF BAPIRET2.
*--------------------
*第一部分 数据比较
*--------------------
SELECT * FROM LIPS WHERE VBELN EQ @DELIV_NUMB ORDER BY VBELN,POSNR INTO TABLE @DATA(LT_LIPS).
LOOP AT IN_TABLE WHERE DELIV_NUMB EQ DELIV_NUMB AND ORDER_REQ_QTY IS NOT INITIAL.
* 转换为内部单位
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
INPUT = IN_TABLE-ORDER_UNIT
* LANGUAGE = SY-LANGU
IMPORTING
OUTPUT = IN_TABLE-ORDER_UNIT
* EXCEPTIONS
* UNIT_NOT_FOUND = 1
* OTHERS = 2
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
* 数量比较
READ TABLE LT_LIPS INTO DATA(LS_LIPS) WITH KEY VBELN = IN_TABLE-DELIV_NUMB
POSNR = IN_TABLE-ITEMNO.
CHECK SY-SUBRC EQ 0.
* 单位转换(转换为销售单位)
IF IN_TABLE-ORDER_UNIT NE LS_LIPS-MEINS.
CALL FUNCTION 'MD_CONVERT_MATERIAL_UNIT'
EXPORTING
I_MATNR = LS_LIPS-MATNR
I_IN_ME = IN_TABLE-ORDER_UNIT ""传入单位
I_OUT_ME = LS_LIPS-VRKME
I_MENGE = IN_TABLE-ORDER_REQ_QTY
IMPORTING
E_MENGE = IN_TABLE-ORDER_REQ_QTY
EXCEPTIONS
ERROR_IN_APPLICATION = 1
ERROR = 2
OTHERS = 3.
ENDIF.
* 校验数量
CHECK IN_TABLE-ORDER_REQ_QTY LT LS_LIPS-LFIMG.
* 修改旧交货单的数据
LS_ITEMDATA-DELIV_NUMB = LS_LIPS-VBELN.
LS_ITEMDATA-DELIV_ITEM = LS_LIPS-POSNR.
LS_ITEMDATA-CURR_QTY = 'A'.
LS_ITEMDATA-SALES_UNIT = LS_LIPS-VRKME.
CALL FUNCTION 'UNIT_OF_MEASURE_SAP_TO_ISO'
EXPORTING
SAP_CODE = LS_ITEMDATA-SALES_UNIT
IMPORTING
ISO_CODE = LS_ITEMDATA-ISOCODE_SALES_UNIT
EXCEPTIONS
NOT_FOUND = 1
NO_ISO_CODE = 2
OTHERS = 3.
IF SY-SUBRC <> 0.
CLEAR LS_ITEMDATA-ISOCODE_SALES_UNIT.
ENDIF.
LS_ITEMDATA-SALES_QTY_NUM = LS_LIPS-UMVKZ.
LS_ITEMDATA-SALES_QTY_DENOM = LS_LIPS-UMVKN.
LS_ITEMDATA-DLV_QTY = IN_TABLE-ORDER_REQ_QTY.
LS_ITEMDATA-DEL_QTY_FLO = IN_TABLE-ORDER_REQ_QTY.
APPEND LS_ITEMDATA TO LT_ITEMDATA.
CLEAR LS_ITEMDATA.
ENDLOOP.
*--------------------
*第二部分 检查状态,避免跳号
*--------------------
IF LT_ITEMDATA[] IS NOT INITIAL.
*检查需要修改的交货单是否锁定
DATA:LT_ENQ TYPE TABLE OF SEQG7,
LS_ENQ TYPE SEQG7,
LV_GARG TYPE EQEGRAARG,
LV_MESSAGE TYPE SM04DIC-POPUPMSG.
CALL FUNCTION 'ENQUE_READ2'
EXPORTING
GNAME = 'LIKP'
TABLES
ENQ = LT_ENQ.
IF LT_ENQ[] IS NOT INITIAL.
LV_GARG = SY-MANDT && DELIV_NUMB.
READ TABLE LT_ENQ INTO LS_ENQ WITH KEY GARG = LV_GARG.
IF SY-SUBRC EQ 0.
SELECT SINGLE TECHDESC FROM USR21
WHERE BNAME EQ @LS_ENQ-GUNAME INTO @DATA(LV_TECHDESC).
E_CODE = 'E'.
E_MSG = '拆分失败!' && DELIV_NUMB && '被'
&& LV_TECHDESC && '(' && LS_ENQ-GUNAME && ')锁定!' .
LV_MESSAGE = '物流人员在发货,请退出交货单' && DELIV_NUMB && '修改状态。'.
* 给操作者发送消息
CALL FUNCTION 'TH_POPUP'
EXPORTING
CLIENT = SY-MANDT
USER = LS_ENQ-GUNAME
MESSAGE = LV_MESSAGE.
RETURN.
ENDIF.
ENDIF.
*校验交货单对应的销售订单是否锁定
SELECT DISTINCT VGBEL FROM LIPS WHERE VBELN EQ @DELIV_NUMB
ORDER BY VGBEL INTO TABLE @DATA(LT_VGBEL).
IF SY-SUBRC EQ 0.
LOOP AT LT_VGBEL INTO DATA(LS_VGBEL).
CLEAR:LT_ENQ[],LV_GARG.
CALL FUNCTION 'ENQUE_READ2'
EXPORTING
GNAME = 'VBAK'
TABLES
ENQ = LT_ENQ.
DELETE LT_ENQ WHERE GMODE NE 'E'.
CHECK LT_ENQ[] IS NOT INITIAL.
LV_GARG = SY-MANDT && LS_VGBEL-VGBEL.
READ TABLE LT_ENQ INTO LS_ENQ WITH KEY GARG = LV_GARG.
IF SY-SUBRC EQ 0.
SELECT SINGLE TECHDESC FROM USR21
WHERE BNAME EQ @LS_ENQ-GUNAME INTO @DATA(WA_TECHDESC).
E_CODE = 'E'.
E_MSG = '拆分失败!' && LS_VGBEL-VGBEL && '被'
&& WA_TECHDESC && '(' && LS_ENQ-GUNAME && ')锁定!' .
LV_MESSAGE = '物流人员在发货,请退出销售订单' && LS_VGBEL-VGBEL && '修改状态。'.
* 给操作者发送消息
CALL FUNCTION 'TH_POPUP'
EXPORTING
CLIENT = SY-MANDT
USER = LS_ENQ-GUNAME
MESSAGE = LV_MESSAGE.
RETURN.
ENDIF.
ENDLOOP.
ENDIF.
*--------------------
*第三部分 获取新单号
*--------------------
SELECT SINGLE LFART FROM LIKP WHERE VBELN EQ @DELIV_NUMB INTO @DATA(LV_LFART).
SELECT SINGLE NUMKI INTO @LV_NUMKI FROM TVLK WHERE LFART EQ @LV_LFART.
IF SY-SUBRC = 0.
CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
NR_RANGE_NR = LV_NUMKI
OBJECT = 'RV_BELEG'
IMPORTING
NUMBER = LV_VBELN_N
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
OTHERS = 99.
IF SY-SUBRC NE 0.
E_CODE = 'E'.
E_MSG = '拆分失败!'.
E_MSG = E_MSG && SY-MSGID && SY-MSGNO && SY-MSGV1 && SY-MSGV2 && SY-MSGV3 && SY-MSGV4.
ENDIF.
*--------------------
*第死部分 开始拆单
*--------------------
CALL FUNCTION 'BAPI_OUTB_DELIVERY_SPLIT_DEC'
EXPORTING
DELIVERY = DELIV_NUMB
DELIVERYNEW = LV_VBELN_N
DELIVERYITEMSBELONGTO = 'O'
BUSINESSPROCESS = '0001'
TABLES
ITEMDATA = LT_ITEMDATA
RETURN = LT_RETURN.
BREAK LUOLIN.
IF LINE_EXISTS( LT_RETURN[ TYPE = 'E' ] ) .
E_CODE = 'E'.
E_MSG = '拆分失败!'.
LOOP AT LT_RETURN INTO DATA(LS_RETURN).
DATA LV_MSG TYPE STRING.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
MSGID = LS_RETURN-ID
MSGNR = LS_RETURN-NUMBER
MSGV1 = LS_RETURN-MESSAGE_V1
MSGV2 = LS_RETURN-MESSAGE_V2
MSGV3 = LS_RETURN-MESSAGE_V3
MSGV4 = LS_RETURN-MESSAGE_V4
IMPORTING
MESSAGE_TEXT_OUTPUT = LV_MSG.
IF SY-SUBRC EQ 0.
CONDENSE LV_MSG NO-GAPS.
E_MSG = E_MSG && LV_MSG.
ENDIF.
ENDLOOP.
ELSE.
E_CODE = 'S'.
E_MSG = '拆分成功!'.
E_VBELN_NEW = LV_VBELN_N.
ENDIF.
ENDIF.
ENDIF.
ENDFUNCTION.
网友评论