BAPI_PO_CREATE1--单价增大10倍问题

问题描述:使用BAPI:BAPI_PO_CREATE1创建PO时,出现单价比传入金额大10倍的问题。

解决方法:在table:pocond;pocondx增加币种传参

示例:

  LOOP AT lt_alv2.
    "订单抬头
    CLEAR:poheader,poheaderx,po_no.
*  poheader-po_number = .    "采购订单
    poheader-comp_code = lt_alv2-bukrs.    "公司代码
    IF lt_alv2-lifnr+4(1) = '0'.
      poheader-doc_type  = 'Z02'.    "订单类型
    ELSE.
      poheader-doc_type  = 'Z04'.    "订单类型
    ENDIF.
    poheader-vendor    = lt_alv2-lifnr.    "供应商.
    poheader-doc_date  = sy-datum.    "采购凭证日期
    poheader-purch_org = lt_alv2-ekorg.    "采购组织
    poheader-pur_group = lt_alv2-ekgrp.    "采购组
*    poheader-pmnttrms  = lt_alv2-zterm.    "付款条件
    poheader-currency  = lt_alv2-waers.    "币别
*    poheader-ref_1     = lt_alv2-ihrez.    "您的参考
*    poheader-our_ref    = lt_alv2-ebeln.    "我们的参考
*  poheader-collect_no = lt_alv2-submi.    "汇总号
    poheader-langu = sy-langu.  "语言代码
    poheader-pmnttrms  = lt_alv2-zterm.

*  poheaderx-po_number =  c_x.
    poheaderx-comp_code =  c_x.
    poheaderx-doc_type  =  c_x.
    poheaderx-vendor    =  c_x.
    poheaderx-doc_date  =  c_x.
    poheaderx-purch_org =  c_x.
    poheaderx-pur_group =  c_x.
*    poheaderx-pmnttrms  =  c_x.
    poheaderx-currency  =  c_x.
*  poheaderx-ref_1       =  c_x.
*  poheaderx-sales_pers  = c_x.
*    poheaderx-our_ref     =  c_x.
*  poheaderx-collect_no  =  c_x.
    poheaderx-langu       = c_x.           "语言代码
    poheaderx-pmnttrms  = c_x.

**行项目/计划行
    CLEAR:poitem[],poitemx[],lv_ebelp,posched[],poschedx[],pocond[],pocondx[],return[].
    LOOP AT gt_alv2 INTO gs_alv2 WHERE ebeln = lt_alv2-ebeln.
      lv_ebelp = lv_ebelp + 10.
      CLEAR:poitem,poitemx,posched,poschedx,pocond,pocondx.

      poitem-po_item     = lv_ebelp. "采购订单行项目
      poitemx-po_item    = lv_ebelp. "采购订单行项目
      poitem-acctasscat  = gs_alv2-knttp. "科目分配类别
      poitemx-acctasscat = c_x.          "科目分配类别
      poitem-item_cat    = gs_alv2-pstyp. "项目类别
      poitemx-item_cat   = c_x.          "项目类别
      poitem-material    = gs_alv2-matnr. "物料
      poitemx-material   = c_x .         "物料
      poitem-short_text  = gs_alv2-txz01. "行项目文本
      poitemx-short_text = c_x.          "行项目文本
      poitem-quantity    = gs_alv2-menge. "采购订单数量
      poitemx-quantity   = c_x .         "采购订单数量
      poitem-po_unit     = gs_alv2-meins. "订单单位
      poitemx-po_unit    = c_x.          "订单单位
      poitem-net_price   = gs_alv2-netpr. "价格
      poitemx-net_price  = c_x.          "价格
      poitem-price_unit  = gs_alv2-peinh ."价格单位
      poitemx-price_unit = c_x .         "价格单位
      poitem-orderpr_un  = gs_alv2-meins ."订单价格单位(采购).
      poitemx-orderpr_un = c_x .         "订单价格单位(采购).
      poitem-plant       = gs_alv2-werks. "工厂
      poitemx-plant      = c_x.          "工厂
      poitem-tax_code    = gs_alv2-mwskz. "税码
      poitemx-tax_code   = c_x.          "税码
      poitem-ret_item    = 'X'.         "退货项目
      poitemx-ret_item   = c_x.          "退货项目

      APPEND poitem.
      APPEND poitemx.

      posched-po_item        = lv_ebelp. "订单行项目
      posched-sched_line     = '0001'.       "计划行
      posched-delivery_date  = sy-datum. "交货日期
      posched-quantity       = gs_alv2-menge. "交货数量
      APPEND posched.
      poschedx-po_item       = lv_ebelp.
      poschedx-sched_line    = '0001'.
      poschedx-po_itemx      = c_x.
      poschedx-sched_linex   = c_x.
      poschedx-delivery_date = c_x.
      poschedx-quantity      = c_x.
      APPEND poschedx.

      IF gs_alv2-netpr > 0 AND poheader-doc_type  = 'Z04'.
        pocond-itm_number = lv_ebelp.
        pocond-cond_st_no = '001'.
        pocond-cond_type  = 'PBXX'.          "定价条件
        pocond-cond_value = gs_alv2-netpr.    "采购订单货币的订单净值
        pocond-cond_p_unt = gs_alv2-peinh .
        pocond-currency = lt_alv2-waers.

       
        ENDIF.

        APPEND pocond.

        pocondx-itm_number = lv_ebelp.
        pocondx-cond_st_no = '001'.
        pocondx-cond_type  = c_x.            "定价条件
*        pocondx-cond_count = c_x.
        pocondx-cond_value = c_x.
        pocondx-cond_p_unt = c_x.
        pocondx-currency = c_x.
        APPEND pocondx.

      ENDIF.

      gs_alv2-rbelp = lv_ebelp.
      MODIFY gt_alv2 FROM gs_alv2 TRANSPORTING rbelp.

    ENDLOOP.

    CHECK poitem[] IS NOT INITIAL.

    CALL FUNCTION 'BAPI_PO_CREATE1'
      EXPORTING
        poheader         = poheader
        poheaderx        = poheaderx
*       testrun          = l_testrun
*       no_price_from_po = 'X'           
      IMPORTING
        exppurchaseorder = po_no
      TABLES
        return           = return
        poitem           = poitem
        poitemx          = poitemx
        poschedule       = posched
        poschedulex      = poschedx
*       poaccount        = poaccount
*       poaccountx       = poaccountx
        pocond           = pocond
        pocondx          = pocondx.
*        potextitem       = potextitem
*        potextheader     = potextheader.
*       pocomponents     = pocomponents
*       pocomponentsx    = pocomponentsx.
*       extensionin      = extensionin.

    CLEAR lv_msg.

    LOOP AT return WHERE type = 'E'.
      CONCATENATE lv_msg return-message INTO lv_msg SEPARATED BY ',' .
    ENDLOOP.

    IF sy-subrc EQ 0 .
      CALL FUNCTION 'ICON_CREATE'
        EXPORTING
          name   = icon_red_light
          info   = '有错误'
        IMPORTING
          result = lt_alv2-dr.

      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

      LOOP AT gt_alv2 INTO gs_alv2 WHERE ebeln = lt_alv2-ebeln.
        gs_alv2-rbelp = ''.
        gs_alv2-dr = lt_alv2-dr.
        gs_alv2-msg = lv_msg.
        MODIFY gt_alv2 FROM gs_alv2 TRANSPORTING rbelp dr msg.
      ENDLOOP.

    ELSE.
      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.

      CALL FUNCTION 'ICON_CREATE'
        EXPORTING
          name   = icon_okay
          info   = '创建成功 '
        IMPORTING
          result = lt_alv2-dr.

      LOOP AT gt_alv2 INTO gs_alv2 WHERE ebeln = lt_alv2-ebeln.
        gs_alv2-rbeln = po_no.
        gs_alv2-dr = lt_alv2-dr.
        MODIFY gt_alv2 FROM gs_alv2 TRANSPORTING rbeln dr.
      ENDLOOP.

    ENDIF.

  ENDLOOP.

### 使用 BAPI_PO_CREATE1 增加采购订单行项目的实现方法 在 SAP 系统中,`BAPI_PO_CREATE1` 是用于创建采购订单的标准 BAPI 函数模块。为了向采购订单中新增行项目,需要正确填充 `PO_ITEMS` 参数表中的条目,并将其传递给该函数模块。 以下是关于如何通过 `BAPI_PO_CREATE1` 添加新行项目的详细说明: #### 1. **参数结构** `BAPI_PO_CREATE1` 的主要输入参数包括以下几个部分: - `PURCHASEORDERHEADER`: 包含采购订单头部信息。 - `PO_ITEMS[]`: 表示采购订单的行项目集合。 - `PO_PARTNERS[]`: 定义供应商等相关方的信息。 - `PO_ACCOUNTASSIGNMENTS[]`: 账户分配类别(如成本中心、利润中心等)。 - `PO_SCHEDULE_LINES[]`: 计划行定义交付计划。 对于新增行项目而言,重点在于正确配置 `PO_ITEMS[]` 和关联的账户分配 (`PO_ACCOUNTASSIGNMENTS`) 及计划行 (`PO_SCHEDULE_LINES`) 数据[^3]。 --- #### 2. **代码示例** 以下是一个完整的 ABAP 示例代码,展示如何使用 `BAPI_PO_CREATE1` 来增加新的采购订单行项目: ```abap DATA: ls_header TYPE bapipareh, " 头部数据 lt_items TYPE TABLE OF bapipari, " 行项目列表 ls_item TYPE bapipari, " 单个行项目 lt_account_assignments TYPE TABLE OF bapiaccassgnt, ls_account_assignment TYPE bapiaccassgnt, lt_schedule_lines TYPE TABLE OF bapischdle, ls_schedule_line TYPE bapischdle, lv_return TYPE TABLE OF bapiret2. * 设置采购订单头部信息 ls_header-purch_org = '0001'. " 采购组织 ls_header-purch_grp = '001'. " 采购组 ls_header-vendor = '1000001'. " 供应商编号 * 配置第一个行项目 CLEAR ls_item. ls_item-itemnumber = '00010'. " 行号 (固定长度) ls_item-material = 'MAT10001'. " 物料编码 ls_item-plant = 'PLANT1'. " 工厂 ls_item-currency = 'USD'. " 币种 ls_item-netprice = '100.00'. " 单价 APPEND ls_item TO lt_items. * 配置账户分配 (假设为成本中心) CLEAR ls_account_assignment. ls_account_assignment-itemno_acc = '00010'. " 对应行号 ls_account_assignment-acctasscat = 'K'. " 类型 K=成本中心 ls_account_assignment-costcenter = 'COSTCENTER100'. " 成本中心 APPEND ls_account_assignment TO lt_account_assignments. * 配置计划行 CLEAR ls_schedule_line. ls_schedule_line-item_schdl = '00010'. " 对应行号 ls_schedule_line-schedline = '0001'. " 计划行号 ls_schedule_line-deliverydate = sy-datum + 7. " 交货日期 ls_schedule_line-orderqty = '5'. " 数量 APPEND ls_schedule_line TO lt_schedule_lines. * 调用 BAPI 创建采购订单 CALL FUNCTION 'BAPI_PO_CREATE1' EXPORTING purchaseorderheader = ls_header IMPORTING exppurchaseorderid = lv_purchase_order_id TABLES po_items = lt_items po_partners = [] " 如果有合作伙伴需填写此表 po_accountassignments = lt_account_assignments po_schedulelines = lt_schedule_lines return = lv_return. IF lines( lv_return ) > 0. LOOP AT lv_return INTO DATA(ls_return). WRITE: / ls_return-message. ENDLOOP. ELSE. WRITE: / '采购订单已成功创建:', lv_purchase_order_id. ENDIF. ``` 上述代码展示了如何设置采购订单头部信息、行项目及其相关联的数据结构,并最终调用了 `BAPI_PO_CREATE1` 进行处理[^4]。 --- #### 3. **注意事项** - **前导零**: 在某些情况下,例如成本中心或总账科目的字段可能需要补充前导零才能被系统识别。如果遇到类似问题,请确保这些字段格式化正确。 - **返回值检查**: 执行完成后务必验证 `RETURN` 表的内容以确认操作状态。如果有错误发生,则可以通过消息描述定位具体原因[^2]。 - **唯一性约束**: 当尝试修改现有记录而非新建时可能会触发 “无法唯一确定更改标识”的错误(M_011),这通常是因为缺少必要的键值或者存在重复数据所致。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值