开发基础 报表教程 数据字典 对话编程 表单打印 增强出口 SAP接口 S/4 HANA
实战案例 实战笔记 资料下载 CRM
问答互助 会员分享 俱乐部 广告区
论坛指南、建议和投诉
Twilight发表于 2014-03-18 22:39Twilight 最后回复于 2014-03-18 22:39 [复制链接] 5250 0
使用道具 举报
Twilight
管理员
发表回复 回帖后跳转到最后一页
1、RFM概述
在SAP中,RFM的创建方式与普通功能模块类似。只是编写功能模块时,需要在Attributes选项卡中,将Processing Type选项设定为Remote-Enabled Module,该设定将该模块注册为支持远程调用的功能模块。图1-6即为一个SAP提供的RFM,读者可以通过在功能创建器(事务代码SE37)
中指定功能模块名称后浏览其属性。
除选中Remote-Enabled Module选项外,维护RFM时,还需要注意下面一些要点。
(1)参数声明。普通的功能模块定义形参时并不一定要指明所参照的数据字典类型,具体类型可在运行时根据实参类型确定。但RFM则不能在运行时确定参数类型,因而必须在参数定义时参照数据字典类型进行声明。
图1-6 “支持远程功能”属性的设定
此外,RFM中的参数必须指定为值传递(参数设定中的Pass Value选项),对于表类型参数,系统也隐式进行值传递。
(2)格式转换。对于字符类型字段,调用程序传递给被调用模块的实参与RFM形参的定义长度并不需要完全一致。如果传入参数的长度较短,RFC将在后面补充空格。这意味着对于字符类型数据,调用和被调用方中,形参所参照的ABAP字典类型的长度可以不必完全一致。但是,调用方实参的定义长度不应大于被调用方形参的定义长度。
(3)异常处理。可在远程功能中进行异常的抛出(raise exccption),其方法与普通功能模块一致,在程序中的异常出现之处通过RAISE语句实现。需要注意的一点是,基于ABAP类(ABAP Class)的异常是不能从远程功能调用过程中抛回给调用系统的,因此需避免使用。
此外,RFC接口还定义了如下两种预设的系统异常类型:
系统将自动地抛出这两种异常,因此不必在程序代码中进行显式处理。但在调用RFC功能模块时必须进行接收,否则出现异常时可能会引起系统运行时Short Dump中断。这一问题在后文介绍RFM调用实例时还将具体说明。
调用功能模块时,所有其他不可知类型的异常应指定为OTHERS类型,以避免出现Short Dump.
2、调用SAP标准RFM
在SAP中,功能模块的调用通过CALL FUNCTION语句实现。远程功能调用作为普通功能模块调用的扩展,可通过在CALL FUNCTION语句中添加DESTINATION子句完成,其他语法格式与普通调用完全相同。
DESTINATION附加项后面接的是远程目标名称,该目标在事务SM59中设定,其中包含连接和登录远程系统所需的全部参数信息。还可以在远程调用时直接指定当前系统的应用服务器作为RFC目标,其格式为<hostname>_<sysid>_<sysnr>。其中,<hostname>为主机名.<sysid>为SAP系统名,<sysnr>为系统编号。可以通过事务SM51查看当前SAP系统中活动的应用服务器(图1-7)。
图1-7系统GSE中的应用服务器列表
下面给出一个远程功能调用的简单示例,该示例调用了图1-6所示的SAP标准RFM SXPG_COMMAND_EXECUTE。这个功能模块通过RFC调用时可以运行本地或其他SAP系统中的外部命令,即SAP系统中特定应用服务器的操作系统级别命令。
下面对本程序进行说明。
(1)功能模块SXPG_COMMAND_EXECUTE用于执行服务器上的系统命令,而非SAP命令。一个SAP系统(只共享一个底层数据库的SAP系统)中,可能运行着多个应用服务器(但最多只能存在一个消息服务器)。因而,如果某个命令需要在当前系统的特定应用服务器中运行,例如在只有该服务器中安装了某软件的情况下,就需要通过DESTINATION来指定系统的应用服务器。
例如,测试系统中的应用服务器列表如图1-7所示,共有1个应用服务器,其中shaw0889_E89_00是消息服务器,读者可以通过事务SM51 (SAP系统菜单Tools --Administation—Monitor—System Monitoring-Servers)进入自己的SAP系统,查看当前活动的应用服务器列表,选择其中之一作为远程目标进行测试。
(2)本例中的远程目标是直接根据应用服务器名称指定的,并没有通过SM59进行定义,因为远程目标是同一SAP系统的其他应用服务器,因此可以直接指定。如果远程目标是其他SAP系统,则必须在SM59中进行定义,具体步骤详见1.3节中的说明。
(3)程序所执行的外部命令RRR_ROUTER_START的功能,是查看一个特定应用服务器中的目录列表。该命令的具体内容可在事务SM69中设定(图1-8)。在SM69的初始界面中双击命令名可以查看一个外部命令的设定。图中,命令/rrrtools/saprouter_start是各Unix系统下的目录列表命令。
如果读者模仿这个设定的命令,应确保应用服务器操作系统为某种Unix系统。如果读者的应用服务器是WinNT系统,则需要使用DIR命令进行目录查询。
3、创建定制RFM示例
本节将在一个SAP R3系统(系统名为GS4)中创建一个支持远程调用的功能模块,用于获取系统中的用户和参数等信息。在本章后续内容中,将继续介绍如何在另一个SAP ECC系统(系统名为GSE)中将GS4设定为远程目标(1.3节),以及如何在GSE中调用该功能模块(1.4节)。
创建RFM的具体步骤如下:
图1-9创建功能组ZRFC
图1-10 创建功能模块RFC_USER_READ
图1-11 设定Attributes选项卡
图1-12设定Import参数
对于RFM的参数,如果不选中Pass Value选项,将在激活功能模块时出现错误提示。
图1-13 设定Export参数
图1-14 设定Tables参数
因为该功能模块可以支持远程调用,所以不仅可以在系统GS4中使用,还可以在其他系统中调用,以获得GS4系统用户的信息。图1-15为RFM ZRFC_USER_READ在系统GS4中的测试运行结果。
图1-15 RFM ZRFC_USER_READ的本地测试运行结果