SAP销售订单交货单创建流程
在 SAP 系统中,交货单的创建是一个重要的流程,涉及到从销售订单创建交货单,并更新相关数据。在本文中,我们将分析一个用于创建销售订单交货单的 ABAP 代码,重点讲解代码中的关键步骤和逻辑。
SO 是指 销售订单,是销售与客户之间的正式协议,用于记录客户的购买请求。
1. 背景介绍
该代码的主要功能是基于销售订单号 zoms_order_no 创建销售订单的交货单。通过使用 BAPI BAPI_OUTB_DELIVERY_CREATE_SLS,代码会创建出库交货单,并根据执行结果更新相关的状态。过程中的关键步骤包括:查询销售订单信息、创建交货单、处理返回信息和更新订单状态。
2. 代码分析
DATA:lt_sales_order_items TYPE TABLE OF bapidlvreftosalesorder.
DATA:ls_sales_order_items TYPE bapidlvreftosalesorder.
DATA:lv_delivery TYPE bapishpdelivnumb-deliv_numb.
DATA:lt_return TYPE STANDARD TABLE OF bapiret2.
DATA:ls_return TYPE bapiret2.
DATA: lv_bapi_mtype TYPE bapi_mtype,
lv_error_messages TYPE string.
2.1 查询销售订单信息
SELECT SINGLE * FROM ztsd0003
WHERE zoms_order_no = @ps_cds_sd004-zomsorderno
AND zbus_order_type = 'SO'
AND zbus_step_status = 'S'
INTO @DATA(ls_so).
-
通过销售订单号
zoms_order_no从表ztsd0003中查询销售订单的相关数据。 -
只有当订单类型为 'SO' 且步骤状态为 'S' 时,才会获取相关数据。
-
S状态通常表示销售订单的一个特定步骤(例如待处理状态)。
2.2 查询销售订单项目(VBAP)
SELECT * INTO TABLE @DATA(lt_vbap) FROM vbap
WHERE vbeln = @ls_so-zbus_order.
-
一旦找到了符合条件的销售订单,代码接着查询相关的销售订单项(
vbap)信息。这是通过销售订单号vbeln查找与之相关的所有销售订单项。 -
查询的目的是获取订单项的信息,这些信息将在交货单创建时作为输入传递给 BAPI。
2.3 处理销售订单项
LOOP AT lt_vbap INTO DATA(ls_vbap).
IF ls_vbap-pstyv = 'ZL2N'.
CONTINUE.
ENDIF.
CLEAR:ls_sales_order_items.
ls_sales_order_items-ref_doc = ls_vbap-vbeln.
ls_sales_order_items-ref_item = ls_vbap-posnr.
ls_sales_order_items-dlv_qty = ls_vbap-kwmeng.
ls_sales_order_items-sales_unit = ls_vbap-vrkme.
APPEND ls_sales_order_items TO lt_sales_order_items.
ENDLOOP.
-
通过
LOOP循环处理每个销售订单项ls_vbap,并将相关的销售订单数据保存到一个新的表lt_sales_order_items。 -
其中,过滤掉了物料类型为
ZL2N的项目,避免这些项目被处理。随后,为每个销售订单项填充交货相关的字段,如ref_doc、ref_item、dlv_qty等。
2.4 调用 BAPI 创建销售订单交货单
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_SLS'
EXPORTING
due_date = '99991231'
IMPORTING
delivery = lv_delivery
TABLES
sales_order_items = lt_sales_order_items
return = lt_return.
-
使用 BAPI
BAPI_OUTB_DELIVERY_CREATE_SLS来创建销售订单的交货单。传递了销售订单项的表lt_sales_order_items,并通过lv_delivery获取生成的交货单号。 -
这个 BAPI 调用会尝试创建交货单,并返回结果。如果 BAPI 执行成功,交货单将被生成并返回。
2.5 处理 BAPI 返回值
IF lv_delivery IS INITIAL.
ps_cds_sd004-zbusstepstatus = lv_bapi_mtype = 'E'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
PERFORM frm_get_error_message USING lt_return CHANGING lv_error_messages.
UPDATE ztsd0003
SET aedat = sy-datum
aezet = sy-uzeit
aenam = sy-uname
zbus_log = lv_error_messages
zbus_step_status = lv_bapi_mtype
WHERE zoms_order_no = ps_cds_sd004-zomsorderno
AND zbus_step = ps_cds_sd004-zbusstep.
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
ENDIF.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ps_cds_sd004-zbusstepstatus = 'S'.
ps_cds_sd004-zbusorder = lv_delivery.
ps_cds_sd004-zbuslog = '创建成功'.
UPDATE ztsd0003
SET aedat = sy-datum
aezet = sy-uzeit
aenam = sy-uname
zbus_order = lv_delivery
zbus_order_type = ps_cds_sd004-zbusordertype
zbus_sap_order_type = ps_cds_sd004-zbussapordertype
zbus_log = ''
zbus_step_status = ps_cds_sd004-zbusstepstatus
WHERE zoms_order_no = ps_cds_sd004-zomsorderno
AND zbus_step = ps_cds_sd004-zbusstep.
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
ENDIF.
ENDIF.
-
如果交货单创建失败(
lv_delivery为空),则会触发回滚操作,更新状态为失败,并记录错误信息。 -
如果交货单创建成功,则会提交事务并更新销售订单的相关数据,将交货单号、状态等信息更新到数据库中,完成交货单的创建过程。
2.6 事务处理
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
-
使用
BAPI_TRANSACTION_COMMIT提交事务,确保数据的持久化。只有在交货单创建成功后,才会提交并更新数据库中的状态。
3. 总结
这段 ABAP 代码的功能是根据销售订单创建出库交货单,并在创建成功或失败时分别处理相关逻辑:
-
查询销售订单和销售订单项。
-
调用 BAPI 创建交货单。
-
根据 BAPI 返回的结果更新销售订单状态,并记录相关信息。
-
使用事务管理确保数据一致性。
通过这种方式,SAP 系统能够有效地管理销售订单到交货单的整个流程,同时提供失败处理机制,确保系统的健壮性。

2273

被折叠的 条评论
为什么被折叠?



