业务原先要求 创建并release 采购订单,近期发现部分接口有点问题,调用了没有返回。
经过查找,得出问题,创建的采购订单不需要审批,程序直接dump了,所以没有返回。
顺带把采购订单的审批策略梳理一下
四个特征代码
FPG_EKKO_BSART
FPG_EKKO_EKORG
FPG_EKKO_EKGRP
FPG_EKKO_WERKS
function: BAPI_CLASS_GETDETAIL 根据
获取4个参数
tables:
AUSP CABN CABNT
ATINN还不能用 要去CABN 名称转换到 特性号码
有了以上,可以根据工厂 采购组 采购组织 订单类型 get到审批策略,再判断订单是否继续生成
FUNCTION ZRFC_SRM_POCREATE.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(LIFNR) TYPE LIFNR
*" VALUE(BUKRS) TYPE BUKRS
*" VALUE(EKORG) TYPE EKORG
*" VALUE(EKGRP) TYPE EKGRP
*" VALUE(PRCID) TYPE CHAR40
*" VALUE(OWERKS) TYPE WERKS_D
*" VALUE(OLGORT) TYPE LGORT_D
*" EXPORTING
*" VALUE(L_PO_NUMBER) TYPE BAPIMEPOHEADER-PO_NUMBER
*" VALUE(MESSAGE) TYPE BAPI_MSG
*" VALUE(L_ERRFLAG) TYPE BAPI_CORU_RETURN-TYPE
*" VALUE(OUTPUT) TYPE ZSM8_SALESORDER_CREATE_OUTPUT
*" TABLES
*" VMISTR STRUCTURE ZVMISTR
*" VMISTR1 STRUCTURE ZVMISTR1 OPTIONAL
*" ZRETITEMS TYPE ZTBAPIRET2 OPTIONAL
*"----------------------------------------------------------------------
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.
DATA:LMATNR TYPE MATNR18.
DATA:LLIFNR TYPE LIFNR.
DATA:LT_EORD TYPE STANDARD TABLE OF EORD.
DATA:LT_A017 TYPE STANDARD TABLE OF A017.
DATA:L_PO_NUMBER1 TYPE BAPIMEPOHEADER-PO_NUMBER.
DATA:LWERKS LIKE MARC-WERKS.
*--------------------------------------------------------------------------------*
* 抬头赋值
*--------------------------------------------------------------------------------*
LLIFNR = LIFNR.
SHIFT LLIFNR LEFT DELETING LEADING '0'.
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 = 'CNY'."货币
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 行项目赋值
*--------------------------------------------------------------------------------*
CLEAR GT_RETURN[].
LOOP AT VMISTR.
LWERKS = VMISTR-WERKS.
CLEAR GWA_ITEM.
CLEAR GWA_ITEMX.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
INPUT = VMISTR-MATNR
IMPORTING
OUTPUT = GWA_ITEM-MATERIAL. "物料号
CLEAR LT_EORD[].
"$. Region 货源清单 eord的校验
SELECT * INTO TABLE LT_EORD
FROM EORD WHERE MATNR = GWA_ITEM-MATERIAL AND LIFNR = GS_POHEADER-VENDOR
AND WERKS = VMISTR-WERKS AND VDATU <= SY-DATUM AND BDATU >= SY-DATUM.
IF LT_EORD[] IS INITIAL.
GWA_RETURN-TYPE = 'E'.
LMATNR = VMISTR-MATNR.
SHIFT LMATNR LEFT DELETING LEADING '0'.
GWA_RETURN-MESSAGE = '物料' && LMATNR && '与供方' && LLIFNR && '不存在有效货源记录'.
OUTPUT-RETURN-MSGTY = GWA_RETURN-TYPE.
OUTPUT-RETURN-MSGTX = GWA_RETURN-MESSAGE.
APPEND GWA_RETURN TO GT_RETURN.
ENDIF.
"$. Endregion 货源清单 eord的校验
"$. Region 采购单价的校验
CLEAR LT_A017[].
SELECT * INTO TABLE LT_A017
FROM A017 WHERE MATNR = GWA_ITEM-MATERIAL AND LIFNR = GS_POHEADER-VENDOR
AND EKORG = EKORG
AND WERKS = VMISTR-WERKS AND DATAB <= SY-DATUM AND DATBI >= SY-DATUM.
IF LT_A017[] IS INITIAL.
GWA_RETURN-TYPE = 'E'.
LMATNR = VMISTR-MATNR.
SHIFT LMATNR LEFT DELETING LEADING '0'.
GWA_RETURN-MESSAGE = '物料' && LMATNR && '与供方' && LLIFNR && '在工厂'
&& VMISTR-WERKS && '下采购组织' && EKORG && '缺失有效采购价格'.
OUTPUT-RETURN-MSGTY = GWA_RETURN-TYPE.
OUTPUT-RETURN-MSGTX = GWA_RETURN-MESSAGE.
APPEND GWA_RETURN TO GT_RETURN.
ENDIF.
"$. Endregion 采购竞价的校验
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.
** 审批策略预先获取
SELECT OBJEK FROM AUSP JOIN CABN ON CABN~ATINN = AUSP~ATINN
WHERE ATNAM = 'FPG_EKKO_EKORG' AND ATWRT = @EKORG AND OBJEK IN (
SELECT OBJEK FROM AUSP JOIN CABN ON CABN~ATINN = AUSP~ATINN
WHERE ATNAM = 'FPG_EKKO_BSART' AND ATWRT = 'NB')
AND OBJEK IN ( SELECT OBJEK FROM AUSP JOIN CABN ON CABN~ATINN = AUSP~ATINN
WHERE ATNAM = 'FPG_EKKO_EKGRP' AND ATWRT = @EKGRP ) AND OBJEK IN (
SELECT OBJEK FROM AUSP JOIN CABN ON CABN~ATINN = AUSP~ATINN
WHERE ATNAM = 'FPG_EKKO_WERKS' AND ATWRT = @LWERKS )
INTO TABLE @DATA(LTAUSP).
IF LTAUSP[] IS INITIAL.
OUTPUT-RETURN-MSGTY = 'E'.
OUTPUT-RETURN-MSGTX = '采购订单类型NB,采购组' && EKGRP && ',采购组织' && EKORG && ',工厂' && LWERKS &&
'没有对应的审批策略,请核实业务'.
ELSE.
IF GT_RETURN[] IS NOT INITIAL.
OUTPUT-RETURN-ZITEM = GT_RETURN.
ZRETITEMS[] = GT_RETURN[].
ELSEIF GT_RETURN[] IS INITIAL.
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
POHEADER = GS_POHEADER
POHEADERX = GS_POHEADERX
IMPORTING
EXPPURCHASEORDER = L_PO_NUMBER
TABLES
RETURN = GT_RETURN
POITEM = GT_ITEM
POITEMX = GT_ITEMX.
READ TABLE GT_RETURN INTO GWA_RETURN INDEX 1.
CLEAR L_ERRFLAG.
L_ERRFLAG = GWA_RETURN-TYPE.
IF L_ERRFLAG = 'S'.
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.
CLEAR L_PO_NUMBER1.
DO 60 TIMES.
SELECT SINGLE EBELN INTO L_PO_NUMBER1 FROM EKKO WHERE EBELN = L_PO_NUMBER.
IF L_PO_NUMBER1 IS INITIAL.
WAIT UP TO 2 SECONDS.
ENDIF.
ENDDO.
IF L_PO_NUMBER1 IS INITIAL.
CONCATENATE '创建采购凭证成功,审批未成功,' '凭证号:' L_PO_NUMBER INTO MESSAGE.
ELSE.
UPDATE EKKO SET ZZBSTKD = PRCID OWERKS = OWERKS OLGORT = OLGORT WHERE EBELN = L_PO_NUMBER.
COMMIT WORK AND WAIT.
CALL FUNCTION 'BAPI_PO_RELEASE'
EXPORTING
PURCHASEORDER = L_PO_NUMBER
PO_REL_CODE = PO_REL_CODE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
CONCATENATE '创建采购凭证成功,' '凭证号:' L_PO_NUMBER INTO MESSAGE.
ENDIF.
ELSE.
LOOP AT GT_RETURN INTO GWA_RETURN WHERE TYPE = 'E' OR TYPE = 'A'.
MESSAGE = MESSAGE && GWA_RETURN-ID && GWA_RETURN-NUMBER && GWA_RETURN-MESSAGE && '|'.
ENDLOOP.
ENDIF.
OUTPUT-RETURN-MSGTY = L_ERRFLAG.
OUTPUT-RETURN-MSGTX = MESSAGE.
OUTPUT-RETURN-ZITEM = GT_RETURN.
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.
ENDIF.
ENDIF.
ENDFUNCTION.