今天遇到一个这样的问题,在根据销售订单创建交货单的时候,需求要求讲各个日期都统一写成指定日期,这个日期一般都是过去的日期,而非当天。
目标效果如下图:
虽然凭证日期是9.1日,但拣配、运输、过账日期都是8.25.
拿到需求第一反应是:还能这么玩么?
其他计划日期应该都可以指定,但如拣配、交货这种跟业务执行相关的日期是应该跟随实际动作日期而确定的,不应该是根据动作发生自动更新日期的么?
但实际发现VL01N里创建时,确实可以自由指定日期。
找了一圈,最终分两步把这事搞定了:
1. 创建交货单,用的BAPI_DELIVERYPROCESSING_EXEC此时也有相关的几个日期参数,但填了貌似也没啥用,系统依然默认当前日期。
关键字段如下:
tbl_request-delivery_date = p_budat.
tbl_request-transp_plan_date = p_budat.
tbl_request-goods_issue_date = p_budat.
tbl_request-delivery_date = p_budat.
tbl_request-loading_date = p_budat.
tbl_request-date = p_budat.
2. 调用BAPI_OUTB_DELIVERY_CONFIRM_DEC修改交货单,同时修改日期参数,关键code如下:
lv_timestamp_utc = |{ p_budat }{ sy-uzeit }|.
lv_delivery = <fs_alv>-sodn_vbeln.
ls_head-deliv_numb = <fs_alv>-sodn_vbeln.
ls_headc-deliv_numb = <fs_alv>-sodn_vbeln.
ls_headc-post_gi_flg = 'X'.
lt_deadlines = VALUE #( deliv_numb = <fs_alv>-sodn_vbeln ( timetype = 'WSHDRLFDAT' timestamp_utc = lv_timestamp_utc )
( timetype = 'WSHDRWADAT' timestamp_utc = lv_timestamp_utc )
( timetype = 'WSHDRWADTI' timestamp_utc = lv_timestamp_utc )
( timetype = 'WSHDRLDDAT' timestamp_utc = lv_timestamp_utc )
( timetype = 'WSHDRTDDAT' timestamp_utc = lv_timestamp_utc )
( timetype = 'WSHDRKODAT' timestamp_utc = lv_timestamp_utc )
).
CALL FUNCTION 'SERIAL_INTTAB_REFRESH'.
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CONFIRM_DEC'
EXPORTING
header_data = ls_head
header_control = ls_headc
delivery = lv_delivery
TABLES
header_deadlines = lt_deadlines
return = lt_return.
关于header_deadlines参数的说明,可以在FM中查看文档:
In this table, the header dates are passed on in time stamp format (YYYYMMDDHHMMSS. In field BAPIDLVDEADLN-TIMETYPE the individual date fields are qualified as follows:
- WSHDRLFDAT Delivery date
- WSHDRWADAT Goods issue date (planned)
- WSHDRWADTI Goods issue date (actual)
- WSHDRLDDAT Loading date
- WSHDRTDDAT Transportation planning date
- WSHDRKODAT Picking date
最后看了下过账后的凭证,发现过账日期自动就会是修改后的日期,凭证日期始默认是当前日期。账务上依然统一,SAP果然强大依旧!