创建: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.