利用bapi BAPI_OUTB_DELIVERY_CHANGE 修改交货单行项目中的数量和序列号
来源:互联网 发布:大数据时代与信息安全 编辑:程序博客网 时间:2024/06/14 21:44
某项目中,根据客户需求,在VL02N发货过账之前,需要先更改发货单行项目的数量和序列号,下面程序一是VL02N发货过账并更改拣配数量的函数,程序二是程序一的FUNCTION-POOL ,里面有定义的全局变量以及更改发货单行项目数量和序列号的子程序,希望对用到的兄弟有帮助。
程序一:
FUNCTION ZWMS_VL02N.
*"----------------------------------------------------------------------
*"*"Local interface:
*" TABLES
*" INPUT STRUCTURE ZWMS_VL02N_INPUT OPTIONAL
*" INPUT_SN STRUCTURE ZWMS_VL02N_INPUT_SN OPTIONAL
*" INPUT_QN STRUCTURE ZWMS_INPUT_QN OPTIONAL
*" OUTPUT STRUCTURE ZWMS_VL02N_OUTPUT OPTIONAL
*"----------------------------------------------------------------------
DATA:I_VBKOK TYPE VBKOK.
DATA:BEGIN OF I_VBPOK_TAB OCCURS 12.
INCLUDE STRUCTURE VBPOK.
DATA:END OF I_VBPOK_TAB.
DATA:I_EF_ERROR_ANY_0 TYPE XFELD.
DATA:P_FLAG(1),
P_MESSAGE(200).
DATA:G_LIKP LIKE LIKP.
DATA:G_LIPS LIKE LIPS.
DATA GV_14(14) TYPE C.
DATA:P_VBELN LIKE LIKP-VBELN.
DATA:I_PROTT TYPE PROTT OCCURS 0 WITH HEADER LINE .
FREE MEMORY ID 'INPUT'.
EXPORT INPUT TO MEMORY ID 'INPUT'.
FREE MEMORY ID 'INPUT_SN'.
EXPORT INPUT_SN TO MEMORY ID 'INPUT_SN'.
CLEAR P_FLAG.CLEAR P_MESSAGE.
PERFORM FRM_CHANGE_DELIVERY CHANGING P_FLAG
P_MESSAGE.
IF P_FLAG = 'E'.
REFRESH OUTPUT.
CLEAR OUTPUT.
OUTPUT-FLAG = 'E'.
OUTPUT-NOTES = P_MESSAGE.
APPEND OUTPUT.
CLEAR OUTPUT.
ELSE.
CLEAR P_VBELN.
CLEAR INPUT.
READ TABLE INPUT INDEX 1.
IF SY-SUBRC EQ 0.
P_VBELN = INPUT-VBELN.
ENDIF.
CLEAR I_VBKOK.
CLEAR I_EF_ERROR_ANY_0.
MOVE-CORRESPONDING INPUT TO OUTPUT.
* ---交货抬头数据
I_VBKOK-VBELN_VL = P_VBELN. "DELIVERY NUMBER
I_VBKOK-WABUC = 'X'. "AUTOMATIC PGI
I_VBKOK-WADAT_IST = SY-DATUM.
LOOP AT INPUT.
SELECT SINGLE * INTO G_LIPS FROM LIPS
WHERE VBELN = INPUT-VBELN
AND POSNR = INPUT-POSNR.
I_VBPOK_TAB-VBELN_VL = G_LIPS-VBELN. "DELIVERY NUMBER
I_VBPOK_TAB-POSNR_VL = G_LIPS-POSNR.
I_VBPOK_TAB-VBELN = G_LIPS-VBELN.
I_VBPOK_TAB-POSNN = G_LIPS-POSNR.
I_VBPOK_TAB-MATNR = G_LIPS-MATNR.
I_VBPOK_TAB-LFIMG = INPUT-LFIMG.
I_VBPOK_TAB-CHARG = INPUT-CHARG.
I_VBPOK_TAB-LGORT = INPUT-LGORT.
GV_14 = INPUT-LFIMG.
CONDENSE GV_14.
I_VBPOK_TAB-PIKMG = GV_14 .
APPEND I_VBPOK_TAB.
ENDLOOP.
* ---发货过账
REFRESH I_PROTT.
CLEAR I_PROTT.
CALL FUNCTION 'WS_DELIVERY_UPDATE'
EXPORTING
VBKOK_WA = I_VBKOK
COMMIT = 'X'
DELIVERY = P_VBELN
UPDATE_PICKING = 'X'
IMPORTING
EF_ERROR_ANY_0 = I_EF_ERROR_ANY_0
TABLES
VBPOK_TAB = I_VBPOK_TAB
PROT = I_PROTT
EXCEPTIONS
ERROR_MESSAGE = 1
OTHERS = 2.
IF I_EF_ERROR_ANY_0 = 'X'.
LOOP AT I_PROTT WHERE MSGTY = 'E'.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
MSGID = I_PROTT-MSGID
MSGNR = I_PROTT-MSGNO
MSGV1 = I_PROTT-MSGV1
MSGV2 = I_PROTT-MSGV2
MSGV3 = I_PROTT-MSGV3
MSGV4 = I_PROTT-MSGV4
IMPORTING
MESSAGE_TEXT_OUTPUT = OUTPUT-NOTES.
ENDLOOP.
OUTPUT-FLAG = 'E'.
CONCATENATE '发货过账失败:' OUTPUT-NOTES INTO OUTPUT-NOTES.
ELSE.
SELECT MAX( VBELN )
INTO OUTPUT-MBLNR
FROM VBFA
WHERE VBELV = P_VBELN
AND VBTYP_N = 'R'.
IF OUTPUT-MBLNR <> ''.
OUTPUT-FLAG = 'S'.
OUTPUT-NOTES = '发货过账成功!'.
"更新D类物资库存(不合格品库更新)
CALL FUNCTION 'ZWMS_UNQUALIF_DTYPE_UPDATE'
EXPORTING
QNDEX = '1000000000'
TABLES
INPUT = INPUT_QN.
ELSE.
OUTPUT-FLAG = 'E'.
OUTPUT-NOTES = '发货过账失败!'.
ENDIF.
ENDIF.
APPEND OUTPUT.
CLEAR OUTPUT.
ENDIF.
*--------------------------日志信息start--------------------------
*日志信息定义
DATA:LOG1 TYPE TABLE OF ZWMS_LOG013_01 WITH HEADER LINE,
LOG2 TYPE TABLE OF ZWMS_LOG013_02 WITH HEADER LINE,
LOG3 TYPE TABLE OF ZWMS_LOG013_03 WITH HEADER LINE,
LOG4 TYPE TABLE OF ZWMS_LOG013_04 WITH HEADER LINE.
DATA:LV_FKEY(100),
LV_FINDX TYPE I,
LV_UUID TYPE SYSUUID-X,
TM_UUID(100).
CLEAR LV_UUID.CLEAR TM_UUID.
CALL FUNCTION 'SYSTEM_UUID_CREATE'
IMPORTING
UUID = LV_UUID.
TM_UUID = LV_UUID.
CLEAR LV_FKEY.
CONCATENATE SY-UNAME SY-DATUM SY-UZEIT TM_UUID INTO LV_FKEY.
CLEAR LV_FINDX.
REFRESH LOG1.
CLEAR LOG1.
LOOP AT INPUT.
LV_FINDX = LV_FINDX + 1.
MOVE-CORRESPONDING INPUT TO LOG1.
LOG1-FKEY = LV_FKEY.
LOG1-FINDX = LV_FINDX.
APPEND LOG1.
CLEAR LOG1.
ENDLOOP.
CLEAR LV_FINDX.
REFRESH LOG2.
CLEAR LOG2.
LOOP AT INPUT_SN.
LV_FINDX = LV_FINDX + 1.
MOVE-CORRESPONDING INPUT_SN TO LOG2.
LOG2-FKEY = LV_FKEY.
LOG2-FINDX = LV_FINDX.
APPEND LOG2.
CLEAR LOG2.
ENDLOOP.
CLEAR LV_FINDX.
REFRESH LOG3.
CLEAR LOG3.
LOOP AT OUTPUT.
LV_FINDX = LV_FINDX + 1.
MOVE-CORRESPONDING OUTPUT TO LOG3.
LOG3-FKEY = LV_FKEY.
LOG3-FINDX = LV_FINDX.
APPEND LOG3.
CLEAR LOG3.
ENDLOOP.
CLEAR LV_FINDX.
REFRESH LOG4.
CLEAR LOG4.
LOOP AT INPUT_QN.
LV_FINDX = LV_FINDX + 1.
MOVE-CORRESPONDING INPUT_QN TO LOG4.
LOG4-FKEY = LV_FKEY.
LOG4-FINDX = LV_FINDX.
APPEND LOG4.
CLEAR LOG4.
ENDLOOP.
IF LOG1[] IS NOT INITIAL.
MODIFY ZWMS_LOG013_01 FROM TABLE LOG1.
ENDIF.
IF LOG2[] IS NOT INITIAL.
MODIFY ZWMS_LOG013_02 FROM TABLE LOG2.
ENDIF.
IF LOG3[] IS NOT INITIAL.
MODIFY ZWMS_LOG013_03 FROM TABLE LOG3.
ENDIF.
IF LOG4[] IS NOT INITIAL.
MODIFY ZWMS_LOG013_04 FROM TABLE LOG4.
ENDIF.
*--------------------------日志信息end--------------------------
ENDFUNCTION.
程序二:
FUNCTION-POOL ZWMS_VL02N. "MESSAGE-ID ..TABLES LIKP.
DATA:HEADER_DATA LIKE BAPIOBDLVHDRCHG,
HEADER_CONTROL LIKE BAPIOBDLVHDRCTRLCHG.
DATA:IT_RETURN TYPE STANDARD TABLE OF BAPIRET2 WITH HEADER LINE.
DATA:IT_HEADER_DEADLINES TYPE STANDARD TABLE OF BAPIDLVDEADLN WITH HEADER LINE.
DATA:ITEM_DATA LIKE BAPIOBDLVITEMCHG OCCURS 0 WITH HEADER LINE,
ITEM_CONTROL LIKE BAPIOBDLVITEMCTRLCHG OCCURS 0 WITH HEADER LINE,
WA_LIPS LIKE LIPS OCCURS 0 WITH HEADER LINE.
DATA:ITEM_DATA_SPL LIKE /SPE/BAPIOBDLVITEMCHG OCCURS 0 WITH HEADER LINE.
DATA:V_16(16) TYPE C.
DATA:V_DEL LIKE BAPIOBDLVHDRCHG-DELIV_NUMB.
DATA:INPUT TYPE TABLE OF ZWMS_VL02N_INPUT WITH HEADER LINE.
DATA:INPUT_SN TYPE TABLE OF ZWMS_VL02N_INPUT_SN WITH HEADER LINE.
DATA:P_VBELN LIKE LIKP-VBELN.
* DATA:VBKOK_WA TYPE VBKOK,
* VBPOK_TAB TYPE VBPOK OCCURS 0 WITH HEADER LINE.
*
*
* DATA:LT_PROTT TYPE PROTT OCCURS 0 WITH HEADER LINE .
DATA:DN_HEADER_DATA LIKE BAPIOBDLVHDRCHG OCCURS 0 WITH HEADER LINE,
DN_HEADER_CONTROL LIKE BAPIOBDLVHDRCTRLCHG,
DN_DELIVERY LIKE LIKP-VBELN,
DN_RETURN LIKE BAPIRET2 OCCURS 0 WITH HEADER LINE,
DN_ITEM_DATA LIKE TABLE OF BAPIOBDLVITEMCHG WITH HEADER LINE,
DN_ITEM_CONTROL LIKE BAPIOBDLVITEMCTRLCHG OCCURS 0 WITH HEADER LINE,
DN_ITEM_SERIAL_NO LIKE TABLE OF BAPIDLVITMSERNO WITH HEADER LINE,
DN_TECHN_CONTROL LIKE BAPIDLVCONTROL."ADD BY CHANGGF 20110219
* INCLUDE LZWMS_VL02ND... " Local class definition
*&---------------------------------------------------------------------*
*& Form FRM_CHANGE_DELIVERY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FRM_CHANGE_DELIVERY CHANGING P_FLAG
P_MESSAGE.
REFRESH INPUT.CLEAR INPUT.
IMPORT INPUT FROM MEMORY ID 'INPUT'.
REFRESH INPUT_SN.CLEAR INPUT_SN.
IMPORT INPUT_SN FROM MEMORY ID 'INPUT_SN'.
IF INPUT[] IS NOT INITIAL.
CLEAR P_VBELN.
READ TABLE INPUT INDEX 1.
IF SY-SUBRC EQ 0.
P_VBELN = INPUT-VBELN.
ENDIF.
"更改交货数量和序列号
SELECT SINGLE * FROM LIKP WHERE VBELN = P_VBELN.
CONCATENATE SY-DATUM SY-UZEIT INTO V_16.
HEADER_DATA-UNLOAD_PT = LIKP-ABLAD.
HEADER_DATA-UNIT_OF_WT = LIKP-GEWEI.
HEADER_DATA-INCOTERMS1 = LIKP-INCO1.
HEADER_DATA-INCOTERMS2 = LIKP-INCO2.
HEADER_DATA-DOOR = LIKP-LGTOR.
HEADER_DATA-DLV_BLOCK = LIKP-LIFSK.
HEADER_DATA-DLV_PRIO = LIKP-LPRIO.
HEADER_DATA-NET_WEIGHT = LIKP-NTGEW.
HEADER_DATA-ROUTE = LIKP-ROUTE.
HEADER_DATA-DELIV_NUMB = LIKP-VBELN.
HEADER_DATA-VOLUMEUNIT = LIKP-VOLEH.
HEADER_DATA-VOLUME = LIKP-VOLUM.
HEADER_DATA-SHIP_COND = LIKP-VSBED.
V_DEL = LIKP-VBELN.
HEADER_DATA-DELIV_NUMB = LIKP-VBELN.
HEADER_CONTROL-GDSI_DATE_FLG = 'X'.
IT_HEADER_DEADLINES-TIMETYPE = 'WSHDRWADTI'.
IT_HEADER_DEADLINES-TIMESTAMP_UTC = V_16.
APPEND IT_HEADER_DEADLINES.
REFRESH ITEM_DATA.
CLEAR ITEM_DATA.
REFRESH DN_HEADER_DATA.
CLEAR DN_HEADER_DATA.
LOOP AT INPUT.
REFRESH WA_LIPS.
CLEAR WA_LIPS.
SELECT SINGLE * INTO WA_LIPS FROM LIPS WHERE VBELN = P_VBELN AND POSNR = INPUT-POSNR.
IF WA_LIPS-LFIMG <> INPUT-LFIMG OR WA_LIPS-CHARG <> INPUT-CHARG.
ITEM_DATA-DELIV_NUMB = WA_LIPS-VBELN.
ITEM_DATA-DELIV_ITEM = WA_LIPS-POSNR.
ITEM_DATA-MATERIAL = WA_LIPS-MATNR.
IF WA_LIPS-CHARG <> INPUT-CHARG.
ITEM_DATA-BATCH = INPUT-CHARG.
ELSE.
ITEM_DATA-BATCH = WA_LIPS-CHARG.
ENDIF.
IF WA_LIPS-LFIMG <> INPUT-LFIMG.
ITEM_DATA-DLV_QTY = INPUT-LFIMG.
ITEM_DATA-DLV_QTY_IMUNIT = INPUT-LFIMG.
ELSE.
ITEM_DATA-DLV_QTY = WA_LIPS-LFIMG.
ITEM_DATA-DLV_QTY_IMUNIT = WA_LIPS-LFIMG.
ENDIF.
ITEM_DATA-FACT_UNIT_NOM = WA_LIPS-UMVKZ.
ITEM_DATA-FACT_UNIT_DENOM = WA_LIPS-UMVKN.
ITEM_DATA-CONV_FACT = WA_LIPS-UMREF.
ITEM_DATA-GROSS_WT = WA_LIPS-BRGEW.
ITEM_DATA-NET_WEIGHT = WA_LIPS-NTGEW.
ITEM_DATA-UNIT_OF_WT = WA_LIPS-GEWEI.
ITEM_DATA-VOLUMEUNIT = WA_LIPS-VOLEH.
ITEM_DATA-SALES_UNIT = WA_LIPS-VRKME.
ITEM_DATA-BASE_UOM = WA_LIPS-MEINS.
ITEM_DATA-STOCK_TYPE = WA_LIPS-INSMK.
ITEM_DATA-VAL_TYPE = WA_LIPS-BWTAR.
ITEM_DATA-INSPLOT = WA_LIPS-QPLOS.
ITEM_DATA-VOLUME = WA_LIPS-VOLUM.
APPEND ITEM_DATA.
CLEAR ITEM_DATA.
ITEM_CONTROL-DELIV_NUMB = WA_LIPS-VBELN.
ITEM_CONTROL-DELIV_ITEM = WA_LIPS-POSNR.
ITEM_CONTROL-CHG_DELQTY = 'X'.
APPEND ITEM_CONTROL.
ENDIF.
LOOP AT INPUT_SN WHERE VBELN = P_VBELN AND POSNR = INPUT-POSNR.
DN_ITEM_SERIAL_NO-DELIV_NUMB = P_VBELN.
DN_ITEM_SERIAL_NO-ITM_NUMBER = INPUT-POSNR.
DN_ITEM_SERIAL_NO-SERIALNO = INPUT_SN-SERNR.
APPEND DN_ITEM_SERIAL_NO.
CLEAR DN_ITEM_SERIAL_NO.
ENDLOOP.
IF WA_LIPS-LGORT <> INPUT-LGORT.
CLEAR ITEM_DATA_SPL.
ITEM_DATA_SPL-DELIV_NUMB = WA_LIPS-VBELN.
ITEM_DATA_SPL-DELIV_ITEM = WA_LIPS-POSNR.
ITEM_DATA_SPL-PICK_DENIAL = 'X'.
ITEM_DATA_SPL-STGE_LOC = INPUT-LGORT.
APPEND ITEM_DATA_SPL TO ITEM_DATA_SPL.
ENDIF.
ENDLOOP.
IF ITEM_DATA[] IS NOT INITIAL OR DN_ITEM_SERIAL_NO[] IS NOT INITIAL OR ITEM_DATA_SPL[] IS NOT INITIAL.
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CHANGE'
EXPORTING
HEADER_DATA = HEADER_DATA
HEADER_CONTROL = HEADER_CONTROL
DELIVERY = V_DEL
TABLES
HEADER_DEADLINES = IT_HEADER_DEADLINES
ITEM_DATA = ITEM_DATA
ITEM_CONTROL = ITEM_CONTROL
ITEM_SERIAL_NO = DN_ITEM_SERIAL_NO
ITEM_DATA_SPL = ITEM_DATA_SPL
RETURN = IT_RETURN.
READ TABLE IT_RETURN WITH KEY TYPE = 'E'.
IF SY-SUBRC <> 0.
COMMIT WORK AND WAIT.
P_FLAG = 'S'.
P_MESSAGE = '修改交货单成功'.
ELSE.
P_FLAG = 'E'.
LOOP AT IT_RETURN WHERE TYPE = 'E'.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
MSGID = IT_RETURN-ID
MSGNR = IT_RETURN-NUMBER
MSGV1 = IT_RETURN-MESSAGE_V1
MSGV2 = IT_RETURN-MESSAGE_V2
MSGV3 = IT_RETURN-MESSAGE_V3
MSGV4 = IT_RETURN-MESSAGE_V4
IMPORTING
MESSAGE_TEXT_OUTPUT = P_MESSAGE.
ENDLOOP.
ENDIF.
ELSE.
P_FLAG = 'S'.
P_FLAG = '没有要修改的交货单明细'.
ENDIF.
ENDIF.
ENDFORM. " FRM_CHANGE_DELIVERY
函数用到的输入参数(INPUT、INPUT_SN、INPUT_QN)、输出参数(OUTPUT)参数如下图:
- 利用bapi BAPI_OUTB_DELIVERY_CHANGE 修改交货单行项目中的数量和序列号
- bapi BAPI_OUTB_DELIVERY_CHANGE 修改交货单中的序列号
- BAPI----冲销外向交货
- BAPI 更改交货单 & 更改捡配 'BAPI_OUTB_DELIVERY_CHANGE'
- abap删除DN的BAPI:BAPI_OUTB_DELIVERY_CHANGE
- 修改交货单中的序列号
- 'BAPI_OUTB_DELIVERY_CHANGE'
- BAPI_OUTB_DELIVERY_CHANGE
- 修改交货号信息
- 销售订单发货后能否更改订单行项目数量?
- 数量和/或“交货结束”指示符或最终发货指示符丢失
- 创建和修改生产订单BAPI
- 内向交货和外向交货区别
- 销售订单计划行已交货数量
- 创建带有订单参考的外向交货:BAPI…
- SAP 参照sto订单创建外向交货BAPI
- butterfly前台修改项目的序列号前缀
- FB02修改BAPI
- dialog设置圆角后去掉4个菱角的方法
- 【LEETCODE】118-Pascal's Triangle
- 关于<:if>没有<c:else>解决方案
- Java工程师成神之路~
- 第三届CCF计算机职业资格认证考试题解(C++)
- 利用bapi BAPI_OUTB_DELIVERY_CHANGE 修改交货单行项目中的数量和序列号
- 基础数据结构之数组和链表(三)
- caffe 的边训练边测试
- 交叉编译环境搭建时,请注意虚拟机版本问题
- js控制跳转页面常用的几种方法
- android Permission
- java平台概念
- 面试题25:包含min函数的栈
- 【Linux】线程