BAPI_PO_CREATE1创建采购订单BAPI学习

这里是创建采购订单BAPI的学习及研究,没有涉及到增强结构。就是常规的信息

创建测试的函数模块

创建函数模块

在这里插入图片描述

创建函数组

在这里插入图片描述

创建需要的结构

在这里插入图片描述
在这里插入图片描述

设置传入参数

在这里插入图片描述
还有一个导出参数:
在这里插入图片描述

运行结果

在这里插入图片描述

非常注意

在这里插入图片描述

代码解析

定义需要的变量

在这里插入图片描述

抬头赋值

在这里插入图片描述

"-->>采购订单抬头
  LS_POHEADER-COMP_CODE  = I_HEAD-BUKRS. "公司代码
  LS_POHEADER-VENDOR     = I_HEAD-LIFNR. "供应商帐户号
  LS_POHEADER-PURCH_ORG  = I_HEAD-EKORG. "采购组织
  LS_POHEADER-PUR_GROUP  = I_HEAD-EKGRP. "采购组
  LS_POHEADER-DOC_TYPE   = I_HEAD-BSART. "采购凭证类型
  LS_POHEADER-DOC_DATE   = I_HEAD-AEDAT.
  LS_POHEADER-CURRENCY   = I_HEAD-WAERS. "货币码
  LS_POHEADER-CREATED_BY = SY-UNAME.    "创建对象的人员名称
  LS_POHEADER-COLLECT_NO = ''.
  LS_POHEADER-ITEM_INTVL = ''.

  "-->>采购订单抬头数据(更改参数)
  LS_POHEADERX-COMP_CODE  = 'X'.
  LS_POHEADERX-VENDOR     = 'X'.
  LS_POHEADERX-PURCH_ORG  = 'X'.
  LS_POHEADERX-PUR_GROUP  = 'X'.
  LS_POHEADERX-CREATED_BY = 'X'.
  LS_POHEADERX-DOC_DATE   = 'X'.
  LS_POHEADERX-DOC_TYPE   = 'X'.
  LS_POHEADERX-CURRENCY   = 'X'.
  LS_POHEADERX-COLLECT_NO = 'X'.
  LS_POHEADERX-ITEM_INTVL = 'X'.

行项目

在这里插入图片描述

交货计划行

在这里插入图片描述

条件

在这里插入图片描述

账户分配

在这里插入图片描述


    IF LS_ITEM-KNTTP = 'K'.
      LS_POACCOUNT-PO_ITEM    = LS_ITEM-EBELP.
      LS_POACCOUNT-SERIAL_NO  = 1.
      LS_POACCOUNT-COSTCENTER = LS_ITEM-KOSTL.
      LS_POACCOUNT-GL_ACCOUNT = LS_ITEM-SAKNR.
      APPEND LS_POACCOUNT TO LT_POACCOUNT.

      LS_POACCOUNTX-PO_ITEM     = LS_ITEM-EBELP.
      LS_POACCOUNTX-SERIAL_NO   = 1.
      LS_POACCOUNTX-COSTCENTER  = 'X'.
      LS_POACCOUNTX-GL_ACCOUNT  = 'X'.
      APPEND LS_POACCOUNTX TO LT_POACCOUNTX.
      CLEAR: LS_POACCOUNT,LS_POACCOUNTX.

    ELSEIF LS_ITEM-KNTTP = 'F'.
      LS_POACCOUNT-PO_ITEM    = LS_ITEM-EBELP.
      LS_POACCOUNT-SERIAL_NO  = 1.
      LS_POACCOUNT-ORDERID    = LS_ITEM-AUFNR.
      LS_POACCOUNT-GL_ACCOUNT = LS_ITEM-SAKNR.
      APPEND LS_POACCOUNT TO LT_POACCOUNT.

      LS_POACCOUNTX-PO_ITEM     = LS_ITEM-EBELP.
      LS_POACCOUNTX-SERIAL_NO   = 1.
      LS_POACCOUNTX-ORDERID     = 'X'.
      LS_POACCOUNTX-GL_ACCOUNT  = 'X'.
      APPEND LS_POACCOUNTX TO LT_POACCOUNTX.
      CLEAR: LS_POACCOUNT,LS_POACCOUNTX.
    ELSEIF LS_ITEM-KNTTP = 'M'.
      LS_POACCOUNT-PO_ITEM    = LS_ITEM-EBELP.
      LS_POACCOUNT-SERIAL_NO  = 1.
      LS_POACCOUNT-SD_DOC     = LS_ITEM-VBELN.
      LS_POACCOUNT-ITM_NUMBER = LS_ITEM-VBELP.
      APPEND LS_POACCOUNT TO LT_POACCOUNT.

      LS_POACCOUNTX-PO_ITEM     = LS_ITEM-EBELP.
      LS_POACCOUNTX-SERIAL_NO   = 1.
      LS_POACCOUNTX-SD_DOC      = 'X'.
      LS_POACCOUNTX-ITM_NUMBER  = 'X'.
      APPEND LS_POACCOUNTX TO LT_POACCOUNTX.
      CLEAR: LS_POACCOUNT,LS_POACCOUNTX.
    ELSEIF LS_ITEM-KNTTP = 'A'.
      LS_POACCOUNT-PO_ITEM      = LS_ITEM-EBELP.
      LS_POACCOUNT-SERIAL_NO    = 
<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、付费专栏及课程。

余额充值