根据销售订单创建交货单并自动拣配、过账发货程序

本文介绍了一个ABAP程序ZSD020,该程序用于根据销售订单批量创建交货单并进行发货过账。程序通过读取Excel文件中的订单信息,使用SAP BAPI接口自动完成交货单的创建及发货流程,并处理了可能发生的异常情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Code listing for: ZSD020 
Description: 根据销售订单创建交货单并过账发货
*&---------------------------------------------------------------------*
* 程序名称: 根据销售订单创建交货单并过账发货
* 程序名  :ZSD020
* 开发日期:2013-08-26
* 创建者  :
* 申请者  :
*----------------------------------------------------------------------*
* 概 要  :
*&---------------------------------------------------------------------*

REPORT  ZSD020.

*****************************************************************
*TYPE DECLARATION
*****************************************************************

TYPES:BEGIN OF TY_TAB_UPLOAD,                        "上传文件接收表
  SHIP_POINT TYPE BAPIDLVCREATEHEADER-SHIP_POINT,    "装运点
  VBELN(10) TYPE C,                                  "订单号
  REF_ITEM TYPE RFPOS_VL,                            "项目
  DLV_QTY TYPE LFIMG,                                "交货数量
  MESSAGE TYPE STRING,
  END OF TY_TAB_UPLOAD.

TYPES:BEGIN OF TY_VBAP,
  VRKME TYPE VBAP-VRKME,
  END OF TY_VBAP.
*****************************************************************
*TYPE DECLARATION
*****************************************************************
TABLES: VBAP.
************************************************************************
* INTERNAL TABLE DECLARATION
************************************************************************

DATA:
      IT_TAB_UPLOAD TYPE STANDARD TABLE OF TY_TAB_UPLOAD,                    "上传文件接收表
      IT_INTERN LIKE STANDARD TABLE OF ALSMEX_TABLINE,                       "EXCEL文件接收表
      SALES_ITEMS LIKE STANDARD TABLE OF BAPIDLVREFTOSALESORDER,             "BAPI输入表:
      IT_RETURN LIKE STANDARD TABLE OF BAPIRET2,                             "BAPI返回参数 
      IT_SERIAL_NUMBERS LIKE STANDARD TABLE OF BAPIDLVSERIALNUMBER,          "BAPI返回参数 
      IT_EXTENSION_IN LIKE STANDARD TABLE OF BAPIPAREX,                      "BAPI返回参数
      IT_DELIVERIES LIKE STANDARD TABLE OF BAPISHPDELIVNUMB,                 "BAPI返回参数
      IT_CREATED_ITEMS LIKE STANDARD TABLE OF BAPIDLVITEMCREATED,            "BAPI返回参数
      IT_EXTENSION_OUT LIKE STANDARD TABLE OF BAPIPAREX.                     "BAPI返回参数



************************************************************************
* WORKAREA DECLARATION
************************************************************************

DATA:
      WA_VBAP TYPE TY_VBAP,
      WA_TAB_UPLOAD TYPE TY_TAB_UPLOAD,                         "上传文件接收表
      WA_SALES_ITEMS TYPE BAPIDLVREFTOSALESORDER,               "BAPI输入表:
      G_SHIP_POINT TYPE BAPIDLVCREATEHEADER-SHIP_POINT,         "装运点
      WA_INTERN LIKE ALSMEX_TABLINE,                            "EXCEL参数表
      G_DELIVERY TYPE BAPISHPDELIVNUMB-DELIV_NUMB,              "BAPI返回参数
      G_NUM_DELIVERIES TYPE BAPIDLVCREATEHEADER-NUM_DELIVERIES, "BAPI返回参数
      WA_CREATED_ITEMS LIKE BAPIDLVITEMCREATED,
      WA_RETURN LIKE  BAPIRET2.


************************************************************************
* SELECTION SCREEN DECLARATION
************************************************************************

SELECTION-SCREEN BEGIN OF BLOCK BLK.
PARAMETERS: P_FIN TYPE RLGRAP-FILENAME OBLIGATORY. "文件名
SELECTION-SCREEN END OF BLOCK BLK.

************************************************************************
* AT SELECTION SCREEN
************************************************************************

AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FIN.
  PERFORM FRM_F4_HELP CHANGING P_FIN.  "文件浏览

************************************************************************
* EVENT START OF SELECTION
************************************************************************

START-OF-SELECTION.
  PERFORM FM_UPLOAD_DATA.       "上传文件

*&---------------------------------------------------------------------*
*  FORM  ADD_ZERO
*&---------------------------------------------------------------------*
*  增加前导零
*&---------------------------------------------------------------------*

  DEFINE ADD_ZERO.
    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
      EXPORTING
        INPUT  = &1
      IMPORTING
        OUTPUT = &1.
  END-OF-DEFINITION.

*&---------------------------------------------------------------------*
*  FORM  DELIVERY
*&---------------------------------------------------------------------*
*  BAPI发货过账
*  输入参数:交货单号 P_VBELN
*&---------------------------------------------------------------------*
FORM  DELIVERY USING P_VBELN TYPE VBELN.
  DATA:G_LIKP LIKE  LIKP.
  DATA:G_LIPS LIKE  LIPS.
  DATA GV_14(14TYPE C.
  DATABEGIN OF I_VBKOK OCCURS 11.
          INCLUDE STRUCTURE VBKOK.
  DATAEND OF I_VBKOK.

  DATABEGIN OF I_VBPOK_TAB OCCURS 12.
          INCLUDE STRUCTURE VBPOK.
  DATAEND OF I_VBPOK_TAB.
  DATA:EF_ERROR_ANY TYPE XFELD.

  SELECT SINGLE INTO G_LIKP FROM LIKP
      WHERE VBELN P_VBELN.

  I_VBKOK-VBELN_VL        P_VBELN.        "DELIVERY NUMBER
  I_VBKOK-WABUC           'X'.            "AUTOMATIC PGI
  I_VBKOK-WADAT_IST       G_LIKP-BLDAT.
  APPEND I_VBKOK.

  SELECT INTO G_LIPS FROM LIPS
    WHERE VBELN P_VBELN.
    I_VBPOK_TAB-VBELN_VL    P_VBELN.      "DELIVERY NUMBER
    I_VBPOK_TAB-POSNR_VL    G_LIPS-POSNR.
    I_VBPOK_TAB-VBELN       P_VBELN.
    I_VBPOK_TAB-POSNN       G_LIPS-POSNR.
    I_VBPOK_TAB-MATNR       G_LIPS-MATNR.
    GV_14                   G_LIPS-LFIMG.
    CONDENSE GV_14.
    I_VBPOK_TAB-PIKMG       GV_14 .
    APPEND I_VBPOK_TAB.
  ENDSELECT.


  CALL FUNCTION 'WS_DELIVERY_UPDATE'
    EXPORTING
      VBKOK_WA       I_VBKOK
      COMMIT         'X'
      DELIVERY       P_VBELN
      UPDATE_PICKING 'X'
     IMPORTING
     EF_ERROR_ANY_0  EF_ERROR_ANY
    TABLES
      VBPOK_TAB      I_VBPOK_TAB
    EXCEPTIONS
      ERROR_MESSAGE  1
      OTHERS         2.



  IF EF_ERROR_ANY 'X'.
    WRITE:/ P_VBELN ' 发货过账失败!可能需要手动发货过账'.
  ELSE.
    WRITE:/ P_VBELN ' 发货过账成功!'.
  ENDIF.



ENDFORM.                    "DELIVERY



*&---------------------------------------------------------------------*
*  FORM  FM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*  上传文件
*&---------------------------------------------------------------------*

FORM  FM_UPLOAD_DATA.
  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      FILENAME                = P_FIN
      I_BEGIN_COL             = 1
      I_BEGIN_ROW             = 1
      I_END_COL               = 255
      I_END_ROW               = 65536
    TABLES
      INTERN                  = IT_INTERN
    EXCEPTIONS
      INCONSISTENT_PARAMETERS = 1
      UPLOAD_OLE              = 2
      OTHERS                  = 3.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.
  DELETE IT_INTERN WHERE ROW = 1.                    "删除字段名行

  LOOP AT IT_INTERN INTO WA_INTERN.                  "将EXCEL信息储存至内表IT_TAB_UPLOAD
    CASE WA_INTERN-COL.
      WHEN 1.
        WA_TAB_UPLOAD-SHIP_POINT = WA_INTERN-VALUE.
      WHEN 2.
        WA_TAB_UPLOAD-VBELN = WA_INTERN-VALUE.
        ADD_ZERO WA_TAB_UPLOAD-VBELN.
      WHEN 3.
        WA_TAB_UPLOAD-REF_ITEM = WA_INTERN-VALUE.
      WHEN 4.
        WA_TAB_UPLOAD-DLV_QTY = WA_INTERN-VALUE.
        APPEND WA_TAB_UPLOAD TO IT_TAB_UPLOAD.
    ENDCASE.
  ENDLOOP.


  LOOP AT IT_TAB_UPLOAD INTO WA_TAB_UPLOAD.          "填充BAPI参数表:SALES_ITEMS
    G_SHIP_POINT = WA_TAB_UPLOAD-SHIP_POINT.
    WA_SALES_ITEMS-REF_DOC = WA_TAB_UPLOAD-VBELN.
    WA_SALES_ITEMS-REF_ITEM = WA_TAB_UPLOAD-REF_ITEM.
    WA_SALES_ITEMS-DLV_QTY = WA_TAB_UPLOAD-DLV_QTY.
    SELECT SINGLE VRKME FROM VBAP INTO CORRESPONDING FIELDS OF WA_VBAP                                        "数量单位取VBAP中单位
      WHERE VBELN = WA_TAB_UPLOAD-VBELN
        AND POSNR = WA_TAB_UPLOAD-REF_ITEM.
    WA_SALES_ITEMS-SALES_UNIT = WA_VBAP-VRKME.
    APPEND WA_SALES_ITEMS TO SALES_ITEMS.
  ENDLOOP.
  PERFORM MANAGE_DATA.                                                                                        "创建交货单,发货过账

ENDFORM.                    "FM_UPLOAD_DATA


*&---------------------------------------------------------------------*
*  FORM  MANAGE_DATA
*&---------------------------------------------------------------------*
*  BAPI处理创建交货单
*&---------------------------------------------------------------------*

FORM  MANAGE_DATA.

  CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_SLS'
   EXPORTING
     SHIP_POINT             = G_SHIP_POINT
*   DUE_DATE                =
*   DEBUG_FLG               =
*   NO_DEQUEUE              = ' '
 IMPORTING
   DELIVERY                = G_DELIVERY
   NUM_DELIVERIES          = G_NUM_DELIVERIES
    TABLES
   SALES_ORDER_ITEMS       = SALES_ITEMS
   SERIAL_NUMBERS          = IT_SERIAL_NUMBERS
   EXTENSION_IN            = IT_EXTENSION_IN
   DELIVERIES              = IT_DELIVERIES
   CREATED_ITEMS           = IT_CREATED_ITEMS
   EXTENSION_OUT           = IT_EXTENSION_OUT
   RETURN                  = IT_RETURN
            .
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
  EXPORTING
   WAIT = 'X'.
  LOOP AT IT_RETURN INTO WA_RETURN.
    IF WA_RETURN-ROW = 0.
    ELSE.
      READ TABLE IT_TAB_UPLOAD INTO WA_TAB_UPLOAD INDEX WA_RETURN-ROW.
      CONCATENATE WA_TAB_UPLOAD-MESSAGE WA_RETURN-MESSAGE INTO WA_TAB_UPLOAD-MESSAGE.
      MODIFY IT_TAB_UPLOAD FROM WA_TAB_UPLOAD INDEX WA_RETURN-ROW.
    ENDIF.
  ENDLOOP.

  LOOP AT IT_TAB_UPLOAD INTO WA_TAB_UPLOAD.
    IF WA_TAB_UPLOAD-MESSAGE IS NOT INITIAL.
      WRITE: / ' 单据号:', WA_TAB_UPLOAD-VBELN , ' 项目号:' , 
      WA_TAB_UPLOAD-REF_ITEM , '错误信息:', WA_TAB_UPLOAD-MESSAGE.
    ENDIF.
  ENDLOOP.

  IF IT_CREATED_ITEMS IS NOT INITIAL.


    WRITE: / , /  '==================================================================================================================================================================='.
    READ TABLE IT_CREATED_ITEMS INTO WA_CREATED_ITEMS INDEX 1.       "自动拣配过账

    WRITE: / , /  ' 已创建交货单:' , WA_CREATED_ITEMS-DELIV_NUMB.
*    LOOP AT IT_CREATED_ITEMS INTO WA_CREATED_ITEMS.
*      WRITE: / , /' 单据号:' , WA_CREATED_ITEMS-REF_DOC ,
*                  ' 项目号:' , WA_CREATED_ITEMS-REF_ITEM ,
*                  ' 发货单项目号:' , WA_CREATED_ITEMS-DELIV_ITEM ,
*                  ' 物料号:' , WA_CREATED_ITEMS-MATERIAL ,
*                  ' 发货数量:' , WA_CREATED_ITEMS-DLV_QTY ,
*                  ' 发货单位:' , WA_CREATED_ITEMS-SALES_UNIT.
*    ENDLOOP.
    PERFORM DELIVERY USING WA_CREATED_ITEMS-DELIV_NUMB.
  ELSE.
    WRITE: / , / ' 发货单未能创建!'.
  ENDIF.


ENDFORM.                    "MANAGE_DATA


*&---------------------------------------------------------------------*
*  FORM  FRM_F4_HELP
*&---------------------------------------------------------------------*
*  F4文件浏览帮助
*&---------------------------------------------------------------------*

FORM FRM_F4_HELP  CHANGING O_FNAME TYPE RLGRAP-FILENAME.
  DATA: L_FILETAB TYPE FILETABLE,
        L_WAFTAB LIKE LINE OF L_FILETAB,
        L_RC TYPE I.

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
    EXPORTING
      WINDOW_TITLE            = '打开文件'
      INITIAL_DIRECTORY       = 'C:/'
    CHANGING
      FILE_TABLE              = L_FILETAB
      RC                      = L_RC
    EXCEPTIONS
      FILE_OPEN_DIALOG_FAILED = 1
      CNTL_ERROR              = 2
      ERROR_NO_GUI            = 3
      NOT_SUPPORTED_BY_GUI    = 4
      OTHERS                  = 5.
  IF SY-SUBRC <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
               WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    EXIT.
  ELSE.
    READ TABLE L_FILETAB INTO L_WAFTAB INDEX 1.
    O_FNAME = L_WAFTAB-FILENAME.
    CLEAR: L_FILETAB,
           L_WAFTAB.
  ENDIF.

ENDFORM.                    "FRM_F4_HELP
<think>我们正在处理一个关于SAP STO(库存转移订单)流程置的问题。用户希望实现:在创建STO后自动生成交货单且在交货单过账后,采购方能够自动完成入库操作。根据引用内容,我们可以得到一些线索:引用[1]提到:“解决集团公司集采管理。集采公司采购订单与内部关联公司采购订单对应表,解决集采公司自动入入库,阶段性触发STO采购订单交货单创建根据交货单入库,阶段性分布反向冲销;”引用[2]则提到了采购订单_STO发货创建内向交货,以及相关的输出条件类型(SPED和SPER)和后台置路径。因此,我们需要置STO自动创建交货单交货单过账自动触发采购方的入库。在SAP中,这通常通过输出条件类型和后台置来实现。步骤大致如下:1.自动创建交货单:这通常通过输出类型(OutputType)和条件类型(ConditionType)来实现。在采购订单置输出类型,当采购订单保存时自动触发交货单创建。2.自动过账:在交货单过账发货过账)后,需要自动触发采购方的入库。这可以通过移动类型(MovementType)和自动过账置来实现。具体置步骤:一、自动创建交货单发货方)1.1定义输出类型(OutputType):使用事务码NACE,选择“采购”->“采购订单”,然后定义输出类型(例如:MEDN-内向交货单)。确保输出类型与交货单创建相关。1.2分输出确定过程(Output DeterminationProcedure):在采购订单类型中分输出确定过程。事务码:SPRO ->物料管理->采购->采购订单->定义输出类型->分输出确定过程。或者使用事务码OMEL,为采购订单类型分输出确定过程。1.3置条件记录(ConditionRecords):在采购订单中,需要为输出类型MEDN创建条件记录。这可以通过事务码ME12(修改采购订单)来完成,在采购订单的“条件”标签页中,添加输出类型MEDN,设置触发时间(例如:立即发送)和发送方式(例如:EDI或打印等,但自动创建交货单通常使用EDI或后台处理)。注意:自动创建交货单通常需要置后台处理(BackgroundProcessing),这可能需要ABAP程序支持。二、交货单自动过账发货方)当交货单创建后,发货方需要执行发货过账(使用事务码VL02N)。但是用户要求自动过账,这可能需要使用后台作业或者增强来实现。另一种方式是使用WM(仓库管理)模块的自动过账功能,但这里我们假设是使用基本的库存管理。2.1发货点(ShippingPoint)的自动过账:在发货置中,可以设置自动创建交货单自动过账。事务码:OVXD,选择发货点,检查“自动创建交货单”和“自动过账”的置。2.2置检查规则(CheckingRule):在发货过账时,系统会执行一些检查(如库存、批次等)。需要确保这些检查规则允许自动过账。事务码:SPRO->后勤执行->装运->交货->定义交货的项目类别确定->定义检查规则。三、置采购方自动入库(收货方)在STO流程中,发货发货过账后,采购方(收货方)需要做收货入库。这通常通过MIGO事务完成。但用户要求自动入库。3.1自动收货:在SAP中,可以通过置输出类型在交货单过账后触发收货。但标准功能可能不支持自动收货,可能需要开发增强。另一种方式:使用后台作业监控交货单状态,当交货单状态变为“已发货”时,自动触发收货(MB01或MIGO)。但是,引用[1]中提到:“提供SAP采购订单收货接口日志表,以WMSID为主键,防止重复提交后,异常过账,且支持同步接口,二次异步反馈凭证号即消息,允许WMS多次调用接口”,这表明可能需要接口程序。四、使用STO的特殊功能(一步法或两步法)在STO中,有两种转移方式:-一步法:发货同时自动收货。移动类型为301。-两步法:发货(移动类型641),再收货(移动类型101)。用户的需求是自动创建交货单过账自动入库,因此我们可以考虑使用一步法(如果业务允许)。置一步法STO:4.1在采购订单的项目类别中,设置移动类型为301(一步法库存转移)。事务码:OMJJ,定义移动类型301的属性(自动过账)。4.2在创建采购订单时,使用一步法的项目类别(例如:U)。在采购订单的行项目中,项目类别U对应移动类型301。4.3当发货方对交货单过账时,系统会同时完成发货和收货的过账。这样就不需要在采购方单独做入库操作。因此,如果业务允许使用一步法,则置一步法STO是最简单的实现方式。五、置步骤总结(以一步法为例):5.1置移动类型301(一步法库存转移):事务码:OMJJ,确保移动类型301的“自动过账”标志被勾选。5.2置采购订单的项目类别:事务码:SPRO->物料管理->采购->采购订单->定义项目类别,确保项目类别(例如:U)的移动类型为301。5.3在创建STO采购订单时,使用项目类别U(或自定义的一步法项目类别)。5.4自动创建交货单(如前所述):-定义输出类型(如MEDN)给采购订单类型。-发货点(ShippingPoint)的自动创建交货单自动过账(事务码OVXD)。5.5这样,当保存采购订单时,系统会自动创建交货单(通过输出类型MEDN触发),且当发货方在交货单中执行过账(VL02N)时,系统会自动完成发货和收货(一步法)。注意:如果业务要求使用两步法,那么自动收货就需要额外的置或开发。在这种情况下,我们可以考虑使用IDOC或接口程序,在发货过账自动触发采购方的收货(MB01或MIGO)。但是,标准功能不支持两步法的自动收货,因此可能需要开发。根据引用[2]提到的输出类型SPED(用于内向交货),我们也可以考虑在交货单过账后,通过输出类型触发一个事件,例如调用一个函数模块来执行收货。但这需要ABAP开发。因此,推荐使用一步法来实现自动入库。相关问题:1.一步法和两步法库存转移的区别是什么?2.如何置输出类型以实现采购订单自动创建交货单?3.在SAP中,如何发货点的自动过账?4.如果使用两步法,如何实现自动收货?5.STO流程中,如何避免重复过账?</think>### SAP STO自动创建交货单自动入库置指南 在SAP中实现STO自动创建交货单过账后采购方自动入库,需置以下关键步骤: #### 一、核心置步骤 1. **移动类型置(一步法)** - 事务码`OMJJ`中激活**移动类型301**(一步法库存转移) - 勾选"自动过账"标志,实现发货与收货同步完成 $$ \text{移动类型301} \rightarrow \text{发货过账} = \text{收货方自动入库} $$ 2. **采购订单项目类别** - 事务码`SPRO`:物料管理 > 采购 > 采购订单 > 定义项目类别 - 为STO类型订单**项目类别U**(库存转移) - 关联移动类型301 3. **自动交货单创建** - 事务码`OVZH`:发货点的"自动创建交货单"标志 - 事务码`OVZ8`:设置交货类型为**NLCC**(内向交货) ```ABAP SPRO路径:后勤执行 > 装运 > 交货 > 定义交货类型复制控制 ``` 4. **输出控制置** - 事务码`NACE`:为采购订单输出类型**MEDN**(内向交货单) - 设置处理程序**MEDNCH**(自动触发交货单创建)[^2] $$ \text{采购订单保存} \xrightarrow{\text{MEDN输出}} \text{自动生成交货单} $$ #### 二、业务流程示例 1. **创建STO采购订单** - 事务码`ME21N`创建类型为UB(公司间)的采购订单 - 项目类别选择U,移动类型自动带出301 2. **自动触发流程** ```mermaid graph LR A[保存STO采购订单] --> B{输出类型MEDN激活} B -->|自动| C[生成内向交货单] C --> D[VL02N发货过账] D -->|移动类型301| E[自动完成收货方入库] ``` 3. **过账结果验证** - 发货方:物料凭证显示移动类型641(发货) - 收货方:物料凭证显示移动类型101(收货) - 会计凭证:自动生成GR/IR科目分录 #### 三、关键注意事项 1. **公司间结算置** - 事务码`OBYR`置公司间STO的评估级别 - 确保发货/收货工厂属于不同公司代码 2. **防止重复过账** - 引用[1]方案:建立**接口日志表**,以WMSID为主键防重 - 启用采购订单的**交货已完成**标识(JIT功能) 3. **异常处理** - 置输出类型**SPER**用于交货单撤销[^2] - 事务码`V.26`设置退货移动类型122 > **置验证点**:使用事务码`MIGO`检查收货方物料凭证,确认移动类型101是否自动生成,且会计凭证GR/IR科目平衡。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值