RFC : Remote Function Call 远程功能调用, 是SAP系统之间以及SAP与外部系统之间的通信的基本接口技术
RFC过程就是系统调用当前系统外的程序模块,从而实现某个功能,而且调用系统和被调用系统中至少有一个必须是SAP ABAP系统
SAP 外部接口:
1、程序通信接口
2、文件I/O接口
3、数据接口
数据接口:技术实现BDC、SAP SQL
程序通信接口和文件I/O接口是与其他系统进行数据交换的通路
RFC是基于CPI-C实现的。
RFC的调用过程:
1. 在系统间通信过程中,需要区分发送系统和接受系统。
2. RFC调用请求从发送系统中传至接收系统
发送请求的系统在通信过程中称为RFC客户端,通信另一方则称为RFC服务器
1. RFC客户端发起远程功能调用以执行RFC服务器提供的功能
2. 调用系统和被调用系统均可以使SAP系统或非SAP系统
RFC通信方式:
1. 两个独立的SAP系统之间通信
2. SAP系统作为调用系统,与外部远程系统(非SAP ABAP系统)通信
3. 外部系统作为调用系统,与SAP系统通信
在SAP系统之间,两个ABAP程序通过RFC接口进行通信
1. 系统A调用SAP系统B中的功能模块
2. B系统中被调用的SAP功能模块必须支持远程调用,该SAP功能模块称为RFM
在于其他语言的程序进行通信时,SAP将为各种语言及相关的操作系统提供RFC库及SAP连接器,以实现RFC接口,如:
SAP调用远程功能的能力是通过RFC接口系统(RFC interface system)实现的。
RFC接口提供以下两种服务:
CALL FUNCTION . . . DESTINATION, 若远程功能来自SAP ABAP系统,则FM必须是实际的功能模块,并支持RFC远程调用
SAP系统为外部程序提供RFC支持接口和GUI支持接口,这样非SAP系统中,外部程序就能调用并执行SAP RFM,反之亦然
RFC调用时,RFC接口具体功能包括:
RFC通信模式:
SAP系统中的RFC过程扩展下述几种不同模式:
支持远程调用的功能模块 RFM:
SYSTEM_FAILURE,报告远程系统中的所有失败和系统问题
COMMUNICATION_FAILURE,若不能建立或通信中连接中断,抛出异常
系统将自动地抛出以上2种异常,不必再程序代码总进行显示处理,调用RFC功能时必须接收,否则出现异常时可能引起系统运行时SHORT DUMP中断,所有其他不可知类型的异常指定为OTHERS类型。
调用SAP标准RFM
例:调用SAP 标准RFM:SXPG_COMMAND_EXECUTE,通过RFC调用时可以运行本地或其他SAP系统中的外部命令
*&---------------------------------------------------------------------* *& Report ZTEST_001_16 *& *&---------------------------------------------------------------------* *& *& *&---------------------------------------------------------------------* REPORT ztest_001_16. DATA: gt_protocol TYPE btcxpm OCCURS 0 WITH HEADER LINE, l_reason TYPE string. CALL FUNCTION 'SXPG_COMMAND_EXECUTE' * DESTINATION 'sapr3gse_GSE_10' DESTINATION 'KFED1_KF1_00' EXPORTING commandname = 'Z_GET_DIR' additional_parameters = '-a' * OPERATINGSYSTEM = SY-OPSYS * TARGETSYSTEM = SY-HOST * DESTINATION = * STDOUT = 'X' * STDERR = 'X' * TERMINATIONWAIT = 'X' * TRACE = TABLES exec_protocol = gt_protocol EXCEPTIONS no_permission = 1 command_not_found = 2 parameters_too_long = 3 security_risk = 4 wrong_check_call_interface = 5 program_start_error = 6 program_termination_error = 7 x_error = 8 parameter_expected = 9 too_many_parameters = 10 illegal_command = 11 wrong_asynchronous_parameters = 12 cant_enq_tbtco_entry = 13 jobcount_generation_error = 14 OTHERS = 15. CASE sy-subrc. WHEN 1. l_reason = 'no_permission'. WHEN 2. l_reason = 'command_not_found'. WHEN 3. l_reason = 'parameters_too_long'. WHEN 4. l_reason = 'security_risk'. WHEN 5. l_reason = 'wrong_check_call_interface'. WHEN 6. l_reason = 'program_start_error'. WHEN 7. l_reason = 'program_termination_error'. WHEN 8. l_reason = 'x_error'. WHEN 9. l_reason = 'parameter_expected'. WHEN 10. l_reason = 'too_many_parameters'. WHEN 11. l_reason = 'illegal_command'. WHEN 12. l_reason = 'wrong_asynchronous_parameters'. WHEN 13. l_reason = 'cant_enq_tbtco_entry'. WHEN 14. l_reason = 'jobcount_generation_error'. WHEN 15. l_reason = 'other_error'. ENDCASE. IF NOT l_reason IS INITIAL. MESSAGE e016(rp) WITH 'Error' l_reason. ELSE. LOOP AT gt_protocol. WRITE: gt_protocol. ENDLOOP. ENDIF.
本例子中: