创建采购申请一般有两个函数: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'EXPORTINGINPUT = WA_ZTCMS008-MATNRIMPORTINGOUTPUT = 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'EXPORTINGINPUT = WA_ZTCMS008-MEINS "外码LANGUAGE = SY-LANGUIMPORTINGOUTPUT = 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'EXPORTINGINPUT = WA_ZTCMS008-LIFNRIMPORTINGOUTPUT = 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'IMPORTINGNUMBER = LV_PR_NOTABLESREQUISITION_ITEMS = LT_ITEMREQUISITION_ACCOUNT_ASSIGNMENT = LT_ACCREQUISITION_ITEM_TEXT = LT_TEXTEXTENSIONIN = LT_EXTRETURN = 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'EXPORTINGWAIT = 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'EXPORTINGINPUT = WA_ZTCMS008-MATNRIMPORTINGOUTPUT = 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'EXPORTINGINPUT = WA_ZTCMS008-MEINS "外码LANGUAGE = SY-LANGUIMPORTINGOUTPUT = 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'EXPORTINGINPUT = WA_ZTCMS008-LIFNRIMPORTINGOUTPUT = 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_HEADPRHEADERX = LS_HEADXIMPORTING "BAPI出参NUMBER = LV_BANFNTABLES "表参数(入参)RETURN = LT_RETURNPRITEM = LT_PRITEMPRITEMX = LT_PRITEMXPRACCOUNT = LT_PRACCOUNTPRACCOUNTX = LT_PRACCOUNTXEXTENSIONIN = LT_EXTEXTENSIONOUT = 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'EXPORTINGWAIT = 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.
参数同上面的。
这里重点讲下自定义字段的增强及传入。
双击屏幕出口
下面两个增强结构要加入自定义字段
如果使用的第一个函数的话,这里是不需要增加下面的结构,如果使用第二个函数,下面这个更新结构也要增加
可以先创建,也可以先做出口功能
最后要在TOP建一个全局变量