二维码

[RFC] 支持远程调用的功能模块RFM

Twilight发表于 2014-03-18 22:39Twilight 最后回复于 2014-03-18 22:39 [复制链接] 5260 0

        RFM是一种支持外部系统进行远程调用的SAP功能模块。在RFC调用过程中,如果被调用方为SAP系统,则其中提供的程序模块必须为支持远程调用的功能模块。
1、RFM概述
        在SAP中,RFM的创建方式与普通功能模块类似。只是编写功能模块时,需要在Attributes选项卡中,将Processing Type选项设定为Remote-Enabled Module,该设定将该模块注册为支持远程调用的功能模块。图1-6即为一个SAP提供的RFM,读者可以通过在功能创建器(事务代码SE37)
中指定功能模块名称后浏览其属性。
        除选中Remote-Enabled Module选项外,维护RFM时,还需要注意下面一些要点。
        (1)参数声明。普通的功能模块定义形参时并不一定要指明所参照的数据字典类型,具体类型可在运行时根据实参类型确定。但RFM则不能在运行时确定参数类型,因而必须在参数定义时参照数据字典类型进行声明。
RFC.jpg
        图1-6  “支持远程功能”属性的设定
        此外,RFM中的参数必须指定为值传递(参数设定中的Pass Value选项),对于表类型参数,系统也隐式进行值传递。
        (2)格式转换。对于字符类型字段,调用程序传递给被调用模块的实参与RFM形参的定义长度并不需要完全一致。如果传入参数的长度较短,RFC将在后面补充空格。这意味着对于字符类型数据,调用和被调用方中,形参所参照的ABAP字典类型的长度可以不必完全一致。但是,调用方实参的定义长度不应大于被调用方形参的定义长度。
        (3)异常处理。可在远程功能中进行异常的抛出(raise exccption),其方法与普通功能模块一致,在程序中的异常出现之处通过RAISE语句实现。需要注意的一点是,基于ABAP类(ABAP  Class)的异常是不能从远程功能调用过程中抛回给调用系统的,因此需避免使用。
    此外,RFC接口还定义了如下两种预设的系统异常类型:
  • SYSTEM_FAILURE,SM59连接成功,但是指定的功能不在目标系统中。
  • COMMUNICATION_FAILURE,如果连接不能建立或通信中连接中断,将出现此异常,查看SM59连接是否通畅。

        系统将自动地抛出这两种异常,因此不必在程序代码中进行显式处理。但在调用RFC功能模块时必须进行接收,否则出现异常时可能会引起系统运行时Short Dump中断。这一问题在后文介绍RFM调用实例时还将具体说明。

调用功能模块时,所有其他不可知类型的异常应指定为OTHERS类型,以避免出现Short Dump.

2、调用SAP标准RFM
        在SAP中,功能模块的调用通过CALL FUNCTION语句实现。远程功能调用作为普通功能模块调用的扩展,可通过在CALL FUNCTION语句中添加DESTINATION子句完成,其他语法格式与普通调用完全相同。
  1.     CALL FUNCTION rfm_name
  2.     DESTINATION dest
  3.     parameter_list.
复制代码

        DESTINATION附加项后面接的是远程目标名称,该目标在事务SM59中设定,其中包含连接和登录远程系统所需的全部参数信息。还可以在远程调用时直接指定当前系统的应用服务器作为RFC目标,其格式为<hostname>_<sysid>_<sysnr>。其中,<hostname>为主机名.<sysid>为SAP系统名,<sysnr>为系统编号。可以通过事务SM51查看当前SAP系统中活动的应用服务器(图1-7)。
系统GSE中的应用服务器列表.jpg
        图1-7系统GSE中的应用服务器列表
        下面给出一个远程功能调用的简单示例,该示例调用了图1-6所示的SAP标准RFM SXPG_COMMAND_EXECUTE。这个功能模块通过RFC调用时可以运行本地或其他SAP系统中的外部命令,即SAP系统中特定应用服务器的操作系统级别命令。
  1. REPORT  zdemon_033.
  2. DATA: gt_protocol TYPE btcxpm OCCURS 0 WITH HEADER LINE,
  3.       l_reason TYPE string.

  4. CALL FUNCTION 'SXPG_COMMAND_EXECUTE'
  5. DESTINATION 'shaw0889_E89_00'
  6.   EXPORTING
  7.     commandname                         = 'Z_GET_DIR'
  8.     additional_parameters               = '-a'
  9. *   OPERATINGSYSTEM                     = SY-OPSYS
  10. *   TARGETSYSTEM                        = SY-HOST
  11. *   DESTINATION                         =
  12. *   STDOUT                              = 'X'
  13. *   STDERR                              = 'X'
  14. *   TERMINATIONWAIT                     = 'X'
  15. *   TRACE                               =
  16. *   Dialog                              =
  17. * IMPORTING
  18. *   STATUS                              =
  19. *   EXITCODE                            =
  20.   TABLES
  21.     exec_protocol                       = gt_protocol
  22. EXCEPTIONS
  23.    no_permission                       = 1
  24.    command_not_found                   = 2
  25.    parameters_too_long                 = 3
  26.    security_risk                       = 4
  27.    wrong_check_call_interface          = 5
  28.    program_start_error                 = 6
  29.    program_termination_error           = 7
  30.    x_error                             = 8
  31.    parameter_expected                  = 9
  32.    too_many_parameters                 = 10
  33.    illegal_command                     = 11
  34.    wrong_asynchronous_parameters       = 12
  35.    cant_enq_tbtco_entry                = 13
  36.    jobcount_generation_error           = 14
  37.    OTHERS                              = 15
  38.           .
  39. CASE sy-subrc.
  40.   WHEN 1.  l_reason = 'no_permission'.
  41.   WHEN 2.  l_reason = 'command_not_found'.
  42.   WHEN 3.  l_reason = 'parameters_too_long'.
  43.   WHEN 4.  l_reason = 'securicy_risk'.
  44.   WHEN 5.  l_reason = 'wrong_check_call_inter face'.
  45.   WHEN 6.  l_reason = 'progranLstart_error'.
  46.   WHEN 7.  l_reason = 'progranLtermination_error'.
  47.   WHEN 8.  l_reason = 'x_error'.
  48.   WHEN 9.  l_reason = 'parameter_expected'.
  49.   WHEN 10. l_reason = 'too_Mnany_parameters'.
  50.   WHEN 11. l_reason = 'illegal_command'.
  51.   WHEN 12. l_reason = 'wrong_asynchronous_paramet ers'.
  52.   WHEN 13. l_reason = 'cant_encLtbtco_entry'.
  53.   WHEN 14. l_reason = 'jobcount_generation_error'.
  54.   WHEN 15. l_reason = 'other_error'.
  55. ENDCASE.
  56. IF NOT l_reason IS INITIAL.
  57.   MESSAGE e016(rp) WITH 'Error' l_reason.
  58. ELSE.
  59.   LOOP AT gt_protocol.
  60.     WRITE: gt_protocol.
  61.   ENDLOOP .
  62. ENDIF .
复制代码

下面对本程序进行说明。
        (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系统下的目录列表命令。
SM69.jpg
sm69双击.jpg
        如果读者模仿这个设定的命令,应确保应用服务器操作系统为某种Unix系统。如果读者的应用服务器是WinNT系统,则需要使用DIR命令进行目录查询。
3、创建定制RFM示例
        本节将在一个SAP R3系统(系统名为GS4)中创建一个支持远程调用的功能模块,用于获取系统中的用户和参数等信息。在本章后续内容中,将继续介绍如何在另一个SAP ECC系统(系统名为GSE)中将GS4设定为远程目标(1.3节),以及如何在GSE中调用该功能模块(1.4节)。
        创建RFM的具体步骤如下:
  • 通过事务代码SE37 (SAP系统菜单Tools—ABAP  Workbench - Development—Function Builder),进入功能模块创建器。
  • 在功能模块创建器中选择菜单项Goto-- Functions Groups一Create Group,创建功能组。示例功能组为ZRFC(图1-9)。
    Function_Group_1.jpg
    图1-9创建功能组ZRFC
  • 创建支持远程调用的功能模块RFC_USER_READ(图1-10)
    Function_Group_2.jpg
    图1-10  创建功能模块RFC_USER_READ
  • 在Attributes选项卡中设定Remote-enablcd Module选项,确定该模块为RFM(图1-11)
    Function_Group_3.jpg
    图1-11  设定Attributes选项卡
  • 设定Import参数USER_NAME.并指定为必选参数,即调用该模块时,需指定要读取的系统用户名(图1-12)。
    Function_Group_4.jpg
    图1-12设定Import参数
    对于RFM的参数,如果不选中Pass Value选项,将在激活功能模块时出现错误提示。
  • 设定Export参数结构USER_ADDR和SYSTEM_ID,其中USER_ADDR返回用户的地址信息,SYSTEM_ID返回远程系统名(图1-13)。
    Function_Group_5.jpg
    图1-13  设定Export参数
  • 设定Tables参数USER_PARA,以返回远程系统中的用户参数(user parameter)列表(图1-14)。
    Function_Group_6.jpg
    图1-14  设定Tables参数
  • 在Source code选项卡中的代码实现如下:

  1. FUNCTION RFC_USER_READ.
  2. *"----------------------------------------------------------------------
  3. *"*"Local Interface:
  4. *"  IMPORTING
  5. *"     VALUE(USER_NAME) TYPE  XUBNAME
  6. *"  EXPORTING
  7. *"     VALUE(USER_ADDR) TYPE  USER03
  8. *"     VALUE(SYSTEM_ID) TYPE  SYSYSID
  9. *"  TABLES
  10. *"      USER_PARA STRUCTURE  USR05
  11. *"----------------------------------------------------------------------
  12. SELECT SINGLE * INTO USER_ADDR FROM USER_ADDR
  13.    WHERE BNAME = USER_NAME.
  14. SELECT  * INTO TABLE USER_PARA FROM USR05
  15.     WHERE BNAME = USER_NAME.
  16.    SYSTEM_ID = SY-SYSID.
  17. ENDFUNCTION .
复制代码

        因为该功能模块可以支持远程调用,所以不仅可以在系统GS4中使用,还可以在其他系统中调用,以获得GS4系统用户的信息。图1-15为RFM ZRFC_USER_READ在系统GS4中的测试运行结果。
Function_Group_7.jpg
图1-15   RFM ZRFC_USER_READ的本地测试运行结果
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表