SAP VL02N 交货单过账函数 WS_DELIVERY_UPDATE
前言
用BDC模拟VL02N过账也可以,并不复杂
只不过用SAP提供的Function Module在扩展性上要好一些
代码总览
测试报表
TABLES: likp.
DATA: gs_likp TYPE likp,
gt_lips TYPE STANDARD TABLE OF lips,
gs_lips TYPE lips,
gs_return TYPE zcommon_return.
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: s_vbeln FOR likp-vbeln MEMORY ID vbe.
SELECTION-SCREEN END OF BLOCK blk1.
START-OF-SELECTION.
SELECT SINGLE * FROM likp WHERE vbeln IN @s_vbeln INTO CORRESPONDING FIELDS OF @gs_likp.
gs_likp-wadat_ist = gs_likp-wadat.
SELECT * FROM lips WHERE vbeln IN @s_vbeln INTO CORRESPONDING FIELDS OF TABLE @gt_lips.
CALL FUNCTION 'ZSDFM01_DELIVERY'
EXPORTING
wa_likp = gs_likp
IMPORTING
wa_return = gs_return
TABLES
it_lips = gt_lips.
WRITE gs_return.
END-OF-SELECTION.
FM ZSDFM01_DELIVERY
FUNCTION zsdfm01_delivery.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(WA_LIKP) TYPE LIKP
*" EXPORTING
*" VALUE(WA_RETURN) TYPE ZCOMMON_RETURN
*" TABLES
*" IT_LIPS STRUCTURE LIPS
*"----------------------------------------------------------------------
DATA: wa_lips LIKE LINE OF it_lips,
wa_vbkok TYPE vbkok.
DATA: it_vbpok TYPE STANDARD TABLE OF vbpok,
wa_vbpok TYPE vbpok.
DATA: it_prott TYPE STANDARD TABLE OF prott,
wa_prott TYPE prott.
DATA: v_msg TYPE string.
LOOP AT it_lips INTO wa_lips.
CLEAR:wa_vbpok.
wa_vbpok = VALUE #( vbeln_vl = wa_lips-vbeln
posnr_vl = wa_lips-posnr
vbeln = wa_lips-vgbel
posnn = wa_lips-vgpos
matnr = wa_lips-matnr
lgort = wa_lips-lgort
lfimg = wa_lips-lfimg
lgmng = wa_lips-lfimg " 以仓库保管单位级的实际交货数量
pikmg = wa_lips-lfimg " 参考数量以基本计量单位计算
).
APPEND wa_vbpok TO it_vbpok.
ENDLOOP.
wa_vbkok = VALUE #( vbeln_vl = wa_likp-vbeln
wadat_ist = wa_likp-wadat_ist " 实际货物移动日期
wabuc = 'X' " 自动过帐货物移动
komue = 'X' " 自动以拣配数量覆盖交货数量
).
CALL FUNCTION 'WS_DELIVERY_UPDATE'
EXPORTING
vbkok_wa = wa_vbkok
commit = 'X'
delivery = wa_likp-vbeln
update_picking = 'X'
TABLES
vbpok_tab = it_vbpok
prot = it_prott.
DELETE it_prott WHERE msgty NE 'E' AND msgty NE 'A'.
IF it_prott IS INITIAL.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
wa_return-mtype = 'S'.
wa_return-mtext = '过账成功!' .
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
LOOP AT it_prott INTO wa_prott.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = wa_prott-msgid
msgnr = wa_prott-msgno
msgv1 = wa_prott-msgv1
msgv2 = wa_prott-msgv2
msgv3 = wa_prott-msgv3
msgv4 = wa_prott-msgv4
IMPORTING
message_text_output = v_msg.
wa_return-mtext = wa_return-mtext && '过账失败! 原因如下:' && v_msg .
ENDLOOP.
wa_return-mtype = 'E'.
ENDIF.
ENDFUNCTION.
代码解析
没什么好分析的,vbpok 类型中的字段和 lips 表的字段差不多
代表需要过账的明细行
需要关注的是抬头数据 vbkok 中实际货物移动日期 wadat_ist 和 wabuc 自动过账货物移动需要给到值
wadat_ist = wa_likp-wadat_ist " 实际货物移动日期
wabuc = 'X' " 自动过帐货物移动
然后FM WS_DELIVERY_UPDATE的传入需要设置参数 commit 和 update_picking
这两个参数的默认值都为空,需要设置为 abap_true
commit = 'X'
update_picking = 'X'
调用FM过账后,获取 prot 的返回值
it_prott 里会存储错误信息
通过FM MESSAGE_TEXT_BUILD来获取文本内容
最后输出
结语
如果本文对你有所帮助请为它点个赞吧