**1**
**写在前面**
**1.1**
**文档说明**
本文档将介绍外向交货单的创建、修改、删除、过账以及冲销,并且包含如何使用代码来实现上述过程。另外,还将介绍衍生出的交货单屏幕增强和BAPI维护扩展字段等内容。
**1.2**
**外向交货单介绍**
在 SAP系统中,外向交货单(Outbound Delivery
Note)是一个关键的物流文档,用于管理和跟踪从仓库到客户的发货过程。外向交货单通常与销售订单相关联,是实现销售订单发货和交付的重要环节。
**外向交货单的主要功能和用途:**
发货管理:
• 外向交货单详细记录了从仓库发往客户的产品或商品的信息。
• 它包含了发货的物料、数量、交货日期、运输方式等关键信息。
销售订单关联:
• 外向交货单通常与销售订单直接关联,确保发货的产品和数量与客户的需求相匹配。
• 通过销售订单,可以自动生成外向交货单,简化了发货流程。
物流跟踪:
• 外向交货单记录了货物的装载、运输和交付状态,帮助企业跟踪物流过程。
• 可以实时更新发货状态,便于客户查询和企业的内部管理。
库存管理:
• 发货时,系统会自动减少相应的库存数量,确保库存信息的准确性。
• 外向交货单的处理直接影响库存水平和可用库存的计算。
财务集成:
• 外向交货单完成后,可以触发财务模块的账务处理,如应收账款的生成和发票的开具。
• 确保物流和财务数据的同步和一致性。
**外向交货单的处理流程:**
创建外向交货单:
• 根据销售订单生成外向交货单,或手动创建新的外向交货单。
库存确认:
• 系统检查仓库中是否有足够的库存来满足交货需求。
装载和发货:
• 仓库工作人员根据交货单进行拣货和装载,更新交货单状态为“已发货”。
交付确认:
• 货物送达客户后,客户或物流公司确认收货,系统更新交货单状态为“已完成”。
财务处理:
• 根据完成的交货单生成发票,更新应收账款。
外向交货单在 SAP
系统中起着至关重要的作用,确保了从订单到交付的整个供应链流程的顺畅和透明。通过外向交货单,企业可以有效地管理库存、优化物流、提高客户满意度,并且实现财务数据的准确性和及时性。
**2**
**创建交货单**
**2.1**
**前台操作**
事务代码VL01N
参照销售订单创建外向交货单
带出销售订单对应的行项目,视情况修改数量等字段,保存即可
**2.2**
**BAPI创建**
调用BAPI: BAPI_OUTB_DELIVERY_CREATE_SLS ,创建交货单
"--------------------@斌将军--------------------
DATA:lv_ship_point TYPE bapidlvcreateheader-ship_point, "装运点 lv_due_date TYPE bapidlvcreateheader-due_date, "创建日期 lv_delivery TYPE bapishpdelivnumb-deliv_numb, lv_num_deliveries TYPE bapidlvcreateheader-num_deliveries.
DATA:lt_sales_order_items TYPE TABLE OF bapidlvreftosalesorder, ls_sales_order_items TYPE bapidlvreftosalesorder, lt_serial_numbers TYPE TABLE OF bapidlvserialnumber, ls_serial_numbers TYPE bapidlvserialnumber, lt_extension_in TYPE TABLE OF bapiparex, ls_extension_in TYPE bapiparex, lt_deliveries TYPE TABLE OF bapishpdelivnumb, ls_deliveries TYPE bapishpdelivnumb, lt_created_items TYPE TABLE OF bapidlvitemcreated, ls_created_items TYPE bapidlvitemcreated, lt_extension_out TYPE TABLE OF bapiparex, ls_extension_out TYPE bapiparex, lt_return TYPE TABLE OF bapiret2, ls_return TYPE bapiret2.
TYPES:BEGIN OF ty_lips_ext, posnr TYPE lips-posnr, "交货单行项目 lgort TYPE lips-lgort, "库存地点 END OF ty_lips_ext.
DATA:lt_lips_ext TYPE TABLE OF ty_lips_ext, ls_lips_ext TYPE ty_lips_ext.DATA:lv_check TYPE char1, lv_message TYPE char255.REFRESH:lt_sales_order_items,lt_serial_numbers,lt_extension_in, lt_deliveries,lt_created_items,lt_return.
CLEAR:lv_ship_point,lv_due_date,lv_delivery,lv_num_deliveries.
lv_ship_point = '1011'."装运点lv_due_date = '20240506'."创建日期
"参照销售订单创建CLEAR:ls_sales_order_items.ls_sales_order_items-ref_doc = '0000001399'."参考凭证 销售订单ls_sales_order_items-ref_item = '20'."参考项 销售订单行ls_sales_order_items-dlv_qty = '1'."实际已交货量(按销售单位)ls_sales_order_items-sales_unit = 'EA'."销售单位APPEND ls_sales_order_items TO lt_sales_order_items.
"*CLEAR:ls_created_items.*ls_created_items-ref_doc = '0000001400'."参考凭证 销售订单*ls_created_items-ref_item = '10'."参考项 销售订单行**ls_created_items-deliv_item = '20'." 交货单行*ls_created_items-material = '000000004000000905'." 交货单行*ls_created_items-dlv_qty = '1'."实际已交货量(按销售单位)*ls_created_items-sales_unit = 'EA'."销售单位*APPEND ls_created_items TO lt_created_items.
CLEAR:lv_delivery,lv_num_deliveries.CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_SLS' EXPORTING ship_point = lv_ship_point due_date = lv_due_date IMPORTING delivery = lv_delivery num_deliveries = lv_num_deliveries TABLES sales_order_items = lt_sales_order_items serial_numbers = lt_serial_numbers extension_in = lt_extension_in deliveries = lt_deliveries created_items = lt_created_items return = lt_return.
CLEAR:lv_check,lv_message.LOOP AT lt_return INTO ls_return WHERE type CA 'AEX'. lv_message = lv_message && ls_return-message. CLEAR:ls_return.ENDLOOP.
IF lv_check = 'E'. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.ELSE. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'.ENDIF."--------------------@斌将军--------------------**2.3**
**创建BAPI增强之内存传值**
外向交货单BAPI只能维护部分字段,一些字段需要通过增强才能维护进去,比如通过内存传值的方法
创建内存结构,在创建交货单时写入库存地点
并在交货单创建BAPI前,抛内存到增强
请注意区分销售订单行项目和交货单行项目。交货单行项目自动流水,不会根据销售订单行项目创建相同行项目的交货单行。
实现BADI: _ LE_SHP_DELIVERY_PROC~CHANGE_DELIVERY_ITEM _ 方法
接程序内存,并将值写入 CS_LIPS 中。
如果是抬头字段,当系统不走 _ CHANGE_DELIVERY_HEADER _ 方法时,可以将抬头中的字段也在该方法中写入交货单
**2.4**
**创建BAPI增强之EXTENSIONIN**
另一种做法是使用BAPI的EXTENSIONIN进行维护,但也需要增强配合。
根据官方文档,可以实现BADI: _ BADI_DLV_CREATE_SLS_EXTIN~ADDITIONAL_INPUT _ 方法
创建用于扩展的结构
传入EXTENSION_IN中
创建函数组,用于将EXTENSION_IN传输到全局变量中
定义函数组全局变量
实施BADI
抛值:将BAPI传入的扩展结构传入函数组
实现BADI: _ LE_SHP_DELIVERY_PROC~SAVE_DOCUMENT_PREPARE _
接值:调用函数,获取全局变量,并将数据更新到CT_XLIPS中
更新逻辑如上文写在 _ CHANGE_DELIVERY_ITEM _ 方法中也可以
效果如下:
**3**
**屏幕增强**
**3.1**
**抬头增强**
在LIKP中附加结构
创建函数组
创建函数ZFG_LIKP_PBO
创建函数ZFG_LIKP_PAI
创建9001子屏幕
画出字段
定义屏幕流,控制控件可编辑状态
STATUS_9001
MODULE status_9001 OUTPUT. LOOP AT SCREEN. IF screen-name+(10) = 'ZSLIKP_EXT'. IF gv_trtyp = 'A'."A显示 B 编辑 screen-input = 0. MODIFY SCREEN. ENDIF. ENDIF. ENDLOOP.ENDMODULE.
实施BADI: _ LE_SHP_TAB_CUST_HEAD _
METHOD:ACTIVATE_TAB_PAGE 添加页签此处可以用事务代码区分开内向/外向交货单
...