SAP BAPI_PR_CREATE 创建采购申请(含自定义字段)
创建采购申请一般有两个函数:BAPI_PR_CREATE 和 BAPI_REQUISITION_CREATE。
使用BAPI_REQUISITION_CREATE创建常规的标准的采购申请比较方便,代码如下
FUNCTION ZFM_OA2SAP_CREAT_PR. *"---------------------------------------------------------------------- *"*"本地接口: *" EXPORTING *" REFERENCE(ZBANFN) TYPE BANFN *" REFERENCE(E_SUCC) TYPE CHAR1 *" REFERENCE(E_MESSAGE) TYPE MSGTX *" TABLES *" INPUT STRUCTURE ZSCMS008 *"---------------------------------------------------------------------- DATA: LT_ITEM TYPE TABLE OF BAPIEBANC, LS_ITEM TYPE BAPIEBANC, LT_ACC TYPE TABLE OF BAPIEBKN, LS_ACC TYPE BAPIEBKN, LT_RETURN TYPE TABLE OF BAPIRETURN, LT_TEXT TYPE TABLE OF BAPIEBANTX, LS_TEXT TYPE BAPIEBANTX. DATA:LS_MESSAGE TYPE ZTCMS008-ZMESSAGE. DATA: LT_EXT TYPE TABLE OF BAPIPAREX, LS_EXT TYPE BAPIPAREX, LS_TE TYPE BAPI_TE_REQUISITION_ITEM. "<— 增强结构 DATA: C_MATERIAL TYPE BAPIEBANC-MATERIAL. DATA: C_LIFNR TYPE BAPIEBANC-DES_VENDOR. DATA: LV_PR_NO TYPE BAPIEBANC-PREQ_NO. DATA: I_COUNT TYPE I VALUE 10. DATA:WA_ZTCMS008 TYPE ZSCMS008. DATA:GT_ZTCMS008 TYPE TABLE OF ZTCMS008. DATA:GS_ZTCMS008 TYPE ZTCMS008. DATA:L_ERROR TYPE REF TO CX_SY_OPEN_SQL_DB. DATA:LV_MSEHI TYPE T006A-MSEHI. LOOP AT INPUT INTO WA_ZTCMS008. "-------------------------------------------------- " 1. 行项目数据 "-------------------------------------------------- LS_ITEM-PREQ_ITEM = I_COUNT. "行号 LS_ITEM-DOC_TYPE = WA_ZTCMS008-BSART. "凭证类型 IF WA_ZTCMS008-ERNAM IS NOT INITIAL. LS_ITEM-CREATED_BY = WA_ZTCMS008-ERNAM. "创建人 ENDIF. LS_ITEM-PREQ_NAME = WA_ZTCMS008-AFNAM. "申请人 LS_ITEM-PREQ_DATE = WA_ZTCMS008-ERDAT. "需求日期 IF WA_ZTCMS008-MATNR IS NOT INITIAL. CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING INPUT = WA_ZTCMS008-MATNR IMPORTING OUTPUT = C_MATERIAL. LS_ITEM-MATERIAL = C_MATERIAL. "物料 ELSE. LS_ITEM-MATERIAL = ''. ENDIF. LS_ITEM-SHORT_TEXT = WA_ZTCMS008-TXZ01. "文本 LS_ITEM-QUANTITY = WA_ZTCMS008-MENGE. "数量 "单位内外码转换 CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT' EXPORTING INPUT = WA_ZTCMS008-MEINS "外码 LANGUAGE = SY-LANGU IMPORTING OUTPUT = LV_MSEHI. "内码 LS_ITEM-UNIT = LV_MSEHI. "单位 LS_ITEM-PLANT = WA_ZTCMS008-WERKS. "工厂 LS_ITEM-MAT_GRP = WA_ZTCMS008-MATKL. "物料组 LS_ITEM-PUR_GROUP = WA_ZTCMS008-EKGRP. "采购组 LS_ITEM-DELIV_DATE = WA_ZTCMS008-LFDAT. "交货日期 LS_ITEM-DEL_DATCAT_EXT = 'D'. "交货日期种类 LS_ITEM-ACCTASSCAT = WA_ZTCMS008-KNTTP. "科目分配类别 LS_ITEM-ITEM_CAT = WA_ZTCMS008-PSTYP."项目分配类别 LS_ITEM-STORE_LOC = WA_ZTCMS008-LGORT."存储地点 CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING INPUT = WA_ZTCMS008-LIFNR IMPORTING OUTPUT = C_LIFNR. LS_ITEM-DES_VENDOR = C_LIFNR."所需供应商 APPEND LS_ITEM TO LT_ITEM. "-------------------------------------------------- " 2. 科目分配(成本中心) "-------------------------------------------------- LS_ACC-PREQ_ITEM = I_COUNT. LS_ACC-G_L_ACCT = WA_ZTCMS008-SAKTO. LS_ACC-COST_CTR = WA_ZTCMS008-KOSTL. LS_ACC-ASSET_NO = WA_ZTCMS008-ANLN1. LS_ACC-ORDER_NO = WA_ZTCMS008-AUFNR. APPEND LS_ACC TO LT_ACC. "-------------------------------------------------- " 3. 长文本(可选) "-------------------------------------------------- * LS_TEXT-PREQ_ITEM = '00010'. * LS_TEXT-TEXT_ID = 'B01'. * LS_TEXT-TEXT_LINE = '请优先使用库存'. * APPEND LS_TEXT TO LT_TEXT. "-------------------------------------------------- " 4. 增强字段赋值 "-------------------------------------------------- LS_TE-PREQ_ITEM = I_COUNT. LS_TE-ZOADJBH = WA_ZTCMS008-ZOADJBH. "<— 自定义字段 LS_TE-ZOAHEADERID = WA_ZTCMS008-ZOAHEADERID. "<— 自定义字段 LS_TE-ZOAITEMID = WA_ZTCMS008-ZOAITEMID. "<— 自定义字段 LS_EXT-STRUCTURE = 'BAPI_TE_REQUISITION_ITEM'. LS_EXT-VALUEPART1 = LS_TE. APPEND LS_EXT TO LT_EXT. WA_ZTCMS008-BNFPO = I_COUNT. MOVE-CORRESPONDING WA_ZTCMS008 TO GS_ZTCMS008. APPEND GS_ZTCMS008 TO GT_ZTCMS008. CLEAR:WA_ZTCMS008,LS_ITEM. I_COUNT = I_COUNT + 10. ENDLOOP. "-------------------------------------------------- " 5. 调用 BAPI "-------------------------------------------------- CALL FUNCTION 'BAPI_REQUISITION_CREATE' IMPORTING NUMBER = LV_PR_NO TABLES REQUISITION_ITEMS = LT_ITEM REQUISITION_ACCOUNT_ASSIGNMENT = LT_ACC REQUISITION_ITEM_TEXT = LT_TEXT EXTENSIONIN = LT_EXT RETURN = LT_RETURN. "-------------------------------------------------- " 6. 结果处理 "-------------------------------------------------- LOOP AT LT_RETURN INTO DATA(LS_RET) WHERE TYPE CA 'AE'. LS_MESSAGE = LS_MESSAGE && LS_RET-MESSAGE. CLEAR:LS_RET. ENDLOOP. IF SY-SUBRC = 0. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. LOOP AT GT_ZTCMS008 ASSIGNING FIELD-SYMBOL(<FS_ZTCMS008>). <FS_ZTCMS008>-BANFN = LV_PR_NO. <FS_ZTCMS008>-ZMESSAGE = LS_MESSAGE. <FS_ZTCMS008>-ZDATE = SY-DATUM. <FS_ZTCMS008>-ZTIME = SY-UZEIT. ENDLOOP. ZBANFN = LV_PR_NO. E_SUCC = 'E'. E_MESSAGE = LS_MESSAGE. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING WAIT = ABAP_TRUE. LOOP AT GT_ZTCMS008 ASSIGNING <FS_ZTCMS008>. <FS_ZTCMS008>-BANFN = LV_PR_NO. <FS_ZTCMS008>-ZMESSAGE = |采购申请创建成功,PR号为:{ LV_PR_NO }|. <FS_ZTCMS008>-ZDATE = SY-DATUM. <FS_ZTCMS008>-ZTIME = SY-UZEIT. ENDLOOP. ZBANFN = LV_PR_NO. E_SUCC = 'S'. E_MESSAGE = |采购申请创建成功,PR号为:{ LV_PR_NO }|. ENDIF. IF GT_ZTCMS008 IS NOT INITIAL . TRY . MODIFY ZTCMS008 FROM TABLE GT_ZTCMS008. IF SY-SUBRC = 0. COMMIT WORK. ENDIF. CATCH CX_SY_OPEN_SQL_DB INTO L_ERROR . ROLLBACK WORK. ENDTRY. ENDIF. ENDFUNCTION.



但是这个函数创建有科目类别或者项目类别的采购申请会出现问题,所以会采用BAPI_PR_CREATE这个函数,代码如下
FUNCTION ZFM_OA2SAP_CREAT_PR_NEW. *"---------------------------------------------------------------------- *"*"本地接口: *" EXPORTING *" REFERENCE(ZBANFN) TYPE BANFN *" REFERENCE(E_SUCC) TYPE CHAR1 *" REFERENCE(E_MESSAGE) TYPE MSGTX *" TABLES *" INPUT STRUCTURE ZSCMS008 *"---------------------------------------------------------------------- DATA:LS_MESSAGE TYPE ZTCMS008-ZMESSAGE. DATA: LT_EXT TYPE TABLE OF BAPIPAREX, LS_EXT TYPE BAPIPAREX, LS_TE TYPE BAPI_TE_MEREQITEM. "<— 增强结构 DATA:LT_EXTX TYPE TABLE OF BAPIPAREX, LS_EXTX TYPE BAPIPAREX, LS_TEX TYPE BAPI_TE_MEREQITEMX. "<— 增强结构更新 DATA: C_MATERIAL TYPE BAPIEBANC-MATERIAL. DATA: C_LIFNR TYPE BAPIEBANC-DES_VENDOR. DATA: I_COUNT TYPE I VALUE 10. DATA: I_COUNT_KM TYPE I VALUE 1. DATA:WA_ZTCMS008 TYPE ZSCMS008. DATA:GT_ZTCMS008 TYPE TABLE OF ZTCMS008. DATA:GS_ZTCMS008 TYPE ZTCMS008. DATA:L_ERROR TYPE REF TO CX_SY_OPEN_SQL_DB. DATA:LV_MSEHI TYPE T006A-MSEHI. DATA:LV_BANFN TYPE EBAN-BANFN. "定义变量 DATA:LV_BNFPO TYPE EBAN-BNFPO. "定义变量 DATA:LS_PRITEM TYPE BAPIMEREQITEMIMP. "定义工作区 DATA:LS_PRITEMX TYPE BAPIMEREQITEMX. "定义工作区 DATA:LT_PRITEM TYPE TABLE OF BAPIMEREQITEMIMP. "定义内表 DATA:LT_PRITEMX TYPE TABLE OF BAPIMEREQITEMX. "定义内表 DATA:LS_HEAD TYPE BAPIMEREQHEADER. "定义工作区 DATA:LS_HEADX TYPE BAPIMEREQHEADERX. "定义工作区 DATA:LT_RETURN TYPE TABLE OF BAPIRET2. "定义内表 DATA:LS_PRACCOUNT TYPE BAPIMEREQACCOUNT. "定义工作区 DATA:LS_PRACCOUNTX TYPE BAPIMEREQACCOUNTX. "定义工作区 DATA:LT_PRACCOUNT TYPE TABLE OF BAPIMEREQACCOUNT. "定义内表 DATA:LT_PRACCOUNTX TYPE TABLE OF BAPIMEREQACCOUNTX. "定义内表 LOOP AT INPUT INTO WA_ZTCMS008. "抬头数据 LS_HEAD-PR_TYPE = WA_ZTCMS008-BSART. "直接给BAPI入参赋值-采购申请类型 LS_HEADX-PR_TYPE = 'X'. "直接给BAPI入参赋值-采购申请类型-标记 " 明细行项目数据 LS_PRITEM-PREQ_ITEM = I_COUNT. "直接给BAPI入参赋值-采购申请类型行项目号 * IF WA_ZTCMS008-ERNAM IS NOT INITIAL. * LS_PRITEM-PREQ_NAME = WA_ZTCMS008-ERNAM. "直接给BAPI入参赋值-采购申请创建人取系统ID * ENDIF. LS_PRITEM-PREQ_NAME = WA_ZTCMS008-AFNAM. "申请人 IF WA_ZTCMS008-MATNR IS NOT INITIAL. CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING INPUT = WA_ZTCMS008-MATNR IMPORTING OUTPUT = C_MATERIAL. LS_PRITEM-MATERIAL = C_MATERIAL. "物料 ELSE. LS_PRITEM-MATERIAL = ''. ENDIF. LS_PRITEM-PLANT = WA_ZTCMS008-WERKS. "直接给BAPI入参赋值-工厂 LS_PRITEM-STORE_LOC = WA_ZTCMS008-LGORT."存储地点 LS_PRITEM-QUANTITY = WA_ZTCMS008-MENGE. "数量 "单位内外码转换 CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT' EXPORTING INPUT = WA_ZTCMS008-MEINS "外码 LANGUAGE = SY-LANGU IMPORTING OUTPUT = LV_MSEHI. "内码 LS_PRITEM-UNIT = LV_MSEHI. "单位 LS_PRITEM-DELIV_DATE = WA_ZTCMS008-LFDAT. "交货日期 LS_PRITEM-PREQ_DATE = WA_ZTCMS008-ERDAT. "需求日期 LS_PRITEM-SHORT_TEXT = WA_ZTCMS008-TXZ01. "文本 LS_PRITEM-PUR_GROUP = WA_ZTCMS008-EKGRP. "直接给BAPI入参赋值-采购组 LS_PRITEM-MATL_GROUP = WA_ZTCMS008-MATKL. "物料组 LS_PRITEM-DEL_DATCAT_EXT = 'D'. "交货日期种类 LS_PRITEM-ACCTASSCAT = WA_ZTCMS008-KNTTP. "直接给BAPI入参赋值-科目分配类别 LS_PRITEM-ITEM_CAT = WA_ZTCMS008-PSTYP."项目分配类别 CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT' EXPORTING INPUT = WA_ZTCMS008-LIFNR IMPORTING OUTPUT = C_LIFNR. LS_PRITEM-DES_VENDOR = C_LIFNR."所需供应商 APPEND LS_PRITEM TO LT_PRITEM. "将工作区ls_pritem赋值给内表lt_pritem LS_PRITEMX-PREQ_ITEM = I_COUNT. "直接给BAPI入参赋值-标记 * LS_PRITEMX-ERNAM = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-MATERIAL = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-PREQ_NAME = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-PLANT = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-STORE_LOC = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-QUANTITY = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-UNIT = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-DELIV_DATE = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-SHORT_TEXT = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-PUR_GROUP = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-MATL_GROUP = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-DEL_DATCAT_EXT = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-ACCTASSCAT = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-ITEM_CAT = 'X'. "直接给BAPI入参赋值-标记 LS_PRITEMX-DES_VENDOR = 'X'. "直接给BAPI入参赋值-标记 APPEND LS_PRITEMX TO LT_PRITEMX. "将工作区ls_pritemx赋值给内表lt_pritemx "科目分配 LS_PRACCOUNT-PREQ_ITEM = I_COUNT. "直接给BAPI入参赋值-采购申请类型行项目号 LS_PRACCOUNT-SERIAL_NO = I_COUNT_KM. "直接给BAPI入参赋值-科目分配的序号 LS_PRACCOUNT-GL_ACCOUNT = |{ WA_ZTCMS008-SAKTO ALPHA = IN }|. LS_PRACCOUNT-COSTCENTER = |{ WA_ZTCMS008-KOSTL ALPHA = IN }|. "直接给BAPI入参赋值-成本中心 LS_PRACCOUNT-ASSET_NO = |{ WA_ZTCMS008-ANLN1 ALPHA = IN }|. "直接给BAPI入参赋值-资产编号 LS_PRACCOUNT-ORDERID = |{ WA_ZTCMS008-AUFNR ALPHA = IN }|. "直接给BAPI入参赋值-订单编号 APPEND LS_PRACCOUNT TO LT_PRACCOUNT. "将工作区ls_pracccount赋值给内表lt_praccount LS_PRACCOUNTX-PREQ_ITEM = I_COUNT. "直接给BAPI入参赋值-采购申请类型行项目号 LS_PRACCOUNTX-SERIAL_NO = I_COUNT_KM. "直接给BAPI入参赋值-科目分配的序号 LS_PRACCOUNTX-GL_ACCOUNT = 'X'. "直接给BAPI入参赋值-科目编号 LS_PRACCOUNTX-COSTCENTER = 'X'. "直接给BAPI入参赋值-成本中心 LS_PRACCOUNTX-ASSET_NO = 'X'. "直接给BAPI入参赋值-资产编号 LS_PRACCOUNTX-ORDERID = 'X'. "直接给BAPI入参赋值-订单编号 APPEND LS_PRACCOUNTX TO LT_PRACCOUNTX. "将工作区ls_praccountx赋值给内表lt_accountx " 增强字段赋值 LS_TE-PREQ_ITEM = I_COUNT. LS_TE-ZOADJBH = WA_ZTCMS008-ZOADJBH. "<— 自定义字段 LS_TE-ZOAHEADERID = WA_ZTCMS008-ZOAHEADERID. "<— 自定义字段 LS_TE-ZOAITEMID = WA_ZTCMS008-ZOAITEMID. "<— 自定义字段 * LS_EXT-STRUCTURE = 'BAPI_TE_REQUISITION_ITEM'. "BAPI_REQUISITION_CREATE用的这个 LS_EXT-STRUCTURE = 'BAPI_TE_MEREQITEM'."BAPI_PR_CREATE用到的是这个 LS_EXT-VALUEPART1 = LS_TE. APPEND LS_EXT TO LT_EXT. " 增强字段赋值更新 LS_TEX-PREQ_ITEM = I_COUNT. LS_TEX-ZOADJBH = 'X'. "<— 自定义字段 LS_TEX-ZOAHEADERID = 'X'. "<— 自定义字段 LS_TEX-ZOAITEMID = 'X'. "<— 自定义字段 LS_EXT-STRUCTURE = 'BAPI_TE_MEREQITEMX'."BAPI_PR_CREATE用到的是这个 LS_EXT-VALUEPART1 = LS_TEX. APPEND LS_EXT TO LT_EXT. * " 增强字段赋值更新 * LS_TEX-PREQ_ITEM = I_COUNT. * LS_TEX-ZOADJBH = WA_ZTCMS008-ZOADJBH. "<— 自定义字段 * LS_TEX-ZOAHEADERID = WA_ZTCMS008-ZOAHEADERID. "<— 自定义字段 * LS_TEX-ZOAITEMID = WA_ZTCMS008-ZOAITEMID. "<— 自定义字段 ** LS_EXT-STRUCTURE = 'BAPI_TE_REQUISITION_ITEM'. "BAPI_REQUISITION_CREATE用的这个 * LS_EXTX-STRUCTURE = 'BAPI_TE_MEREQITEMX'."BAPI_PR_CREATE用到的是这个 * LS_EXTX-VALUEPART1 = LS_TEX. * APPEND LS_EXTX TO LT_EXTX. WA_ZTCMS008-BNFPO = I_COUNT. MOVE-CORRESPONDING WA_ZTCMS008 TO GS_ZTCMS008. APPEND GS_ZTCMS008 TO GT_ZTCMS008. CLEAR:WA_ZTCMS008,LS_PRITEM,LS_PRITEMX,LS_PRACCOUNT,LS_PRACCOUNTX,LS_TE,LS_EXT,LS_TEX. I_COUNT = I_COUNT + 10. ENDLOOP. "-------------------------------------------------- " 调用 BAPI "-------------------------------------------------- CALL FUNCTION 'BAPI_PR_CREATE' EXPORTING "BAPI入参 PRHEADER = LS_HEAD PRHEADERX = LS_HEADX IMPORTING "BAPI出参 NUMBER = LV_BANFN TABLES "表参数(入参) RETURN = LT_RETURN PRITEM = LT_PRITEM PRITEMX = LT_PRITEMX PRACCOUNT = LT_PRACCOUNT PRACCOUNTX = LT_PRACCOUNTX EXTENSIONIN = LT_EXT EXTENSIONOUT = LT_EXTX. "-------------------------------------------------- " 结果处理 "-------------------------------------------------- LOOP AT LT_RETURN INTO DATA(LS_RET) WHERE TYPE CA 'AE'. LS_MESSAGE = LS_MESSAGE && LS_RET-MESSAGE. CLEAR:LS_RET. ENDLOOP. IF SY-SUBRC = 0. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. LOOP AT GT_ZTCMS008 ASSIGNING FIELD-SYMBOL(<FS_ZTCMS008>). <FS_ZTCMS008>-BANFN = LV_BANFN. <FS_ZTCMS008>-ZMESSAGE = LS_MESSAGE. <FS_ZTCMS008>-ZDATE = SY-DATUM. <FS_ZTCMS008>-ZTIME = SY-UZEIT. ENDLOOP. ZBANFN = LV_BANFN. E_SUCC = 'E'. E_MESSAGE = LS_MESSAGE. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING WAIT = ABAP_TRUE. LOOP AT GT_ZTCMS008 ASSIGNING <FS_ZTCMS008>. <FS_ZTCMS008>-BANFN = LV_BANFN. <FS_ZTCMS008>-ZMESSAGE = |采购申请创建成功,PR号为:{ LV_BANFN }|. <FS_ZTCMS008>-ZDATE = SY-DATUM. <FS_ZTCMS008>-ZTIME = SY-UZEIT. ENDLOOP. ZBANFN = LV_BANFN. E_SUCC = 'S'. E_MESSAGE = |采购申请创建成功,PR号为:{ LV_BANFN }|. ENDIF. IF GT_ZTCMS008 IS NOT INITIAL . TRY . MODIFY ZTCMS008 FROM TABLE GT_ZTCMS008. IF SY-SUBRC = 0. COMMIT WORK. ENDIF. CATCH CX_SY_OPEN_SQL_DB INTO L_ERROR . ROLLBACK WORK. ENDTRY. ENDIF. ENDFUNCTION.
参数同上面的。
这里重点讲下自定义字段的增强及传入。

双击屏幕出口

下面两个增强结构要加入自定义字段

如果使用的第一个函数的话,这里是不需要增加下面的结构,如果使用第二个函数,下面这个更新结构也要增加


可以先创建,也可以先做出口功能



关键点:这个ZXM02O01程序要被包含在ZXM02ZZZ下才能正确生效,超重要!!!
最后要在TOP建一个全局变量


浙公网安备 33010602011771号