ABAP - 创建采购订单BAPI:BAPI_PO_CREATE1

本文详细描述了在SAP系统中创建公司内部调拨单的过程,涉及PO抬头数据、行项目和计划行的设置,以及使用BAPIPO_CREATE1函数生成订单并处理可能的错误信息。

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

**创建公司内调拨单变量
  "必要参数
  DATA: ls_poheader    TYPE bapimepoheader,               "PO抬头数据
        ls_poheaderx   TYPE bapimepoheaderx,
        lt_poitem      TYPE TABLE OF bapimepoitem,        "PO行项目
        lt_poitemx     TYPE TABLE OF bapimepoitemx,
        lt_poschedule  TYPE TABLE OF bapimeposchedule,    "PO计划行
        lt_poschedulex TYPE TABLE OF bapimeposchedulx,
        lw_poitem      TYPE bapimepoitem,                 "PO行项目
        lw_poitemx     TYPE bapimepoitemx,
        lw_poschedule  TYPE bapimeposchedule,             "PO计划行
        lw_poschedulex TYPE bapimeposchedulx,
        lt_return      TYPE TABLE OF bapiret2  WITH HEADER LINE,  "返回消息
        lv_message     TYPE bapiret2-message.

  DATA: lv_error TYPE c,            " 出错标识
        lv_ebeln TYPE ekpo-ebeln,   " 采购单号
        ebeln TYPE ekpo-ebeln,      " 采购单号
        etenr TYPE eket-etenr,      " 采购计划行计数器
        ebelp TYPE ekpo-ebelp.      " 采购行号
            
" 1、PO抬头数据
  ls_poheader-po_number    = ebeln.       " 自定义格式的采购凭证
  ls_poheader-doc_date     = sy-datum.    " 采购凭证日期,sy-datum
  ls_poheader-doc_type     = ''.          " 采购凭证类型 bsart

  ls_poheaderx-po_number   = 'X'.
  ls_poheaderx-doc_date    = 'X'.
  ls_poheaderx-doc_type    = 'X'.

  "当公司采购时
  ls_poheader-suppl_plnt   = ''.         " 供应工厂  RESWK
  ls_poheader-comp_code    = ''.         " 公司代码  BURKS
  ls_poheader-purch_org    = '8000'.     " 采购组织  
  ls_poheader-pur_group    = '023'.      " 采购组

  ls_poheaderx-suppl_plnt  = 'X'.
  ls_poheaderx-comp_code   = 'X'.
  ls_poheaderx-purch_org   = 'X'.
  ls_poheaderx-pur_group   = 'X'.

  LOOP AT lt_data INTO lw_data.
    " 2、PO行项目数据
    ebelp = ebelp + '10'.
    lw_poitem-po_item     = ebelp.                " 采购凭证的行项目编号
    lw_poitem-material    = lw_data-matnr.        " 物料代码
    lw_poitem-plant       = lw_data-reswk.        " 接收工厂
    lw_poitem-quantity    = lw_data-menge.        " 数量
    lw_poitem-stge_loc    = lw_data_lgort.        " 接收库存地点     
    lw_poitem-suppl_stloc = lw_data-reslo.        " 发货存储地点 
    lw_poitem-po_unit     = lw_data-meins.        " 采购单位
    APPEND lw_poitem TO lt_poitem.
    CLEAR  lw_poitem.

    lw_poitemx-po_item     = ebelp.
    lw_poitemx-material    = 'X'.
    lw_poitemx-plant       = 'X'.
    lw_poitemx-stge_loc    = 'X'.
    lw_poitemx-suppl_stloc = 'X'.
    lw_poitemx-quantity    = 'X'.
    lw_poitemx-po_unit     = 'X'.
    APPEND lw_poitemx TO lt_poitemx.
    CLEAR  lw_poitemx.

    " 3、计划行数据
    etenr = 1.
    lw_poschedule-po_item        = ebelp.         " 采购凭证的项目编号
    lw_poschedule-sched_line     = etenr.         " 交货计划行计数器
    lw_poschedule-delivery_date  = sy-datum.      " 交货日期
    lw_poschedule-quantity       = lw_DATA-menge. " 已计划数量
    lw_poschedule-com_qty        = lw_DATA-menge. " 承诺数量
    APPEND lw_poschedule TO lt_poschedule.
    CLEAR  lw_poschedule.

    lw_poschedulex-po_item        = ebelp.
    lw_poschedulex-sched_line     = etenr.
    lw_poschedulex-del_datcat_ext = 'X'.
    lw_poschedulex-delivery_date  = 'X'.
    lw_poschedulex-quantity       = 'X'.
    lw_poschedulex-com_qty        = 'X'.
    APPEND lw_poschedulex TO lt_poschedulex.
    CLEAR  lw_poschedulex.
  ENDLOOP.

  " 4、调用BAPI生成采购订单
  CALL FUNCTION 'BAPI_PO_CREATE1'
    EXPORTING
      poheader         = ls_poheader      " 必须参数,接收抬头数据的结构
      poheaderx        = ls_poheaderx     " 必要参数,指定poheader更新字段
    IMPORTING
      exppurchaseorder = lv_ebeln         " 建议参数,采购订单创建成功会返回一个采购订单号
    TABLES
      return           = lt_return        " 建议参数,返回报错信息
      poitem           = lt_poitem        " 必要参数,接收行项目数据的表
      poitemx          = lt_poitemx       " 必要参数,PO行项目更新字段
      poschedule       = lt_poschedule    " 必要参数,接收计划行数据的表
      poschedulex      = lt_poschedulex.  " 必要参数,PO计划行更新字段
  IF LV_EBELN NE SPACE.
    LV_MESSAGE = |生成的采购订单号为:{ LV_EBELN }|.
  ELSE.
    LOOP AT LT_RETURN WHERE TYPE = 'E'.
      LV_MESSAGE = |{ LV_MESSAGE } { LT_RETURN-MESSAGE }|.
    ENDLOOP.
  ENDIF.

### ABAP BAPI_PO_CREATE1 错误解决方案 当遇到 `BAPI_PO_CREATE1` 报错的情况时,通常可以从以下几个方面来排查和解决问题: #### 参数验证 确保传递给 `BAPI_PO_CREATE1` 的参数完全正确。任何不匹配的数据类型或错误的输入都可能导致异常抛出[^1]。 ```abap DATA: lv_return TYPE TABLE OF bapiret2, ls_purchaseorder TYPE bapi_purord. CALL FUNCTION 'BAPI_PO_CREATE1' EXPORTING purchaseorderheader = ls_purchaseorder-header IMPORTING purCHASEORDER = ls_purchaseorder-number TABLES return = lv_return. ``` 如果返回表 `lv_return` 中有条目,则表示存在某些问题;应仔细检查这些消息并修正相应字段的内容。 #### 数据一致性校验 确认采购订单中的物料编号、供应商信息以及其他相关数据的一致性和准确性。例如,在创建采购合同时使用的材料编码应该存在于系统内,并且与指定工厂相兼容。 #### 权限配置审查 有时权限不足也会引发此接口调用失败。因此建议核查当前用户的授权对象设置是否允许执行该操作以及访问所需资源。 #### 日志记录分析 启用详细的调试模式可以更深入地了解具体哪个环节出现了状况。通过查看后台日志文件或者利用 SAP GUI 内置工具(如 ST22),能够获取更多关于程序运行期间发生的事件的信息,从而帮助定位根本原因所在。 #### 测试环境模拟 在一个受控环境中重现相同的业务场景有助于排除外部因素干扰的可能性。这可能涉及到搭建专门用于测试目的的小型实例或是借助其他开发人员的帮助来进行跨部门协作诊断工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值