SE37 创建PO订单BAPI_PO_CREATE1

本文档详细介绍了如何在SE37中调用BAPI_PO_CREATE1来创建采购订单。通过示例代码展示了如何填充必要的数据结构,如potextitem和poschedule,以及如何设置状态 bstae。
DATA:BEGIN OF gt_data OCCURS 0,
          bsart TYPE string,"采购凭证类型
          lifnr  TYPE string,"供应商帐户号
          ekorg TYPE string,"采购组织
          ekgrp TYPE string,"采购组
          bukrs TYPE string,"公司代码
          ihrez  TYPE string,"您的参考
          ebelp  TYPE string,"采购凭证的项目编号
          knttp TYPE string,"科目分配类别
          txz01 TYPE string,"短文本
          menge TYPE string,"采购订单数量
          meins TYPE string,"采购订单的计量单位
          eeind TYPE string,"交货日期W
          netpr TYPE string,"净价
          waers TYPE string,"货币 W
          matkl TYPE string,"物料组
          werks TYPE string,"工厂
          bednr TYPE string,"需求跟踪号
          afnam TYPE string,"需求者/请求者姓名
          mwskz TYPE string,"销售税代码
          sakto TYPE string,"总帐科目
          kostl TYPE string,"成本中心
          anln1 TYPE string,"资产
          aufnr TYPE string,"订单
          str1   TYPE string,"行项目文本-来自采购申请项目详细清单
          str2   TYPE string,"行项目文本-规格型号
          str3   TYPE string,"行项目文本-RFQ Reference
          bstae TYPE string,"确认控制
        END OF gt_data.

DATA: BEGIN OF gt_out OCCURS 0,
            text(255),
          END OF gt_out.

DATA:  poheader  LIKE TABLE OF bapimepoheader  WITH HEADER LINE ,
           poheaderx LIKE TABLE OF bapimepoheaderx WITH HEADER LINE,
           return       LIKE TABLE OF bapiret2  WITH HEADER LINE,
           poitem    LIKE TABLE OF bapimepoitem WITH HEADER LINE,
           poitemx LIKE TABLE OF bapimepoitemx WITH HEADER LINE,
           poschedule LIKE TABLE OF bapimeposchedule WITH HEADER LINE,
           poschedulex LIKE TABLE OF bapimeposchedulx WITH HEADER LINE,
           poaccount LIKE TABLE OF bapimepoaccount WITH HEADER LINE,
           poaccountx LIKE TABLE OF bapimepoaccountx WITH HEADER LINE,
           pocond LIKE TABLE OF bapimepocond WITH HEADER LINE,
           pocondx LIKE TABLE OF bapimepocondx WITH HEADER LINE,

           potextitem LIKE TABLE OF bapimepotext WITH HEADER LINE.

DATA: epo LIKE bapimepoheader-po_number.

DATA: l_return LIKE return.
DATA: lv_message(255).

CONSTANTS: con VALUE 'X'.

DATA: pp_file TYPE string.
DATA: lifnr TYPE elifn.
DATA: netpr TYPE bprei.
DATA: bstae TYPE bstae.

PARAMETERS:p_file(128) .

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  PERFORM get_file.

START-OF-SELECTION.
  PERFORM get_data.
  PERFORM create_po.
  PERFORM write_out.

*&---------------------------------------------------------------------*
*&      Form  GET_FILE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM get_file .
  CALL FUNCTION 'WS_FILENAME_GET'
       EXPORTING
            def_filename     = p_file
            mask             = ',*.txt,*.TXT.'
            mode             = 'O'
            title            = 'File Name'
       IMPORTING
            filename         =  p_file
       EXCEPTIONS
  &
<think>嗯,用户想了解BAPI_PO_CREATE1创建采购订单时的常见错误。这是个很具体的SAP开发问题,需要结合BAPI特性和实际开发经验来回答。 用户可能正在调试采购订单创建程序,遇到了报错但不知如何排查。从ta引用的两段代码看,ta应该有一定ABAP基础,但可能对BAPI的异常处理机制不熟悉。需要重点说明错误分类和排查逻辑。 首先想到BAPI错误主要分三类:输入数据校验错误、业务逻辑冲突、系统执行异常。输入校验最常见,比如: - 必填字段缺失(如采购组织、供应商) - 字段格式错误(日期格式、物料编码不存在) - 字段组合冲突(项目类别与物料类型不匹配) 业务逻辑方面要关注: - 供应商主数据状态(是否冻结) - 采购信息记录有效性 - 公司代码/工厂的配置状态 这些错误通常反映在RETURN表的E/A类消息中。 系统异常比较少见,但像内存溢出、锁表冲突也需要考虑。特别要注意的是BAPI不会主动抛出ABAP异常,完全依赖RETURN参数返回消息——这点和普通函数不同。 用户代码里用事务回滚处理错误的思路是对的,但可以优化错误日志。建议ta: 1 用LT_RETURN内表收集所有消息 2 用BAL日志工具分类存储 3 对E/A类消息用LOOP AT...WHERE批量判断 这样既能避免漏掉错误,也方便后续分析。 突然想到个易错点:POSCHEDULEX等X结构体必须对修改字段赋'X',否则BAPI会忽略对应字段更新。用户第二段代码里LS_SCHEDULEX-DELIVERY_DATE = 'X'就是正确做法。 最后提醒用户注意权限问题(比如采购订单类型创建权限),这个容易被忽略但会导致创建失败。可以建议ta用SU53检查权限缺失记录。 要不要补充说明RETURN消息的查看技巧?比如用MESSAGE ID直接查SAP帮助文档。不过用户没问具体消息分析,先聚焦错误分类吧。</think>在使用BAPI_PO_CREATE1创建采购订单时,常见的错误或异常情况主要源于数据不一致、配置缺失或业务逻辑冲突。以下是关键错误类型及排查要点: --- ### **一、输入数据结构错误** 1. **必填字段缺失** - 采购订单头(`POHEADER`/`POHEADERX`)中缺少关键字段: - `DOC_TYPE`(凭证类型)、`VENDOR`(供应商)、`PURCH_ORG`(采购组织)、`COMP_CODE`(公司代码) - **修复**:确保`POHEADERX`中对应字段设为`'X'`(表示更新)并传递有效值[^1][^2]。 2. **行项目数据不完整** - `POITEM`/`POITEMX`缺少: - `PO_ITEM`(行项目号)、`MATERIAL`(物料号)或`PLANT`(工厂) - `QUANTITY`(数量)、`NET_PRICE`(净价) - **示例错误**:`"Material XXX is not maintained for plant YYY"` → 检查物料主数据的工厂视图是否维护采购视图。 --- ### **二、业务逻辑冲突** 1. **供应商状态异常** - 供应商主数据未维护或存在冻结(如未维护采购组织数据) - **错误消息**:`"Vendor ZZZ is blocked for purchasing org"` 2. **采购信息记录缺失** - 未创建物料与供应商的信息记录(Info Record),或记录未生效 - **解决方案**:通过事务代码`ME11`创建信息记录,或使用`ACCOUNT_ASSIGNMENT`(账户分配)结构替代[^1]。 3. **价格条件错误** - `POCOND`(条件表)中的价格条件类型未配置(如PB00) - **排查**:检查SPRO路径 **物料管理→采购→条件→定义价格确定流程**。 --- ### **三、系统配置与权限问题** 1. **采购订单类型无效** - `POHEADER-DOC_TYPE`未在SPRO中配置(如标准类型NB未激活) - **验证路径**:SPRO→**物料管理→采购采购订单→定义凭证类型**。 2. **账户分配错误** - 成本中心、资产号等账户分配字段无效: - 检查`POACCOUNT`结构中的`COSTCENTER`(成本中心)是否有效 - **错误消息**:`"Cost center ABCD does not exist"` 3. **用户权限不足** - 缺少创建采购订单的权限对象(如`M_BEST_KO`) - **诊断**:使用事务代码`SU53`检查权限错误。 --- ### **四、数据一致性校验失败** 1. **日期冲突** - `POSCHEDULE`(计划行)中的`DELIVERY_DATE`早于当前日期 - **错误**:`"Delivery date cannot be in the past"` 2. **物料与工厂不匹配** - 行项目中的物料未在指定工厂维护 - **修复**:通过`MM03`检查物料主数据的工厂视图状态。 3. **货币/单位错误** - 订单货币与供应商主数据货币不一致 - 数量单位(如PC)与物料主数据单位不符 --- ### **五、BAPI调用与事务处理** 1. **未正确处理RETURN表** - 忽略`RETURN`内表的错误检查导致事务未回滚 - **关键代码**: ```abap LOOP AT lt_return INTO ls_return WHERE type = 'E' OR type = 'A'. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. ENDLOOP. IF sy-subrc <> 0. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. ENDIF. ``` 必须严格检查`E`(错误)和`A`(终止)消息[^2]。 2. **未提交/回滚事务** - 调用BAPI后未执行`BAPI_TRANSACTION_COMMIT`或`ROLLBACK` → 导致订单卡在未提交状态。 --- ### **典型错误消息示例** | 错误消息 | 原因 | 解决方案 | |----------------------------------------|-------------------------------|------------------------------| | `"Material XXX is not assigned to plant YYY"` | 物料未在工厂层级维护 | 使用`MM01`扩展物料工厂视图 | | `"Purchasing info record not found"` | 信息记录缺失或未生效 | 创建信息记录(ME11) | | `"Account assignment category invalid"`| 账户分配类型未配置 | 检查行项目的`ITEM_CAT`字段值 | | `"Company code is not defined"` | 公司代码配置错误 | SPRO检查公司代码定义 | --- ### **最佳实践** 1. **数据预校验**:调用BAPI前,用函数`ME_CHECK_PO_ITEM`校验行项目数据。 2. **日志分析**:使用`BAPIRET2_DISPLAY`显示`RETURN`表详情。 3. **分批处理**:单次调用不超过100行项目,避免锁表超时。 > 提示:通过事务代码`ST22`查看ABAP Dump可定位底层错误(如字段类型转换异常)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值