ABAP 创建及修改采购订单

26 篇文章 7 订阅

创建:BAPI_PO_CREATE1

修改:BAPI_PO_CHANGE

审批:BAPI_PO_RELEASE

取消审批:BAPI_PO_RESET_RELEASE(整单)

创建采购订单示例代码:

  DATA: LT_SELECT  TYPE STANDARD TABLE OF TY_EBAN.
  DATA: LT_BSART   TYPE STANDARD TABLE OF TY_EBAN.
  DATA: LS_BSART   TYPE TY_EBAN.
  DATA: LS_SELECT  TYPE TY_EBAN.
  DATA: LV_MESSAGE TYPE STRING.
  DATA: LV_EBELP   TYPE EBELP.
  DATA: LS_EBKN    TYPE TY_EBKN.
  DATA: LV_SERIAL_NO TYPE DZEKKN.
  DATA:LS_POHEADER               TYPE  BAPIMEPOHEADER,
       LS_POHEADERX              TYPE  BAPIMEPOHEADERX,
       LV_EXPPURCHASEORDER       TYPE  BAPIMEPOHEADER-PO_NUMBER,
       LS_EXPHEADER              TYPE  BAPIMEPOHEADER,
       LS_EXPPOEXPIMPHEADER      TYPE  BAPIEIKP,
       LS_RETURN                 TYPE  BAPIRET2,
       LS_POITEM                 TYPE  BAPIMEPOITEM,
       LS_POITEMX                TYPE  BAPIMEPOITEMX,
       LS_POSCHEDULE             TYPE  BAPIMEPOSCHEDULE,
       LS_POSCHEDULEX            TYPE  BAPIMEPOSCHEDULX,
       LS_POACCOUNT              TYPE  BAPIMEPOACCOUNT,
       LS_POACCOUNTPROFITSEGMENT TYPE  BAPIMEPOACCOUNTPROFITSEGMENT,
       LS_POACCOUNTX             TYPE  BAPIMEPOACCOUNTX,
       LT_RETURN                 TYPE STANDARD TABLE OF BAPIRET2,
       LT_POITEM                 TYPE STANDARD TABLE OF   BAPIMEPOITEM,
       LT_POITEMX                TYPE STANDARD TABLE OF   BAPIMEPOITEMX,
       LT_POSCHEDULE             TYPE STANDARD TABLE OF   BAPIMEPOSCHEDULE,
       LT_POSCHEDULEX            TYPE STANDARD TABLE OF   BAPIMEPOSCHEDULX,
       LT_POACCOUNT              TYPE STANDARD TABLE OF   BAPIMEPOACCOUNT,
       LT_POACCOUNTPROFITSEGMENT TYPE STANDARD TABLE OF   BAPIMEPOACCOUNTPROFITSEGMENT,
       LT_POACCOUNTX             TYPE STANDARD TABLE OF   BAPIMEPOACCOUNTX.

LOOP AT LT_SELECT INTO LS_SELECT .
    CLEAR LS_POHEADER.
    CLEAR LS_POHEADERX.
    CLEAR LT_RETURN.
    CLEAR LT_POITEM.
    CLEAR LT_POITEMX.
    CLEAR LT_POSCHEDULE.
    CLEAR LT_POSCHEDULEX.
    CLEAR LT_POACCOUNT.
    CLEAR LT_POACCOUNTX.


    READ TABLE GT_PRICE INTO GS_PRICE INDEX 1.

    LS_POHEADER-DOC_DATE   = SY-DATUM.                                       "采购凭证日期'20161001'.
    LS_POHEADER-DOC_TYPE   = LS_SELECT-BSART.                                       "采购凭证类型'Z001'.
    LS_POHEADER-LANGU      = SY-LANGU.                                           "采购凭证类别'F'.
    LS_POHEADER-PUR_GROUP  = LS_SELECT-EKGRP.                                      "采购组'EA1'.
    LS_POHEADER-PURCH_ORG  = '2490'.                                      "采购组织'2110'.
    LS_POHEADER-COMP_CODE  = '2490'.                                      "公司代码'2110'.
    "LS_POHEADER-SALES_PERS = LS_SELECT-VERKF.
    LS_POHEADER-CURRENCY   = 'CNY'.                                      "货币码'CNY'.

    IF LS_SELECT-BSART = 'Z001' OR LS_SELECT-BSART = 'Z003'.
      LS_POHEADER-VENDOR     = GS_PRICE-LIFNR.
    ELSEIF  LS_SELECT-BSART = 'Z002' OR LS_SELECT-BSART = 'Z004'.
      CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
        EXPORTING
          INPUT  = GV_LIFNR
        IMPORTING
          OUTPUT = LS_POHEADER-VENDOR.
    ENDIF.

    LS_POHEADER-ITEM_INTVL = SPACE. "指定行项目编号

    LS_POHEADERX-DOC_DATE   = 'X'.
    LS_POHEADERX-DOC_TYPE   = 'X'.
    LS_POHEADERX-LANGU      = 'X'.
    LS_POHEADERX-PUR_GROUP  = 'X'.
    LS_POHEADERX-PURCH_ORG  = 'X'.
    LS_POHEADERX-COMP_CODE  = 'X'.
    "LS_POHEADERX-SALES_PERS = 'X'.
    LS_POHEADERX-CURRENCY   = 'X'.
    LS_POHEADERX-VENDOR     = 'X'."供应商账户号.
    LS_POHEADERX-ITEM_INTVL = 'X'.

    CLEAR:LV_EBELP.
    LOOP AT GT_EBAN INTO GS_EBAN WHERE BANFN = LS_SELECT-BANFN AND BOX IS NOT INITIAL.
      CLEAR LS_POITEM.



      LV_EBELP = LV_EBELP + 10.
      LS_POITEM-PO_ITEM    = LV_EBELP.                           "采购凭证项目编号'10'.
      LS_POITEM-MATERIAL   = GS_EBAN-MATNR.                           "物料号'000000001300000001'.
      LS_POITEM-QUANTITY   = GS_EBAN-MENGE."数量
      LS_POITEM-SHORT_TEXT = GS_EBAN-TXZ01.                            "短文本.
      LS_POITEM-PREQ_NAME  = GS_EBAN-AFNAM.                            "需求者/请求者姓名.
      LS_POITEM-PLANT      = GS_EBAN-WERKS.                 "工厂'2110'.
      LS_POITEM-PO_PRICE   = '1'.                                      "标识符:采用价格-不使用信息结构
      "LS_POITEM-STGE_LOC   = GS_EBAN-LGORT.                              "库存地点
      LS_POITEM-TRACKINGNO = GS_EBAN-BEDNR.                            "跟踪号
      LS_POITEM-MATL_GROUP = GS_EBAN-MATKL.                                  "物料组
      LS_POITEM-PO_UNIT    = GS_EBAN-MEINS.                                        "订单单位'EA'.
      LS_POITEM-ORDERPR_UN = GS_EBAN-MEINS.                           "订单价格单位
      "LS_POITEM-CONV_NUM1  = GS_EBAN-BPUMZ .                            "分子
      "LS_POITEM-CONV_DEN1  = GS_EBAN-BPUMN.                             "分母
      LS_POITEM-TAX_CODE   = 'J2'.                               "税码
      IF LS_SELECT-BSART = 'Z001' OR LS_SELECT-BSART = 'Z003'.
        READ TABLE GT_PRICE INTO GS_PRICE
        WITH KEY MATNR = GS_EBAN-MATNR .
        IF SY-SUBRC = 0.
          LS_POITEM-NET_PRICE  = GS_PRICE-NETPR.                           "净价
          LS_POITEM-AGREEMENT  = GS_PRICE-EBELN.
          LS_POITEM-AGMT_ITEM  = GS_PRICE-EBELP.

        ENDIF.
      ELSEIF  LS_SELECT-BSART = 'Z002' OR LS_SELECT-BSART = 'Z004'..
        READ TABLE GT_PRICE INTO GS_PRICE
        WITH KEY TXZ01 = GS_EBAN-TXZ01 .
        IF SY-SUBRC = 0.
          LS_POITEM-NET_PRICE  = GS_PRICE-NETPR.                           "净价
        ENDIF.
      ENDIF.


      LS_POITEM-PRICE_UNIT = '1'   .                                  "价格单位1
      LS_POITEM-ACCTASSCAT = GS_EBAN-KNTTP.                           "科目分配类别
      LS_POITEM-ITEM_CAT   = GS_EBAN-PSTYP.                           "项目类别
      LS_POITEM-PREQ_NO    = GS_EBAN-BANFN.
      LS_POITEM-PREQ_ITEM  = GS_EBAN-BNFPO.
      APPEND LS_POITEM TO LT_POITEM .



      CLEAR LS_POITEMX.
      LS_POITEMX-PO_ITEM    =   LV_EBELP. "采购凭证项目编号.
      IF GS_EBAN-MATNR IS NOT INITIAL.
        LS_POITEMX-MATERIAL   = 'X'."物料号
      ENDIF.
      LS_POITEMX-QUANTITY   = 'X'."数量
      IF GS_EBAN-TXZ01 IS NOT INITIAL.
        LS_POITEMX-SHORT_TEXT  = 'X'."短文本.
      ENDIF.
      LS_POITEMX-PREQ_NAME   = 'X'.
      LS_POITEMX-PLANT       = 'X'."工厂
      LS_POITEMX-PO_PRICE   = 'X'."标识符:采用价格-不使用信息结构
      "LS_POITEMX-STGE_LOC   = 'X'."库存地点
      LS_POITEMX-TRACKINGNO = 'X'. "跟踪号
      LS_POITEMX-MATL_GROUP = 'X'."物料组
      LS_POITEMX-PO_UNIT    = 'X'."订单单位'EA'.
      LS_POITEMX-ORDERPR_UN = 'X'."订单价格单位
      "LS_POITEMX-CONV_NUM1  = 'X'."分子
      "LS_POITEMX-CONV_DEN1  = 'X'."分母
      LS_POITEMX-TAX_CODE   = 'X'."税码
      LS_POITEMX-NET_PRICE  = 'X'."净价
      IF LS_SELECT-BSART = 'Z001' OR  LS_SELECT-BSART = 'Z003'.
        LS_POITEMX-AGREEMENT  = 'X'.
        LS_POITEMX-AGMT_ITEM  = 'X'.
      ENDIF.
      LS_POITEMX-PRICE_UNIT = 'X'."价格单位
      LS_POITEMX-ACCTASSCAT = 'X'."科目分配类别
      LS_POITEMX-ITEM_CAT   = 'X'."项目类别
      IF GS_EBAN-SAKTO IS NOT INITIAL.
        LS_POITEMX-PO_ITEMX    = 'X'."
      ENDIF.
      LS_POITEMX-PREQ_NO    = 'X'.
      LS_POITEMX-PREQ_ITEM  = 'X'.
      APPEND LS_POITEMX TO LT_POITEMX .

      IF LS_SELECT-BSART = 'Z002'.

        CLEAR LS_POACCOUNT.
        LS_POACCOUNT-PO_ITEM     = LV_EBELP.
        LS_POACCOUNT-SERIAL_NO   = '01'.
        LS_POACCOUNT-QUANTITY    = GS_EBAN-MENGE.                     "采购订单数量
        LS_POACCOUNT-COSTCENTER  = GS_EBAN-KOSTL."成本中心
        LS_POACCOUNT-CO_AREA     = GS_EBAN-KOKRS."总账科目
        LS_POACCOUNT-GL_ACCOUNT  = GS_EBAN-SAKTO."控制范围
        APPEND LS_POACCOUNT TO LT_POACCOUNT.

        CLEAR:LS_POACCOUNTX.
        LS_POACCOUNTX-PO_ITEM      =  LV_EBELP. "采购订单行项目
        LS_POACCOUNTX-SERIAL_NO    = '01'.
        LS_POACCOUNTX-QUANTITY     = 'X'.       "申请数量
        LS_POACCOUNTX-COSTCENTER   = 'X'.
        LS_POACCOUNTX-CO_AREA      = 'X'.
        LS_POACCOUNTX-GL_ACCOUNT   = 'X'.
        APPEND LS_POACCOUNTX TO LT_POACCOUNTX.
      ENDIF.
      CLEAR:LV_SERIAL_NO.
      IF LS_SELECT-BSART = 'Z004'.
        LOOP AT GS_EBAN-EBKN INTO LS_EBKN.
          LV_SERIAL_NO = LV_SERIAL_NO + 1.
          CLEAR LS_POACCOUNT.
          LS_POACCOUNT-PO_ITEM     = LV_EBELP.
          LS_POACCOUNT-SERIAL_NO   = LV_SERIAL_NO.
          LS_POACCOUNT-QUANTITY    = LS_EBKN-MENGE.                     "采购订单数量
          LS_POACCOUNT-COSTCENTER  = GS_EBAN-KOSTL."成本中心
          LS_POACCOUNT-CO_AREA     = GS_EBAN-KOKRS."总账科目
          LS_POACCOUNT-GL_ACCOUNT  = LS_EBKN-SAKTO."控制范围
          LS_POACCOUNT-ORDERID     = LS_EBKN-AUFNR."控制范围
          LS_POACCOUNT-ASSET_NO    = LS_EBKN-ANLN1 .
          APPEND LS_POACCOUNT TO LT_POACCOUNT.

          CLEAR:LS_POACCOUNTX.
          LS_POACCOUNTX-PO_ITEM      =  LV_EBELP. "采购订单行项目
          LS_POACCOUNTX-SERIAL_NO    =  LV_SERIAL_NO.
          LS_POACCOUNTX-QUANTITY     = 'X'.       "申请数量
          LS_POACCOUNTX-COSTCENTER   = 'X'.
          LS_POACCOUNTX-CO_AREA      = 'X'.
          LS_POACCOUNTX-GL_ACCOUNT   = 'X'.
          LS_POACCOUNTX-ORDERID      = 'X'.
          LS_POACCOUNTX-ASSET_NO     = 'X'.
          APPEND LS_POACCOUNTX TO LT_POACCOUNTX.
        ENDLOOP.
      ENDIF.

      CLEAR LS_POSCHEDULE.
      LS_POSCHEDULE-PO_ITEM        = LV_EBELP.                            "行项目号
      LS_POSCHEDULE-QUANTITY       = GS_EBAN-MENGE.                       "采购订单数量
      LS_POSCHEDULE-SCHED_LINE     = '0001'.                             "交货计划行计数器'0001'.
      LS_POSCHEDULE-DELIVERY_DATE  = GS_EBAN-LFDAT.                      "项目交货日期'20161010'.
      LS_POSCHEDULE-PREQ_NO        = GS_EBAN-BANFN.
      LS_POSCHEDULE-PREQ_ITEM      = GS_EBAN-BNFPO.
      APPEND LS_POSCHEDULE TO LT_POSCHEDULE.

      CLEAR LS_POSCHEDULEX.
      LS_POSCHEDULEX-PO_ITEM       = LV_EBELP."行项目号
      LS_POSCHEDULEX-QUANTITY      = 'X'."采购订单数量
      LS_POSCHEDULEX-SCHED_LINE    = '0001'."交货计划行计数器.
      LS_POSCHEDULEX-DELIVERY_DATE = 'X'."项目交货日期.
      LS_POSCHEDULEX-PREQ_NO        = 'X'.
      LS_POSCHEDULEX-PREQ_ITEM      = 'X'.
      IF GS_EKPO-SAKTO IS NOT INITIAL.
        LS_POSCHEDULEX-PO_ITEMX      = 'X'.".
      ENDIF.
      APPEND LS_POSCHEDULEX TO LT_POSCHEDULEX.


    ENDLOOP.

    CALL FUNCTION 'BAPI_PO_CREATE1'
      EXPORTING
        POHEADER          = LS_POHEADER
        POHEADERX         = LS_POHEADERX
*       NO_PRICE_FROM_PO  = 'X'
      IMPORTING
        EXPPURCHASEORDER  = LV_EXPPURCHASEORDER
        EXPHEADER         = LS_EXPHEADER
        EXPPOEXPIMPHEADER = LS_EXPPOEXPIMPHEADER
      TABLES
        RETURN            = LT_RETURN
        POITEM            = LT_POITEM
        POITEMX           = LT_POITEMX
        POSCHEDULE        = LT_POSCHEDULE
        POSCHEDULEX       = LT_POSCHEDULEX
        POACCOUNT         = LT_POACCOUNT
        POACCOUNTX        = LT_POACCOUNTX.
    LOOP AT LT_RETURN INTO LS_RETURN WHERE TYPE CA 'AEX'.
      LV_MESSAGE = LV_MESSAGE  && LS_RETURN-MESSAGE.
    ENDLOOP.
    IF LV_MESSAGE IS NOT INITIAL .
      CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.

      LOOP AT GT_EBAN INTO GS_EBAN WHERE BOX IS NOT INITIAL   .
        GS_EBAN-MSG   = LV_MESSAGE.
        GS_EBAN-ICON  = ICON_LED_RED.
        MODIFY GT_EBAN FROM GS_EBAN.
      ENDLOOP.

    ELSE.

      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
        EXPORTING
          WAIT = 'X'.
      LOOP AT GT_EBAN INTO GS_EBAN WHERE BOX IS NOT INITIAL   .
        "GS_EBAN-BANFN = LV_EXPPURCHASEORDER.
        GS_EBAN-ICON  = ICON_LED_GREEN.
        MODIFY GT_EBAN FROM GS_EBAN.
      ENDLOOP.
      PERFORM FRM_GET_SINGLE_PO USING LV_EXPPURCHASEORDER.
      PERFORM FRM_RELEASE_PO USING LV_EXPPURCHASEORDER .
    ENDIF.
  ENDLOOP.

修改采购订单代码类似

主要是修改采购价格有点不太一样

  DATA:LS_POHEADER               TYPE  BAPIMEPOHEADER,
       LS_POHEADERX              TYPE  BAPIMEPOHEADERX,
       LV_EXPPURCHASEORDER       TYPE  BAPIMEPOHEADER-PO_NUMBER,
       LS_EXPHEADER              TYPE  BAPIMEPOHEADER,
       LS_EXPPOEXPIMPHEADER      TYPE  BAPIEIKP,
       LS_RETURN                 TYPE  BAPIRET2,
       LS_POITEM                 TYPE  BAPIMEPOITEM,
       LS_POITEMX                TYPE  BAPIMEPOITEMX,
       LS_POSCHEDULE             TYPE  BAPIMEPOSCHEDULE,
       LS_POSCHEDULEX            TYPE  BAPIMEPOSCHEDULX,
       LS_POACCOUNT              TYPE  BAPIMEPOACCOUNT,
       LS_POACCOUNTPROFITSEGMENT TYPE  BAPIMEPOACCOUNTPROFITSEGMENT,
       LS_POACCOUNTX             TYPE  BAPIMEPOACCOUNTX,
       LS_POCOND                 TYPE  BAPIMEPOCOND,
       LS_POCONDX                TYPE  BAPIMEPOCONDX,
       LT_RETURN                 TYPE STANDARD TABLE OF BAPIRET2,
       LT_POITEM                 TYPE STANDARD TABLE OF   BAPIMEPOITEM,
       LT_POITEMX                TYPE STANDARD TABLE OF   BAPIMEPOITEMX,
       LT_POSCHEDULE             TYPE STANDARD TABLE OF   BAPIMEPOSCHEDULE,
       LT_POSCHEDULEX            TYPE STANDARD TABLE OF   BAPIMEPOSCHEDULX,
       LT_POACCOUNT              TYPE STANDARD TABLE OF   BAPIMEPOACCOUNT,
       LT_POACCOUNTPROFITSEGMENT TYPE STANDARD TABLE OF   BAPIMEPOACCOUNTPROFITSEGMENT,
       LT_POACCOUNTX             TYPE STANDARD TABLE OF   BAPIMEPOACCOUNTX,
       LT_POCOND                 TYPE STANDARD TABLE OF   BAPIMEPOCOND,
       LT_POCONDX                TYPE STANDARD TABLE OF   BAPIMEPOCONDX.

        CLEAR: LS_POCOND,LS_POCONDX .
        LS_POCOND-ITM_NUMBER = GS_EKPO-EBELP ..
        LS_POCOND-COND_TYPE  = 'PBXX' .
        LS_POCOND-COND_VALUE = GS_EKPO-NETPR.
        LS_POCOND-CURRENCY   = LS_TEMP-WAERS .
        LS_POCOND-CHANGE_ID  = 'U' ." (I -> insert), changed (U -> update), or deleted (D -> delete)
        APPEND LS_POCOND TO LT_POCOND .

        LS_POCONDX-ITM_NUMBER = GS_EKPO-EBELP .
        LS_POCONDX-COND_TYPE  = 'X' .
        LS_POCONDX-COND_VALUE = 'X' .
        LS_POCONDX-CURRENCY   = 'X'.
        LS_POCONDX-CHANGE_ID  = 'X' ." (I -> insert), changed (U -> update), or deleted (D -> delete)
        APPEND LS_POCONDX TO LT_POCONDX .

    CALL FUNCTION 'BAPI_PO_CHANGE'
      EXPORTING
        PURCHASEORDER = LS_TEMP-EBELN
        POHEADER      = LS_POHEADER
        POHEADERX     = LS_POHEADERX
      TABLES
        RETURN        = LT_RETURN
        POITEM        = LT_POITEM
        POITEMX       = LT_POITEMX
        POSCHEDULE    = LT_POSCHEDULE
        POSCHEDULEX   = LT_POSCHEDULEX
        POACCOUNT     = LT_POACCOUNT
        POACCOUNTX    = LT_POACCOUNTX
        POCOND        = LT_POCOND
        POCONDX       = LT_POCONDX.

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值