SAP-ABAP-创建采购订单bapi-BAPI_PO_CREATE1注意事项

修改采购订单使用bapi:BAPI_PO_CHANGE

比如我有一张下图所示采购订单,我想修改交货排程明细。

函数中表POSCHEDULE;POSCHEDULEX的数据控制交货排程明细

 

表中 delete_ind赋值为L代表删除该行,如果是修改该行数据,改字段保持空即可。特殊情况,如果你想删除该行,但是该行已交货数量不为0,那么会删除失败,也不会报错

 

 

附上创建采购订单BAPI的代码


*"-- Check import data --"
    LV_IND_CONT = ABAP_TRUE.  "assume there is no error for import data
    PERFORM CHECK_HEADER_DATA CHANGING PI_POHEADER PE_RETURN.
    PERFORM CHECK_ITEM_DATA   CHANGING PT_POITEM[] PE_RETURN.

*"-- Prepare data --"
    IF LV_IND_CONT = ABAP_TRUE.
      LV_IND_PO_CREATE = ABAP_TRUE. "assume there is no error to create PO
      PERFORM PREPARE_HEADER_DATA CHANGING PI_POHEADER PT_POITEM[] PE_RETURN.
      PERFORM PREPARE_ITEM_DATA   USING PI_POHEADER CHANGING PT_POITEM[] PE_RETURN.
    ENDIF.

*"-- PO Creation --"
    IF LV_IND_PO_CREATE = ABAP_TRUE.
      CLEAR: LS_BAPI_POHEADER, LS_BAPI_POHEADERX, LT_BAPI_EXTENSIONIN, LT_BAPI_HEADERTEXT.
      CLEAR: LT_BAPI_POITEM   ,LT_BAPI_POITEMX,
             LT_BAPI_ACCOUNT  ,LT_BAPI_ACCOUNTX,
             LT_BAPI_SCHEDULE ,LT_BAPI_SCHEDULEX,
             LT_BAPI_ADDRESS  ,LT_BAPI_ITEMTEXT.
      PERFORM MAPPING_HEADER_DATA USING PI_POHEADER CHANGING LS_BAPI_POHEADER LS_BAPI_POHEADERX LT_BAPI_EXTENSIONIN LT_BAPI_HEADERTEXT.
      PERFORM MAPPING_ITEM_DATA   USING    PT_POITEM[]
                                  CHANGING LT_BAPI_POITEM   LT_BAPI_POITEMX
                                           LT_BAPI_ACCOUNT  LT_BAPI_ACCOUNTX
                                           LT_BAPI_SCHEDULE LT_BAPI_SCHEDULEX
                                           LT_BAPI_ADDRESS  LT_BAPI_ITEMTEXT.
      CLEAR: LV_PONUMBER, LS_RETURN, LT_RETURN.
      CALL FUNCTION 'BAPI_PO_CREATE1'
        EXPORTING
          POHEADER         = LS_BAPI_POHEADER
          POHEADERX        = LS_BAPI_POHEADERX
*         POADDRVENDOR     =
*         TESTRUN          =
*         MEMORY_UNCOMPLETE =
*         MEMORY_COMPLETE  =
*         POEXPIMPHEADER   =
*         POEXPIMPHEADERX  =
*         VERSIONS         =
          NO_MESSAGING     = 'X'
*         NO_MESSAGE_REQ   =
*         NO_AUTHORITY     = 'X'
          NO_PRICE_FROM_PO = 'X'
*         PARK_COMPLETE    =
*         PARK_UNCOMPLETE  =
        IMPORTING
          EXPPURCHASEORDER = LV_PONUMBER
        TABLES
          RETURN           = LT_RETURN
          POITEM           = LT_BAPI_POITEM
          POITEMX          = LT_BAPI_POITEMX
          POADDRDELIVERY   = LT_BAPI_ADDRESS
          POSCHEDULE       = LT_BAPI_SCHEDULE
          POSCHEDULEX      = LT_BAPI_SCHEDULEX
          POACCOUNT        = LT_BAPI_ACCOUNT
          POACCOUNTX       = LT_BAPI_ACCOUNTX
          POTEXTHEADER     = LT_BAPI_HEADERTEXT
          POTEXTITEM       = LT_BAPI_ITEMTEXT
          EXTENSIONIN      = LT_BAPI_EXTENSIONIN.

      READ TABLE LT_RETURN WITH KEY TYPE = 'E' TRANSPORTING NO FIELDS.
      IF SY-SUBRC <> 0.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            WAIT = 'X'.
      ENDIF .

 

上面代码的PERFORM如下,具体逻辑根据实际情况修改


FORM CHECK_HEADER_DATA CHANGING PI_POHEADER LIKE ZPOHEADER
                                PE_RETURN   LIKE BAPIRET2.
  "採購文件類型不可為空值,也只能為ZKMA, ZKWA, ZLGA
  IF PI_POHEADER-BSART <> 'ZUCB'
    AND PI_POHEADER-BSART <> 'ZUCZ'
      AND PI_POHEADER-BSART <> 'ZUCF'
        AND PI_POHEADER-BSART <> 'ZWB '
        AND PI_POHEADER-BSART <> 'ZNL'.
    CLEAR LS_TLINE.
    LS_TLINE-TDFORMAT = '*'.
    CONCATENATE '採購單表頭的訂單類型必須為'
                '進口ZUCB)、'
                '專場(ZUCZ)、'
                '打稅進口(ZUCF)、'
                '委外(ZWB)、'
                '國購(ZNL)'
                INTO LS_TLINE-TDLINE.
    APPEND LS_TLINE TO LT_TLINE.
    PE_RETURN-TYPE = 'E'.
    PE_RETURN-MESSAGE = LS_TLINE-TDLINE.
    LV_IND_CONT = ABAP_FALSE.
  ENDIF.
  "供應商號碼不可為空值
  IF PI_POHEADER-LIFNR IS INITIAL.
    CLEAR LS_TLINE.
    LS_TLINE-TDFORMAT = '*'.
    CONCATENATE '供應商號碼不可為空值' ''INTO LS_TLINE-TDLINE.
    APPEND LS_TLINE TO LT_TLINE.
    PE_RETURN-TYPE = 'E'.
    PE_RETURN-MESSAGE = LS_TLINE-TDLINE.
    LV_IND_CONT = ABAP_FALSE.
  ENDIF.
  "採購組織不可為空值
  IF PI_POHEADER-EKORG IS INITIAL.
    CLEAR LS_TLINE.
    LS_TLINE-TDFORMAT = '*'.
    CONCATENATE '採購組織不可為空值' '' INTO LS_TLINE-TDLINE.
    APPEND LS_TLINE TO LT_TLINE.
    PE_RETURN-TYPE = 'E'.
    PE_RETURN-MESSAGE = LS_TLINE-TDLINE.
    LV_IND_CONT = ABAP_FALSE.
  ENDIF.
  "若採購單類型為 : ZMCA,則流程代碼欄位不可為空值
  IF PI_POHEADER-BSART = 'ZMCA'
    AND PI_POHEADER-ZZFCODE IS INITIAL.
    CLEAR LS_TLINE.
    LS_TLINE-TDFORMAT = '*'.
    CONCATENATE '流程代碼不可為空值' '' INTO LS_TLINE-TDLINE.
    APPEND LS_TLINE TO LT_TLINE.
    PE_RETURN-TYPE = 'E'.
    PE_RETURN-MESSAGE = LS_TLINE-TDLINE.
    LV_IND_CONT = ABAP_FALSE.
  ENDIF.
ENDFORM.

FORM CHECK_ITEM_DATA   CHANGING PT_POITEM LIKE LT_POITEM
                                PE_RETURN LIKE BAPIRET2.
  LOOP AT PT_POITEM INTO LS_POITEM.
    CLEAR: LS_TLINE.
    IF LS_POITEM-EBELP IS INITIAL.
      LS_TLINE-TDLINE = '採購文件的項目不可為空值'.
    ENDIF.
    IF LS_POITEM-MATNR IS INITIAL.
      LS_TLINE-TDLINE = '物料號碼不可為空值'.
    ENDIF.
    IF LS_POITEM-WERKS IS INITIAL.
      LS_TLINE-TDLINE = '工廠不可為空值'.
    ENDIF.
    IF LS_POITEM-LGORT IS INITIAL.
      LS_TLINE-TDLINE = '儲存地點不可為空值'.
    ENDIF.
    IF LS_POITEM-MENGE IS INITIAL AND LS_POITEM-MENGE = 0.
      LS_TLINE-TDLINE = '採購單數量不可為空值'.
    ENDIF.
    IF LS_POITEM-NETPR IS INITIAL AND LS_POITEM-NETPR = 0.
      LS_TLINE-TDLINE = '淨價不可為空值'.
    ENDIF.
    IF LS_POITEM-PEINH IS INITIAL AND LS_POITEM-PEINH = 0.
      LS_TLINE-TDLINE = '價格單位不可為空值'.
    ENDIF.
    IF LS_POITEM-MWSKZ IS INITIAL.
      LS_TLINE-TDLINE = '營業稅代碼不可為空值'.
    ENDIF.
    IF LS_POITEM-EINDT IS INITIAL.
      LS_TLINE-TDLINE = '交貨日期不可為空值'.
    ENDIF.
    IF LS_TLINE IS NOT INITIAL.
      LS_TLINE-TDFORMAT = '*'.
      APPEND LS_TLINE TO LT_TLINE.
      PE_RETURN-TYPE = 'E'.
      PE_RETURN-MESSAGE = LS_TLINE-TDLINE.
      LV_IND_CONT = ABAP_FALSE.
    ENDIF.
*    IF LS_POITEM-EBELP IS INITIAL
*     OR LS_POITEM-MATNR IS INITIAL
*      OR LS_POITEM-WERKS IS INITIAL
*       OR LS_POITEM-LGORT IS INITIAL
*        OR ( LS_POITEM-MENGE IS INITIAL AND LS_POITEM-MENGE = 0 )
*         OR ( LS_POITEM-NETPR IS INITIAL AND LS_POITEM-NETPR = 0 )
*          OR ( LS_POITEM-PEINH IS INITIAL AND LS_POITEM-PEINH = 0 )
*           OR LS_POITEM-MWSKZ IS INITIAL
*            OR LS_POITEM-EINDT IS INITIAL.
*      CLEAR LS_TLINE.
*      LS_TLINE-TDFORMAT = '*'.
*      CONCATENATE '採購文件的項目,'
*                  '物料號碼,'
*                  '工廠,'
*                  '儲存地點,'
*                  '採購單數量,'
*                  '淨價,'
*                  '價格單位,'
*                  '營業稅代碼,'
*                  '交貨日期,'
*                  '任一皆不可為空值' INTO LS_TLINE-TDLINE.
*      APPEND LS_TLINE TO LT_TLINE.
*      PE_RETURN-TYPE = 'E'.
*      PE_RETURN-MESSAGE = LS_TLINE-TDLINE.
*      LV_IND_CONT = ABAP_FALSE.
*    ENDIF.
  ENDLOOP.
ENDFORM.

FORM PREPARE_HEADER_DATA CHANGING PI_POHEADER LIKE ZPOHEADER
                                  PT_POITEM   LIKE LT_POITEM
                                  PE_RETURN   LIKE BAPIRET2.
  READ TABLE PT_POITEM INTO LS_POITEM INDEX 1.
  " get burks
  IF PI_POHEADER-BUKRS IS INITIAL.
    SELECT SINGLE T001K~BUKRS
      INTO PI_POHEADER-BUKRS
      FROM T001W
     INNER JOIN T001K ON T001W~BWKEY = T001K~BWKEY
     WHERE T001W~WERKS = LS_POITEM-WERKS.
  ENDIF.
  " get ZTERM
  IF PI_POHEADER-ZTERM IS INITIAL.
    SELECT SINGLE ZTERM
      INTO PI_POHEADER-ZTERM
      FROM LFB1
     WHERE LIFNR = PI_POHEADER-LIFNR
       AND BUKRS = PI_POHEADER-BUKRS.

    IF SY-SUBRC <> 0.
      SELECT SINGLE ZTERM
        INTO PI_POHEADER-ZTERM
        FROM LFB1
       WHERE LIFNR = PI_POHEADER-LIFNR.
    ENDIF.
  ENDIF.
  " get EKGRP
  IF PI_POHEADER-EKGRP IS INITIAL.
    SELECT SINGLE EKGRP
      INTO PI_POHEADER-EKGRP
      FROM MARC
     WHERE MATNR = LS_POITEM-MATNR
       AND WERKS = LS_POITEM-WERKS.

    IF SY-SUBRC <> 0.
      SELECT SINGLE EKGRP
        INTO PI_POHEADER-EKGRP
        FROM MARC
       WHERE MATNR = LS_POITEM-MATNR.
    ENDIF.
  ENDIF.
  " get WAERS
  IF PI_POHEADER-WAERS IS INITIAL.
    SELECT SINGLE WAERS
      INTO PI_POHEADER-WAERS
      FROM LFB1
     WHERE LIFNR = PI_POHEADER-LIFNR
       AND BUKRS = PI_POHEADER-BUKRS.

    IF SY-SUBRC <> 0.
      SELECT SINGLE WAERS
        INTO PI_POHEADER-WAERS
        FROM LFB1
       WHERE LIFNR = PI_POHEADER-LIFNR.
    ENDIF.
  ENDIF.
  " get INCO1 and INCO2
  IF PI_POHEADER-INCO1 IS INITIAL
    OR PI_POHEADER-INCO2 IS INITIAL.
    SELECT SINGLE INCO1 INCO2
      INTO (PI_POHEADER-INCO1,PI_POHEADER-INCO2)
      FROM LFM1
     WHERE LIFNR = PI_POHEADER-LIFNR
       AND EKGRP = PI_POHEADER-EKORG.

    IF SY-SUBRC <> 0.
      SELECT SINGLE INCO1 INCO2
        INTO (PI_POHEADER-INCO1,PI_POHEADER-INCO2)
        FROM LFM1
       WHERE LIFNR = PI_POHEADER-LIFNR.
    ENDIF.
  ENDIF.
ENDFORM.

FORM PREPARE_ITEM_DATA USING    PI_POHEADER LIKE ZPOHEADER
                       CHANGING PT_POITEM   LIKE LT_POITEM
                                PE_RETURN   LIKE BAPIRET2.
  LOOP AT PT_POITEM INTO LS_POITEM.
    LV_TABIX = SY-TABIX.
    " get material text
    IF LS_POITEM-TXZ01 IS INITIAL.
      SELECT SINGLE MAKTX
        INTO LS_POITEM-TXZ01
        FROM MAKT
       WHERE MATNR = LS_POITEM-MATNR
         AND SPRAS = SY-LANGU.

      IF SY-SUBRC <> 0.
        SELECT SINGLE MAKTX
          INTO LS_POITEM-TXZ01
          FROM MAKT
         WHERE MATNR = LS_POITEM-MATNR
           AND ( SPRAS = 'M' OR SPRAS = 'ZF' ).
      ENDIF.
    ENDIF.
    " get material group
    IF LS_POITEM-MATKL IS INITIAL.
      SELECT SINGLE MATKL
        INTO LS_POITEM-MATKL
        FROM MARA
       WHERE MATNR = LS_POITEM-MATNR.
    ENDIF.
    " get meins
    IF LS_POITEM-MEINS IS INITIAL.
      SELECT SINGLE MEINS
        INTO LS_POITEM-MEINS
        FROM MARA
       WHERE MATNR = LS_POITEM-MATNR.
    ENDIF.
    " check 科目指派種類(KNTTP)競價平台若沒提供,由程式判斷文件類型,若文件類型為 ZKMA時,程式固定”K”
    IF PI_POHEADER-BSART = 'ZKMA'.
      LS_POITEM-KNTTP = 'K'.
    ENDIF.
    MODIFY PT_POITEM FROM LS_POITEM INDEX LV_TABIX.
  ENDLOOP.
ENDFORM.

 

附修改采购订单审批状态bapi代码,字段PO_REL_CODE的值存储在表T16FS中,赋值自己选择需要的状态


            CALL FUNCTION 'BAPI_PO_RELEASE'
              EXPORTING
                PURCHASEORDER          = LV_PONUMBER
                PO_REL_CODE            = LV_CODE
*               USE_EXCEPTIONS         = 'X'
*               NO_COMMIT              = ' '
* IMPORTING
*               REL_STATUS_NEW         =
*               REL_INDICATOR_NEW      =
*               RET_CODE               =
              TABLES
                RETURN                 = LT_RETURN
              EXCEPTIONS
                AUTHORITY_CHECK_FAIL   = 1
                DOCUMENT_NOT_FOUND     = 2
                ENQUEUE_FAIL           = 3
                PREREQUISITE_FAIL      = 4
                RELEASE_ALREADY_POSTED = 5
                RESPONSIBILITY_FAIL    = 6
                OTHERS                 = 7.

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值