SAP销售订单(SO)交货单创建流程:BAPI_OUTB_DELIVERY_CREATE_SLS

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_docref_itemdlv_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 系统能够有效地管理销售订单到交货单的整个流程,同时提供失败处理机制,确保系统的健壮性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值