转载自:http://lrj0767.blog.163.com/blog/static/126031919201251953651978/
ABAP_RFC_BAPI培训教程
SAP R/3的接口方式主要有RFC、IDOC、BAPI三种。
RFC分二种:1 正常的本地RFC。2 远程RFC(外部系统调用)。
BAPI(SAP自带业务函数--封装好函数)。
RFC,BAPI 都可以理解成一个函数。它有输入、输出,改变,排除 参数,表(既可以输入也输出)。
1.1 RFC 参数介绍
1.2 创建一个SAP本地RFC。
1.3 创建一个远程RFC。
2 查找BAPI
3 调用RFC,BAPI
1.1 RFC 参数介绍
SE37
Attributes(属性), Import(输入参数),Export(输出参数),Changing(更改参数),
Tables(输入,输出内表),Exceptions(排除参数),Source code(编写代码)。
Attributes(属性):
Normal Function Module :在SAP内部调用RFC
Remote-Enabled Module:远程函数调用,即使用外部系统(.NET,VB,JAVA....)调用SAP RFC。
Update Module: 一般使用 Start immed(立刻执行).
Import(输入参数):
就是要传入来的条件参数,不能为内表。最常用。
Export(输出参数):
就是返回值,也不能为内表。最常用。
Changing(更改参数):
返回值,与export差不多,这个很少用。
Tables(输入,输出内表):
可以把多个内表的值传进来,同时也可以把多个内表返回。
Exceptions(排除参数。):
不常用。
Source code(编写代码):
就是编写代码了,如果不写代码,那这个RFC就没有用处了。
輸入參數,輸出參數,表 可以不全部使用.
1.2 创建一个SAP本地RFC。
运行SE37 TCODE.
填写一个RFC函数名,名字必须是以"Z"或"Y"开头,建议使用"Z"开头.然后点击Create按钮。
填写函数组与函数描述。
如果现有的函数组没有自己想的保存的函数组,则自己新创建一个。新开一个窗口,运行SE37.
填写函数组名字及描述,
保存。
在弹出要求填写包界面,如果该函数组不需要传到PRD,则保存到本地就行了,连扫LOACL OBJECT,如果要上传,自己从PACKAGE中选择包,与请求传输号。使用SE80創建包.
函数组创建成功,再返回到刚才创建RFC函数要求选择函数组的界面选择。
属性:
选择Normal Function Module 与 Start immed.
Import输入参数:
如果有输入参数,就填写,没有,可以不填写。
Parameter Name:填写参数名字。
Typing:填写参考类型,如Type, TYPE REF TO.
Associated Type:填写参考的字段,可以手工填写,也可以查找。
Default Value:填写默认值。
Optional:表示是否是可选。 打勾表示可以不必填写,不打勾表示必填。
Pass Value: 打勾表示使用默认值。如果填写了默认值,则此选择要勾上。
Short text:该参数的描述,如果是使用系统字段,则自动带出来。
在沒有默認值,如果optional沒有打勾,則會提示輸入值.
Export 输出参数:
如果有输出参数,就填写,没有,可以不填写。
Table :
引用结构或表,使用 LIKE, 不能使用TYPE。
在这里 ZPO_IN表示是传入的内表,ZPO_out是输出的内表。
Associated type :填写参考的结构或表名。
Source code:
编写代码跟在SE38中是一样的了,定义变量,结构,内表,SQL等。
FUNCTION Z_RFC_TEST1.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(BUKRS_IN) TYPE BUKRS DEFAULT 1000
*" EXPORTING
*" REFERENCE(BUKRS_OUT) TYPE BUKRS
*" TABLES
*" ZPO_IN STRUCTURE ZFI001_018_PR
*" ZPO_OUT STRUCTURE ZFI001_018_PR
*"----------------------------------------------------------------------
DATA:BEGIN OF GI_EKKO OCCURS 0, "PO 采购订单表头
EBELN LIKE EKKO-EBELN, "PO 采购订单号
BUKRS LIKE EKKO-BUKRS, "公司代码
END OF GI_EKKO.
DATA:BEGIN OF GI_EKPO OCCURS 0, "采购表ITEM表
EBELN LIKE EKKO-EBELN, "采购单
EBELP LIKE EKPO-EBELP, "采购单ITEM
MATNR LIKE EKPO-MATNR, "物料号
MENGE LIKE EKPO-MENGE, "采购数量
END OF GI_EKPO.
SELECT EBELN BUKRS INTO TABLE GI_EKKO FROM EKKO
WHERE BUKRS = BUKRS_IN. "公司代码的值从输入参数中来。
IF ZPO_IN[] IS NOT INITIAL.
SELECT EBELN EBELP MATNR MENGE INTO TABLE GI_EKPO FROM EKPO
FOR ALL ENTRIES IN ZPO_IN "输入参数表
WHERE EBELN = ZPO_IN-EBELN AND EBELP = ZPO_IN-EBELP.
* 记住,使用FOR ALL ENTRIES IN 来连接内表,一定要判断该内表不要为空,否则把该表全部记录都读取出来
ENDIF.
READ TABLE GI_EKKO INDEX 1.
IF SY-SUBRC = 0.
BUKRS_OUT = GI_EKKO-BUKRS. "把采购订单的第一条记录的公司代码输出
ENDIF.
LOOP AT GI_EKPO.
MOVE-CORRESPONDING GI_EKPO TO ZPO_OUT. "输出内表
APPEND ZPO_OUT.
CLEAR:GI_EKPO,ZPO_OUT.
ENDLOOP.
ENDFUNCTION.
代码编写完成程,然后激活,
本地RFC创建完成。
1.3 创建远程函数。
在属性处选择Remote-Enabled Module.
在输入、输出参数处还要把PASS VALUE勾选上。如果不勾选,不能激活:
表,代码 都是一样的.
激活成功之后,还需要释放。
2 查找BAPI
BAPI是个SAP的封装好的业务函数。
运行BAPI TOCDE查找BAPI。
在里面分模块,根据业务去找相对应的BAPI。
通过Hierarchical 可看R3模块的业务BAPI,不是所有业务都有BAPI。
下面找到一个是创建发票的BAPI。
双击BAPI进入查看,或者运行SE37进入查看,
双击BAPI进入查看, 也是直接进入SE37的界面的。
输入参数:
TABLE:
3 调用RFC,BAPI.
在程序调用RFC,BAPI的地方,点击按钮,查看查找函数。
点击确认按钮,会自动带出所有参数出来。
如果输入参数,输出参数据都需要,则把它们去掉注解。
并给参数,内表绑定值。
得到的返回内表或输出参数再进行数据处理。
BAPI也是这样调用:
到这里还没有结束,调用RFC,BAPI都有一个返回信息,使用.
SY-SUBRC 判断是否成功。
Rfc: Z_RFC_TEST3
Code: ZRFC_TEST
REPORT Z_RFC_TEST.
CALL FUNCTION 'Z_RFC_TEST1'
* EXPORTING
* BUKRS_IN = 1000
* IMPORTING
* BUKRS_OUT =
TABLES
ZPO_IN =
ZPO_OUT =
.
if sy-subrc = 0.
" 等于 0 表示成功
endif.
CALL FUNCTION 'BAPI_BILLINGDOC_CREATEMULTIPLE'
* EXPORTING
* CREATORDATAIN =
* TESTRUN =
* POSTING =
TABLES
BILLINGDATAIN =
* CONDITIONDATAIN =
* CCARDDATAIN =
* TEXTDATAIN =
* ERRORS =
RETURN =
SUCCESS =
.
if sy-subrc = 0.
" 等于 0 表示成功
endif.
剩下的就是自己处理返回的参数与内表了。