RFC相关设置及使用

来源:互联网 发布:centos 编译php7 编辑:程序博客网 时间:2024/05/17 17:18

转自:http://lzl000163.blog.163.com/blog/static/5794424720127315235311/

RFC 是“Remote Function Call ”的简写,中文意思为远程函数调用。RFC 是SAP 系统之间或SAP 系统与外部通讯的标准方式。

下面是外部系统与R3 服务器之间进行RFC 通讯的原理图:

运用RFC 通讯,通常有如下几个步骤:
1、创建RFC 用户
2、创建RFC 函数
3、远程函数调用(SAP 系统之间、SAP 系统与非SAP 系统之间)

下面逐步讲解RFC 的使用过程。

一、创建RFC 用户
使用RFC 之前,我们需要与SAP 系统建立连接,建立连接时,需要提供连接账号和密码,该账号与SAP 系统用户账号一样,也是在SU01 中创建。通常,我们会在系统中建立一个命名为“RFCUser”的账号,这个账号专用于RFC 连接。为了系统安全,我们应该在满足功能要求的前提下,给该账号分配最小的权限。并且,为了防止该账号登录SAPGUI ,我们会将该账号类型指定为“系统”。

1、创建RFC 角色
运行PFCG,创建角色“RFC_EXT”。进入“权限”视图,点击“Change Authorization Data” 按钮,进入如下界面:

点击菜单:编辑->插入权限->手工输入。输入授权对象“S_RFC”。为了防止RFC 账号访问不必要访问的RFC 函数,我们还需要限制能访问的函数范围。如上图,我限制RFC 角色只能运行函数组RFC1、SYST 、Z_FUNGROUP 中的RFC 函数。如果不知道自己都用了哪些函数组,请利用ST01 跟踪授权检查。生成角色后,保存该角色。

2、创建RFC 账号
运行SU01,创建账号“RFCUser”,在“登录数据”视图,指定用户类型为“系统”,如下图:

在“角色”视图,指定其属于“RFC_EXT”角色。最后,保存该用户账号。

二、创建RFC 函数
为了讲解RFC 的使用,我们假设有这个需求:获取各成本中心的负责人和电子邮件地址。
1、创建一个结构,用于传递返回结果运行SE11 ,创建结构如下: 

2、创建RFC 函数
运行SE37,进入如下屏幕:

输入欲创建的函数名称,点击“Create”按钮。进入如下屏幕:

输入该函数所属的函数组,并填写函数说明。点击“Save”按钮。
进入函数编辑界面,下面是“Attributes ”视图:

选中“Remote-enabled module”。下面是“Import ”视图:

注意:RFC 过程中不允许参考参数。必须是“Pass By Value”。
我们要求的输入参数是控制范围和公司代码。即本函数需要实现的功能是:返回指定控制范围和公司代码下的含有邮件地址的成本中心。

如上图,采用一个表结构来传递结果。
该函数的源代码如下:
FUNCTION z_get_cc_mailaddr. 
SELECT csks~func_area AS fgnfw csks~kostl AS fcbzx cskt~ktext AS fms

csks~verak AS ffzr csks~telx1 AS fyjdz 
INTO CORRESPONDING FIELDS OF TABLE itab_yjdz 
FROM csks JOIN cskt ON csks~kokrs = cskt~kokrs AND csks~kostl = cskt~kostl 
WHERE csks~kokrs = p_kzfw AND csks~bukrs = p_gsdm AND csks~telx1 <> ''.

ENDFUNCTION.

三、SAP 系统之间运用RFC 通讯
SAP 系统之间进行RFC 通讯,首先需要在RFC 调用者上创建RFC 连接,该连接说明被调用服务器的连接参数。设定RFC 连接后,我们就能够Call Function 时,通过指定Destination 来启动RFC 连接。
下面,我将演示如何在培训服务器(SAPTRN)上调用开发服务器(SAPDEV )上的函数“Z_GET_CC_MAILADDR”。

1、创建RFC 连接
在服务器SAPTRN 上运行SM59,进入如下界面:

选中“R/3 连接”,然后点击“创建”按钮。进入如下界面:

输入如下项目:
RFC destination:RFC 连接的名称
连接类型:3--R/3 连接
Target host:RFC 服务器的名称或地址
System Number:RFC 服务器上的系统号
下面是“Logon/Security ”视图:

在“Logon/Security ”视图,我们输入RFC 用户参数:
Language :语言,EN 或ZH 
Client:
User:输入本章第一节创建的RFC 用户名
Password:
如果选中“登陆屏幕”,则在启用RFC 之前,会弹出登陆对话框。

各个参数设置完成后,保存该RFC 连接。

2、SAP 系统之间运用RFC 通讯

在服务器SAPTRN 上,创建程序ztest ,该程序演示在SAPTRN 上调用SAPDEV 上的函数。
代码如下:

======================================================= 
REPORT ztest.

DATA: BEGIN OF itab OCCURS 0,

fgnfw TYPE fkber,

fcbzx TYPE kostl,

fms TYPE ktext,

ffzr TYPE verak, 
fyjdz TYPE telx1, 
END OF itab.

CALL FUNCTION 'Z_GET_CC_MAILADDR' 
DESTINATION 'DEV700' 
EXPORTING

p_kzfw = 'BP01' 
p_gsdm = 'BP01' 
TABLES 
itab_yjdz = itab. 
LOOP AT itab.

 WRITE itab-fms. 
ENDLOOP. 
=======================================================

四、非SAP 系统利用RFC 与SAP 系统通讯

下面演示在VB 中调用SAP 系统中的函数Z_GET_CC_MAILADDR 。

1、安装SAP Development Tools 
运行SAP GUI 的安装程序,选择如下组件:

安装完成后,系统注册如下组件:

控件名          OCX                        文件对象
Logon Control  Wdtlog.ocx wdtlogu.ocx      SAP.LogonControl.1 
RFC Control    Wdtfuncs.ocx wdtfuncu.ocx   Sap.Functions 
BAPI Control   Wdobapi.ocx wdobapiu.ocx    SAP.BAPI.1
(在发布程序时,用到了什么控件,则需要在客户机上注册对应的OCX)

2、创建VB 工程
具体的创建步骤就不用说了吧。
3、向Form 增加控件
在Form 上增加如下控件:

名称类型              标题
o_SAPFunctions         SAPFuncitons 
cmd_Connect            CommandButton Connect to SAP 
cmd_FillGrid           CommandButton Fill Grid 
cmd_Disconnect         CommandButton Disconnect to SAP 
dg_mailaddr            DataGrid

SAPFunctions 控件是安装SAP GUI 时指定安装的组件,其全称为“SAP Remote Function Call Unicode Control”。我们能够通过“鼠标右击工具箱->添加部件”的方式将它添加到工具箱中。
下面是该窗体的设计样式:

4、代码
RFC 编程的基本流程为:

下面是该Demo 的源代码:

Dim itab_mailaddr As Object

Private Sub cmd_Connect_Click() 
o_SAPFunctions.Connection.ApplicationServer = "192.168.0.200" 
o_SAPFunctions.Connection.SystemNumber = "00" 
o_SAPFunctions.Connection.Client = "700" 
o_SAPFunctions.Connection.User = "RFCUSER" 
o_SAPFunctions.Connection.Password = "*****" 
o_SAPFunctions.Connection.Language = "ZH" 
If Not o_SAPFunctions.Connection.Logon(0, True) Then ' 
MsgBox "No access to R/3 System!", vbOKOnly + vbExclamation, "Alert" 
End If 
End Sub

Private Sub cmd_Disconnect_Click() 
o_SAPFunctions.Connection.Logoff

End Sub

Private Sub cmd_FillGrid_Click() 
Dim GetCCMailAddr As Object

 Set GetCCMailAddr = o_SAPFunctions.Add("Z_GET_CC_MAILADDR") 
GetCCMailAddr.Exports("P_KZFW") = "BP01" 
GetCCMailAddr.Exports("P_GSDM") = "BP01"

If GetCCMailAddr.Call Then 
Set itab_mailaddr = GetCCMailAddr.Tables("ITAB_YJDZ")

 Dim adoRecordset As New ADODB.Recordset 
adoRecordset.Fields.Append " 功能范围", adVariant 
adoRecordset.Fields.Append " 成本中心代码", adVariant 
adoRecordset.Fields.Append " 描述", adVariant 
adoRecordset.Fields.Append " 负责人", adVariant 
adoRecordset.Fields.Append " 邮件地址", adVariant
adoRecordset.Open

For Each tmp_row In itab_mailaddr.rows 
adoRecordset.AddNew 
Forj = 0To 4
adoRecordset.Fields(j) = tmp_row(j + 1) 
Next 
Next

 Set dg_mailaddr.DataSource = adoRecordset
dg_mailaddr.Refresh

End If 
End Sub

需要注意的是:RFC 返回的结果,如果是表结构的返回值,我们直接将它作为数组的方式使用。
5、执行结果
运行Demo 程序,先点击“Connect to SAP ”按钮,在点击“Fill Grid”,下面是执行结果:


0 0