SAP 高级应用开发 学习笔记 1 -- RFC NO.2

时间:2022-12-25 21:37:51

 

RFC连接类型:

1.        类型2 R/2连接

2.        类型3 ABAP连接或R/3连接,指定主机名和通信服务

3.        类型I:内部连接,与当前系统连接到同一ABAP系统中,预定义无法修改,与SM51中所显示的应用服务器名相同

4.        类型L:逻辑目标,通常工作流系统指定过程中配置的RFC目标即为该类型的逻辑目标

5.        类型X:指定安装了特殊的ABAP设备驱动程序的系统,必须制定ABAP设备驱动程序名

6.        类型S:通过SNAAPPC启动的外部程序连接

7.        类型M:通过CMCABAP系统的异步RFC连接

8.        类型T:通过TCP/IP并使用RFC库或SAP连接器的外部程序连接;分为启动(指定主机名、程序路径名)和注册(RFC服务器程序)两种连接模式。

9.        类型G:定义外部系统到本地HTTP连接

10.   类型H: 定义ABAP系统到本地的HTTP连接

 

远程调用RFM

1.        远程目标可以是文字或变量,其值为SAP系统中一直的远程目标系统

2.        若远程系统是当前系统中的SAP应用服务器,也可以直接指定应用服务器名称,则SM59中的I类型目标

3.        SM59定义的RFC目标是区分大小写的。DESTINATION附加项中目标变量的值必须与其完全一致

 

通过CALL FUNCTION语句进行远程功能调用时,可形成不同的调用模式:

1.        CALL FUNCTION DESTINATION 以同步RFC方式实现RFM调用,若后面无其他附加项,则形成同步RFC调用,调用程序等待远程调用结果以继续执行

2.        CALL FUNCTION STARTING NEW TASK 以异步RFC方式实现RFM调用,调用程序不等待远程调用结果继续执行,结果将在回调子程序(callback subroutine)中接收

3.        CALL FUNCTION IN BACKROUND TASK 以事务性RFC方式实现RFM调用,远程功能暂不开始执行,等待COMMIT WORK 语句出现时,一次性执行一个或多个远程功能

 

远程功能调用时,仅允许通过值传递参数不能进行引用传递,因为在RFC过程中,可以传递参数,并返回结果,但不能改变调用程序的上下文

 

表类型参数,在本地普通功能调用中默认为引用传递,不需要创建内表的本地副本,但RFC不支持引用传递机制,将进行隐式的值传递调用,必须在RFC客户和RFC服务器之间交换整个表,只传输实际表格,如果没有指定表参数,则在被调用功能中使用空表

 

RFC 创建连接类型时:

1.   LOAD BALANCING选择NO:指定TARGET HOSTSYSTEM NUMBER

2.  LOAD BALANCING选择YES,要指定TARGET SYSTEMSM51),MESSAGE SERVERRZ03),GROUPSMLG

 

除去SM59定义的远程目标之外,SAP提供两个预定义目标,可以再CALL FUNCTION 语句的DESTINATION附加附件中使用:

l        目标NONE,将运行当前程序的应用服务器作为目标系统,调用过程将通过RFC接口实现,并拥有RFC上下文,应用于任意调用类型

l        目标BACK,用于被远程调用的RFM内部的CALL FUNCTION 语句中的目标制定,通过已建立的RFC连接反过来调用该模块的调用者或已载入的其他功能模块

 

 

SAP ABAP 系统间的RFC实现(通过RFM实现)

远程调用RFM

1.        远程目标可以是文字或变量,其值为SAP系统中一直的远程目标系统。

2.        若远程系统是当前系统中的SAP应用服务器,也可以直接指定应用服务器名称,则SM59中的I类型目标

3.        SM59定义的RFC目标是区分大小写的。DESTINATION附加项中目标变量的值必须与其完全一致

通过CALL FUNCTION语句进行远程功能调用时,可形成不同的调用模式:

1.        CALL FUNCTION DESTINATION 以同步RFC方式实现RFM调用,若后面无其他附加项,则形成同步RFC调用,调用程序等待远程调用结果以继续执行

2.        CALL FUNCTION STARTING NEW TASK 以异步RFC方式实现RFM调用,调用程序不等待远程调用结果继续执行,结果将在回调子程序(callback subroutine)中接收

3.        CALL FUNCTION IN BACKROUND TASK 以事务性RFC方式实现RFM调用,远程功能暂不开始执行,等待COMMIT WORK 语句出现时,一次性执行一个或多个远程功能

 

RFM参数处理

远程功能调用时,仅允许通过值传递参数,不能进行引用传递,因为在RFC过程中,可以传递参数,并返回结果,但不能改变调用程序的上下文

对表类型参数,在本地普通功能调用中默认为引用传递,不需要创建内表的本地副本,但RFC不支持引用传递机制,将进行隐式的值传递调用,必须在RFC客户和RFC服务器之间交换整个表,只传输实际表格,如果没有指定表参数,则在被调用功能中使用空表

RFC使用delta管理机制最小化参数和结果传递构成中的网络负载,delta的意思就是只传递已经变化的数据。

 

RFC上下文:

SAP程序本地正常情况调用功能模块是,模块将在调用程序的工作过程内部运行(work process),但是系统调用功能模块RFM时,系统将在独立的工作进程中运行该模块。通过RFC接口进行的所有远程功能调用都在目标系统中存在一个独立的RFC上下文,即该RFC内存滚动区roll area

执行RFC服务器系统中的远程调用功能后,该功能模块的功能组将被加载至运行时程序上下文的会话,即功能模块的主程序(或非ABAPRFC服务器程序)。

一旦初始化了一个功能模块,程序就将整个功能组载入至主程序的上下文,并保持至调用程序结束。

目标为非SAP系统时,该功能通过RFC库中的API实现(RfcAbortRfcClose,或通过功能模块RFC_CONNECTION_CLOSE显示关闭RFC连接

 

RFM调用中的LUM和隐式数据库提交

SAP存在特定的数据库提交和回滚机制,该机制就是通过LUW(逻辑工作单元)实现的。通常情况下的功能模块和柱程序位于相同的LUM中,因此不会触发数据库提交或回滚的过程(该过程通常通过COMMIT/ROLLBACK语句显示触发)。但同步RFC和异步RFC调用中的每一个功能模块都拥有自己的LUM,即在每次远程调用时,当前程序都将进行内存区的释放,因此将触发隐式的数据库提交,之前的所有数据库更新将不能回滚,对于事务性RFC,则有管机制将多个远程调用操作绑定至同一个LUM,整体提交或回滚。

 

RFM调用中的对话处理

对于同步RFC和异步RFC调用,可以存在对话dialog过程,例如call screen / call transaction或列表处理等情况,RFC可以进行后台处理,但如果在后台中心处理RFC中的对话,则将导致程序中断,从而触发系统异常SYSTEM_FAILURE

 

RFM调用

在进行ABAP-ABAP同步RFC和异步RFC调用时,可以进行调试以监控远程系统中RFC功能执行的情况,可以设置静态断点、单步执行、观察变量等功能,对于同步RFC,系统在当前会话中进入远程调式界面,对于异步RFC,系统将打开新会话进行远程调试。

 

RFCUnicode

Unicode是一种编码体系,建立在Unicode编码体系上的系统称为Unicode系统,在Unicode系统和非Unicode系统间进行RFC调用时,可能会出现与代码页(code page)转换相关的问题