修改采购订单使用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.