公司搞VMI,部分订单在SRM上输入,调用SAP的接口生成 PO 返回凭证。
接口操作

前台操作


原先想的是生成采购订单,更改这个数量需要增强里面去调整,但是在前台操作,推荐后 再次修改数量是可以保存的,那就是可以不使用推荐值,那么在标准的BAPI里面也是可以的,这里感谢SAP BAPI_PO_CREATE1创建指定数量的PO - 灰信网(软件开发博客聚合)
分享
注意 GWA_ITEM-NO_ROUNDING / GWA_ITEMX-NO_ROUNDING 都要设置成 ‘X’才有效
我自己的代码
FUNCTION ZRFC_SRM_POCREATE.
*"----------------------------------------------------------------------
*"*"局部接口:
*" IMPORTING
*" VALUE(LIFNR) TYPE LIFNR
*" VALUE(BUKRS) TYPE BUKRS
*" VALUE(EKORG) TYPE EKORG
*" VALUE(EKGRP) TYPE BKGRP
*" EXPORTING
*" VALUE(L_PO_NUMBER) TYPE BAPIMEPOHEADER-PO_NUMBER
*" VALUE(MESSAGE) TYPE BAPI_MSG
*" VALUE(L_ERRFLAG) TYPE BAPI_CORU_RETURN-TYPE
*" TABLES
*" VMISTR STRUCTURE ZVMISTR
*" VMISTR1 STRUCTURE ZVMISTR1
*"----------------------------------------------------------------------
DATA:GS_POHEADER TYPE BAPIMEPOHEADER,
GS_POHEADERX TYPE BAPIMEPOHEADERX,
GT_RETURN TYPE STANDARD TABLE OF BAPIRET2,
GWA_RETURN TYPE BAPIRET2,
GT_ITEM TYPE STANDARD TABLE OF BAPIMEPOITEM,
GWA_ITEM TYPE BAPIMEPOITEM,
GT_ITEMX TYPE STANDARD TABLE OF BAPIMEPOITEMX,
GWA_ITEMX TYPE BAPIMEPOITEMX,
GT_POSCHEDULE TYPE STANDARD TABLE OF BAPIMEPOSCHEDULE,
GWA_POSCHEDULE TYPE BAPIMEPOSCHEDULE,
GT_POSCHEDULEX TYPE STANDARD TABLE OF BAPIMEPOSCHEDULX,
GWA_POSCHEDULEX TYPE BAPIMEPOSCHEDULX,
GT_POCOND TYPE STANDARD TABLE OF BAPIMEPOCOND,
GWA_POCOND TYPE BAPIMEPOCOND,
GT_POCONDX TYPE STANDARD TABLE OF BAPIMEPOCONDX,
GWA_POCONDX TYPE BAPIMEPOCONDX,
GT_POCOMPONENTS TYPE STANDARD TABLE OF BAPIMEPOCOMPONENT,
GWA_POCOMPONENTS TYPE BAPIMEPOCOMPONENT,
GWA_POCOMPONENTS_TEMP TYPE BAPIMEPOCOMPONENT,
GT_POCOMPONENTSX TYPE STANDARD TABLE OF BAPIMEPOCOMPONENTX,
GWA_POCOMPONENTSX TYPE BAPIMEPOCOMPONENTX.
DATA:LV_NUM TYPE BAPIMEPOHEADER-PO_NUMBER.
*--------------------------------------------------------------------------------*
* 抬头赋值
*--------------------------------------------------------------------------------*
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = LIFNR
IMPORTING
OUTPUT = GS_POHEADER-VENDOR. "供应商编号
GS_POHEADER-DOC_TYPE = 'NB'. "标准订单
* GS_POHEADER-VENDOR = LIFNR.
GS_POHEADER-PURCH_ORG = EKORG. "采购组织
GS_POHEADER-PUR_GROUP = EKGRP. "采购组
GS_POHEADER-COMP_CODE = BUKRS. "公司代码
GS_POHEADER-CURRENCY = 'RMB'."货币
GS_POHEADER-DOC_DATE = SY-DATUM. "采购凭证日期
GS_POHEADER-LANGU = SY-LANGU. "语言代码
GS_POHEADER-STATUS = 'I'.
* GS_POHEADER-INFO_UPD = 'I'.
* GS_POHEADER-ITEM_INTVL = ''.
* GS_POHEADER-ITEM_INTVL = ''.
GS_POHEADERX-DOC_TYPE = 'X'.
GS_POHEADERX-VENDOR = 'X'.
GS_POHEADERX-PURCH_ORG = 'X'.
GS_POHEADERX-PUR_GROUP = 'X'.
GS_POHEADERX-COMP_CODE = 'X'.
GS_POHEADERX-DOC_DATE = 'X'.
GS_POHEADERX-LANGU = 'X'. "语言代码
GS_POHEADERX-CURRENCY = 'X'. "货币
GS_POHEADERX-STATUS = 'X'. "采购凭证状态
* GS_POHEADERX-ITEM_INTVL = 'X'.
*--------------------------------------------------------------------------------*
* PO_ITEM1 行项目赋值
*--------------------------------------------------------------------------------*
LOOP AT VMISTR.
CLEAR GWA_ITEM.
CLEAR GWA_ITEMX.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = VMISTR-MATNR
IMPORTING
OUTPUT = GWA_ITEM-MATERIAL. "物料号
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = VMISTR-EBELP
IMPORTING
OUTPUT = GWA_ITEM-PO_ITEM. "行项目编号
* GWA_ITEM-PO_ITEM = '00010'. "采购凭证的项目编号
* GWA_ITEM-MATERIAL = '000000000018007349'.
* GWA_ITEM-ITEM_CAT = 'L'.
* GWA_ITEM-SHORT_TEXT = 'SHORT'."短文本
GWA_ITEM-QUANTITY = VMISTR-MENGE.
* GWA_ITEM-PO_UNIT = MEINS ."采购订单的计量单位
GWA_ITEM-PLANT = VMISTR-WERKS.
GWA_ITEM-STGE_LOC = VMISTR-LGORT.
* GWA_ITEM-TAX_CODE = MWSKZ. "税码
* GWA_ITEM-DATE_QTY_FIXED = 'X'. "交货日期和数量己确定
GWA_ITEM-NO_ROUNDING = 'X'. "不使用SAP建议采购的数量
APPEND GWA_ITEM TO GT_ITEM.
"行项目更新标识赋值
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = VMISTR-EBELP
IMPORTING
OUTPUT = GWA_ITEMX-PO_ITEM. "行项目编号
GWA_ITEMX-PO_ITEMX = 'X'. "采购凭证的项目编号 (行项目 更新标识)
GWA_ITEMX-MATERIAL = 'X'.
* GWA_ITEMX-SHORT_TEXT = 'X'."短文本
GWA_ITEMX-QUANTITY = 'X'."采购订单数量
* GWA_ITEMX-PO_UNIT = 'X' ."采购订单的计量单位
GWA_ITEMX-PLANT = 'X'."工厂
GWA_ITEMX-STGE_LOC = 'X'. "库存地点
* GWA_ITEMX-ITEM_CAT = 'X'.
* GWA_ITEMX-TAX_CODE = 'X'. "税码
* GWA_ITEMX-DATE_QTY_FIXED = 'X'.
GWA_ITEMX-NO_ROUNDING = 'X'. "不使用SAP建议采购的数量
APPEND GWA_ITEMX TO GT_ITEMX.
ENDLOOP.
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
POHEADER = GS_POHEADER
POHEADERX = GS_POHEADERX
* POADDRVENDOR =
* TESTRUN =
* MEMORY_UNCOMPLETE =
* MEMORY_COMPLETE =
* POEXPIMPHEADER =
* POEXPIMPHEADERX =
* VERSIONS =
* NO_MESSAGING =
* NO_MESSAGE_REQ =
* NO_AUTHORITY =
* NO_PRICE_FROM_PO = 'X'
* PARK_COMPLETE =
* PARK_UNCOMPLETE =
IMPORTING
EXPPURCHASEORDER = L_PO_NUMBER
* EXPHEADER =
* EXPPOEXPIMPHEADER =
TABLES
RETURN = GT_RETURN
POITEM = GT_ITEM
POITEMX = GT_ITEMX
* POADDRDELIVERY =
* POSCHEDULE = GT_POSCHEDULE
* POSCHEDULEX = GT_POSCHEDULEX
* POACCOUNT =
* POACCOUNTPROFITSEGMENT =
* POACCOUNTX =
* POCONDHEADER =
* POCONDHEADERX =
* POCOND = GT_POCOND
* POCONDX = GT_POCONDX
* POLIMITS =
* POCONTRACTLIMITS =
* POSERVICES =
* POSRVACCESSVALUES =
* POSERVICESTEXT =
* EXTENSIONIN =
* EXTENSIONOUT =
* POEXPIMPITEM =
* POEXPIMPITEMX =
* POTEXTHEADER =
* POTEXTITEM =
* ALLVERSIONS =
* POPARTNER =
* POCOMPONENTS = GT_POCOMPONENTS
* POCOMPONENTSX = GT_POCOMPONENTSX
.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
DATA:PO_REL_CODE TYPE BAPIMMPARA-PO_REL_COD. "审批代码
SELECT SINGLE FRGC1 INTO PO_REL_CODE
FROM EKKO
JOIN T16FS ON T16FS~FRGGR = EKKO~FRGGR AND T16FS~FRGSX = EKKO~FRGSX
WHERE EBELN = L_PO_NUMBER.
CALL FUNCTION 'BAPI_PO_RELEASE'
EXPORTING
PURCHASEORDER = L_PO_NUMBER
PO_REL_CODE = PO_REL_CODE
* USE_EXCEPTIONS = 'X'
* NO_COMMIT = ' '
* IMPORTING
* REL_STATUS_NEW =
* REL_INDICATOR_NEW =
* RET_CODE =
* TABLES
* 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
.
*IF SY-SUBRC <> 0.
** IMPLEMENT SUITABLE ERROR HANDLING HERE
*ENDIF.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
READ TABLE GT_RETURN INTO GWA_RETURN INDEX 1.
CLEAR L_ERRFLAG.
L_ERRFLAG = GWA_RETURN-TYPE.
IF L_ERRFLAG = 'S'.
CONCATENATE '创建采购凭证成功,' '凭证号:' L_PO_NUMBER INTO MESSAGE.
ELSE.
CONCATENATE '创建采购凭证失败,' '原因:请确认物料和供应商是否匹配!' GWA_RETURN-MESSAGE INTO MESSAGE.
ENDIF.
SELECT MATNR NETPR MWSKZ PEINH INTO TABLE VMISTR1 FROM EKPO WHERE EBELN = L_PO_NUMBER.
FIELD-SYMBOLS <FS> TYPE ZVMISTR1.
LOOP AT VMISTR1 ASSIGNING <FS>.
DATA: T_FTAXP LIKE TABLE OF FTAXP WITH HEADER LINE.
DATA:taxrate LIKE FTAXP-KBETR.
CALL FUNCTION 'GET_TAX_PERCENTAGE'
EXPORTING
ALAND = 'CN' "国家语言
DATAB = SY-DATUM "当前时间
MWSKZ = <FS>-MWSKZ "税码
TXJCD = ' '
TABLES
T_FTAXP = T_FTAXP.
"读取获取出来的数据
READ TABLE T_FTAXP INTO T_FTAXP WITH KEY KSCHL = 'MWVS'.
IF SY-SUBRC EQ 0.
taxrate = T_FTAXP-KBETR / 1000."税率
ENDIF.
<FS>-NETPR = <FS>-NETPR / <FS>-PEINH * ( 1 + taxrate ) .
ENDLOOP.
ENDFUNCTION.

本文档展示了如何通过SAP BAPI接口`BAPI_PO_CREATE1`创建采购订单,并详细说明了代码实现过程。代码中包含了采购订单抬头和行项目的赋值,以及关键参数的设置,如`NO_ROUNDING`,以避免使用SAP建议的采购数量。最后,调用`BAPI_PO_RELEASE`进行审批并提交事务。
133

被折叠的 条评论
为什么被折叠?



