在网络技术中,数据通信可以大致划分为两种基本模式:同步通信和异步通信。
其本义是:异步通信时,通信双方时钟允许存在一定误差;同步通信时,双方时钟的允许误差较小。在SAP的系统间的通信过程中,也借用术语同步通信和异步通信,但其主要差异在于调用系统是否需要立即接受返回结果。这两种通信模式各有局限性,不同的应用适用于不同的通信模式。
SAP中的同步通信是一次性的功能调用,其前提条件是在调用远程功能时(或发送请求时),接受系统(服务器)必须是活动的,可以接受请求并进行进一步的处理(图一)。同步调用的优点是可以即时将数据返还给发送系统;其缺点为在系统对话时必须确保两个系统都处于活动的状态,否则对话会出现严重中断,影响业务应用的处理过程。例如,在本地系统中创建一个采购订单,但是在保存该采购订单之前,需要远程访问中心财会系统,以进行预算检查。这个过程要求即时的检查结果,因而需要通过同步调用实现。如果中心财会系统暂时不可用,那么采购订单也将无法创建。
SAP中的异步通信的特点是接收系统并不需要在远程功能调用时处于激活状态,该系统可以滞后接收并处理该调用(图二)。如果系统部可用,已发送的请求将保存在发送系统的输出队列中,并每隔一段时间反复进行调用尝试,直到接收系统对调用响应为止。异步通信的优点是不需要接收系统随时可用,如系统维护、升级等情况均不影响请求发送系统的业务处理;但该模式不适用于要求即时响应的处理过程。例如,在系统中向外部供应商发出一个采购订单,如果该供应商的系统暂时不可用,则该订单暂时置于发送的请求队列,每隔一段时间重新发送,直到供应商收到该订单为止。这一过程可以以后台作业形式完成。
以上述两种基本通信模式为基础,SAP系统中的RFC过程扩展为以下几种不同的模式。
1. 同步RFC
同步RFC(sRFC,synchronous RFC)是RFC的最原始版本,其执行基于同步通信模式,远程调用时,通信双方的系统必须均可用,调用程序等待远程功能处理结束并返回结果。
可以使用命令 CALL FUNCTION 函数的名字DESCTINATION 目的地。调用远程的ABAP 函数模块。当以这种方式调用一个函数时,总是应该包括对标准异常OMMUNICATION_FAILURE 和 SYSTEM_FAILURE 的处理。
2. 异步RFC
在异步RFC(aRFC,asynchronous RFC)中,执行并不依赖于RFC服务器系统的可用性。被调用的远程功能启动之后,调用程序继续运行,远程功能和调用程序处理相互分离。远程功能的结果可以稍后接收。
使用 STARTING NEW TASK <task name>附加关键字,可以异步的调用一个远程函数模块。任务名称可以任意选择。被调用的函数模块在它自己的工作进程中执行。只能处理两个系统异常(COMMUNICATION_FAILURE 和 SYSTEM_FAILURE)
3. 事务性RFC
事务性RFC(tRFC,taansactional RFC)广义上也属于异步通信模式,调用程序不接收调用结果而继续运行,但并不立即启动远程功能。相关联的RFC可捆绑至一个事务(即逻辑工作单元LUW,logical unit of work)中,然后通过事务性处理,将LUW内部各个调用中的更新操作作为整体提交或全部取消,且保证所有操作只执行一次,以确保RFC功能的可靠和安全。
在同步和异步RFC中,每个调用都在远程系统里创建·一个独立的工作逻辑单元(LUW),可以用事务RFC把多个远程函数分组到一个LUW中,如果发生错误则具有自动回滚机制。用IN BACKGROUND TASK附加关键字来使用tRFC,必须放在DESTINATION条目之前。
4. 队列RFC
队列RFC(qRFC,queued RFC)是事务性RFC功能上的进一步扩展。在事务性RFC中,存在多个LUW时,这些LUW的执行次序是无法确定的。如果要确保每个LUW都按照指定的顺序执行,可以通过队列RFC对事务性RFC进行序列化。
要确保事务性RFC调用中的LUW都按照其创建次序执行,需要使用队列RFC创建LUW序列。队列RFC(qRFC)是事务性RFC(qRFC)的增强版,可用于SAP-SAP及SAP-非SAP之间的连接。tRFC调用前通过函数模块TRFC_SET_QUEUE_NAME指定想要使用的队列。
5. 并行RFC
并行RFC(pRFC,parallel RFC)实质上为异步RFC,在功能上实现多个SAP系统或同一SAP系统内部不同应用服务器间,以及应用服务器内部各个工作过程的并行处理。
特殊的RFC,它是aRFC的一种扩展类型。因为它改善了系统的性能,在执行大量的aRFC时。SAP使用它在MRP(Material Requirement Planning 物料需求计划)里面提高速度。
上述模式中的前三种是RFC的基本模式,而队列RFC和并行RFC可以视为是基本模式的扩展或衍生。
RFC Remote function Call 远程功能调用, 是SAP系统之间以及非SAP系统之间程序通信的基本接口技术. 例如BAPI , ALE都是基于RFC实现的。
RFC连接类型:
1. 类型2: R/2连接
2. 类型3: ABAP连接或R/3连接,指定主机名和通信服务
3. 类型I:内部连接,与当前系统连接到同一ABAP系统中,预定义无法修改,与SM51中所显示的应用服务器名相同
4. 类型L:逻辑目标,通常工作流系统指定过程中配置的RFC目标即为该类型的逻辑目标
5. 类型X:指定安装了特殊的ABAP设备驱动程序的系统,必须制定ABAP设备驱动程序名
6. 类型S:通过SNA或APPC启动的外部程序连接
7. 类型M:通过CMC到ABAP系统的异步RFC连接
8. 类型T:通过TCP/IP并使用RFC库或SAP连接器的外部程序连接;分为启动(指定主机名、程序路径名)和注册(RFC服务器程序)两种连接模式。
9. 类型G:定义外部系统到本地HTTP连接
10. 类型H: 定义ABAP系统到本地的HTTP连接
远程调用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 语句出现时,一次性执行一个或多个远程功能
远程功能调用时,仅允许通过值传递参数,不能进行引用传递,因为在RFC过程中,可以传递参数,并返回结果,但不能改变调用程序的上下文
对表类型参数,在本地普通功能调用中默认为引用传递,不需要创建内表的本地副本,但RFC不支持引用传递机制,将进行隐式的值传递调用,必须在RFC客户和RFC服务器之间交换整个表,只传输实际表格,如果没有指定表参数,则在被调用功能中使用空表。
RFC使用delta管理机制最小化参数和结果传递构成中的网络负载,delta的意思就是只传递已经变化的数据。
RFC上下文:
SAP程序本地正常情况调用功能模块是,模块将在调用程序的工作过程内部运行(work process),但是系统调用功能模块RFM时,系统将在独立的工作进程中运行该模块。通过RFC接口进行的所有远程功能调用都在目标系统中存在一个独立的RFC上下文,即该RFC内存滚动区roll area。
执行RFC服务器系统中的远程调用功能后,该功能模块的功能组将被加载至运行时程序上下文的会话,即功能模块的主程序(或非ABAP得RFC服务器程序)。
一旦初始化了一个功能模块,程序就将整个功能组载入至主程序的上下文,并保持至调用程序结束。
目标为非SAP系统时,该功能通过RFC库中的API实现(RfcAbort或RfcClose),或通过功能模块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,系统将打开新会话进行远程调试。
RFC与Unicode
Unicode是一种编码体系,建立在Unicode编码体系上的系统称为Unicode系统,在Unicode系统和非Unicode系统间进行RFC调用时,可能会出现与代码页(code page)转换相关的问题
同步RFC方式的RFM调用
同步RFC要求远程系统在调用时可用,调用程序的处理暂停,并等待远程功能调用的返回结果再继续。
对于表类型参数,只有扁平结构内表可以被传输,其他类型参数可以用于传输纵深类型以及STRING类型的数据,将内表通过tables参数进行传输将获取较快的传输速度,因为系统内部通过的二进制格式而不是XML格式进行传输。
如果远程RFM处理时出现交互对话过程,将在当前调用程序的会话中先进行远程对话处理,处理结束后再继续调用程序
在远程系统为SAP ABAP系统的情况下,可以对功能模块进行正常的调试,即step in远程模块,系统在当前会话中进行远程调试,完成后再回到调用程序的调试界面。
同步调用的异常处理:
同步调用RFC时,系统自动处理标准异常communication_failure和system_failure
若在系统中没有正确维护远程目标,或到远程系统的连接不能建立,系统将触发communication_failure异常
若连接成功,但指定的远程功能不存在于目标系统中,系统将触发system_failure
在上程序加错误处理:
- Exceptions:
- Communication_failure = 1 message meg_text.
- System_failure = 2 message meg_text.
若发生异常,不会引起Short Dumpt中断,与该异常相关的中断的首行说明内容被传递到message附加项指定的变量msg_text中,变量类型为扁平的字符结构。
- 确保远程目标在SM59种被维护
- 确保功能模块存在于该目标系统中
异步RFC方式RFM调用:
- CALL FUNCTION rfm_name
- STARTING NEW TASK taskname
- [DESTINATION dest]
- [EXPORTING p1 = a1 ... pn = an ... ]
- [TABLES t1 = itab1 ... tn = itabn ... ]
- [EXCEPTIONS exc1 = e1 ... [MESSAGE mess] ...
- excn = en ... [MESSAGE mess] ...
- [OTHERS = n_others].
STARTING NEW TASK 指明异步调用模式,功能模块在新的工作过程中执行,也可以再后台模式处理异步RFC调用过程,在后台处理时,每个异步RFC调用也将占据一个对话工作过程。
异步RFC调用过程只能使用TABLES、EXPORTING(对应功能模块设定中的Import参数)、EXCEPTIONS参数。调用程序并不等待该模块的返回结果,因而不能指定IMPORTING 参数,即不能直接接收从被调用功能中的返回信息。调用的同时只能接收系统标准异常,对于功能模块中抛出的其他特点异常则不能直接接收
异步远程对话处理和调试
- 异步RFC调用过程也支持远程对话处理,在异步RFC调用时,系统总是打开新的工作进程,因而如果被调用功能模块包含对话程序(屏幕调用处理),则在该功能模块执行时,调用系统中将出现新的外部会话窗口,若调用功能时打开的会话数自己达到6个,则试图打开新窗口时触发system_failure.
- 异步RFC调用时,对RFM进行step in的调试过程,调用程序本身的调试会话不会进入RFM内部,系统也打开新的会话,单独增加一个窗口,进行目标系统中RFM的调试,将断点放在RFM的CALL FUNCTION语句处,在异步RFC模式下进行调试
异步RFC调用时接收结果
通过语句中的附加项PERFORMING return_form on end of task 实现
- CALL FUNCTION rfm_name
- STARTING NEW TASK taskname
- PERFORMING return_form ON END OF TASK
- ...
- FORM return_form USING taskname.
- RECEIVE RESULTS FROM FUNCTION rfm_name
- ENDFORM.
子程序必须存在于调用程序中,如果回调子程序中包含任何使当前程序执行中断的语句,call screen、submit、commit work、wait、RFC调用及W或I类型的消息等,则不能成功返回结果。
参考程序源代码:
代码语言:javascript复制DATA: user_addr TYPE user_addr,
system_id TYPE sysysid,
user_para LIKE TABLE OF usr05 WITH HEADER LINE,
msg_text(128).
CALL FUNCTION 'ZRFC_USER_READ'
DESTINATION 'GS4CLNT100'
STARTING NEW TASK 'B1'
PERFORMING return_user ON END OF TASK
EXPORTING
user_name = 'JIAH'
EXCEPTIONS
communication_failure = 1 MESSAGE msg_text
system_failure = 2 MESSAGE msg_text.
IF sy-subrc = 0.
WRITE: 'Wait for reply.'.
ELSE.
WRITE msg_text.
ENDIF.
IF user_para IS INITIAL.
WRITE:/ 'Destination not ready yet.'.
ELSE.
WRITE:/ 'Destination is reached.'.
ENDIF.
AT USER-COMMAND.
* Return from FORM routine RETURN_USER via SET USER-COMMAND
IF sy-ucomm = 'OKCD'.
IF msg_text = space.
WRITE: / 'Destination system', system_id.
LOOP AT user_para.
WRITE:/ user_para-bname,
user_para-parid,
user_para-parva.
ENDLOOP.
ELSE.
WRITE msg_text.
ENDIF.
ENDIF.
*&---------------------------------------------------------------------*
*& Form RETURN_USER
*&---------------------------------------------------------------------*
FORM return_user USING taskname.
RECEIVE RESULTS FROM FUNCTION 'ZRFC_USER_READ'
IMPORTING
user_addr = user_addr
system_id = system_id
TABLES
user_para = user_para
EXCEPTIONS
communication_failure = 1 MESSAGE msg_text
system_failure = 2 MESSAGE msg_text.
SET USER-COMMAND 'OKCD'.
ENDFORM. "return_info
Receive results from function从RFM中接收结果.
程序在运行时的行为如下:主程序运行期间,RFM在其他工作过程中运行,因此系统变量sy-subrc和程序变量不会被更新,主程序将文本发送至输出列表的缓冲区中。
语句WAIT UNTILL用于异步RFC调用中等待结果的返回,该项必须与performing附加项配合使用,否则没有意义:
WAIT UNTIL log_exp [UP TO sec SECONDS].
当满足log_exp条件后,程序继续执行,否则程序将挂起,并等待异步RFC调用的返回结果,当功能模块调用结束时,系统将自动执行回调子程序,在其中接收返回结果并设定相关的逻辑条件变量值,子程序结束后将回到wait untill语句,在多个异步RFC调用存在的情况下,等待过程将反复重复,直到等待条件被满足,或不再有其他开发的异步RFC调用
WAIT UNTILL NOT FLAG1 IS INITIAL AND NOT FLAG2 IS INITIAL.
保持远程上下文:
在receive语句中,通过keeping task附加项可以使已经加载的远程上下文保持至调用程序结束,直到远程连接终止为止。
并行RFC方式的RFM调用
实际是异步RFC调用的应用之一。
异步RFC调用实现并行处理:
异步RFC调用适用于多个SAP ABAP系统间的并行处理(不支持SAP系统和其他系统间的并行过程)
在同一SAP系统内部使用异步RFC调用,将部分处理负载转移到其他的应用服务器,方法时将RFC目标指定为其他应用服务器
若不显示指定异步RFC调用目标,在同一应用服务器内,可以通过本地异步RFC调用实现多个工作过程的并行处理
T-CODE: SM59 可将SAP系统中的应用服务器分配成不同的RFC分组,异步调用时,通过DESTINATION子句中的IN GROUP附加项指定一个已定义的RFC分组。若不显示指定RFC组,还可以使 用关键字DEFAULT,系统从全部可用的应用服务器中选择一个处理。
参考源代码:
代码语言:javascript复制TYPES: BEGIN OF task_type,
name TYPE string,
dest TYPE string,
END OF task_type.
DATA: snd_jobs TYPE i,
rcv_jobs TYPE i,
exc_flag TYPE i,
info TYPE rfcsi,
mess TYPE c LENGTH 80,
indx TYPE c LENGTH 4,
name TYPE c LENGTH 8,
task_list TYPE STANDARD TABLE OF task_type,
task_wa TYPE task_type.
DO 10 TIMES.
indx = sy-index.
CONCATENATE 'Task' indx INTO name.
CALL FUNCTION 'RFC_SYSTEM_INFO'
STARTING NEW TASK name
DESTINATION IN GROUP DEFAULT
PERFORMING rfc_info ON END OF TASK
EXCEPTIONS
system_failure = 1 MESSAGE mess
communication_failure = 2 MESSAGE mess
resource_failure = 3.
CASE sy-subrc.
WHEN 0.
snd_jobs = snd_jobs 1.
WHEN 1 OR 2.
MESSAGE mess TYPE 'I'.
WHEN 3.
IF snd_jobs >= 1 AND
exc_flag = 0.
exc_flag = 1.
WAIT UNTIL rcv_jobs >= snd_jobs
UP TO 5 SECONDS.
ENDIF.
IF sy-subrc = 0.
exc_flag = 0.
ELSE.
MESSAGE 'Resource failure' TYPE 'I'.
ENDIF.
WHEN OTHERS.
MESSAGE 'Other error' TYPE 'I'.
ENDCASE.
ENDDO.
WAIT UNTIL rcv_jobs >= snd_jobs.
LOOP AT task_list INTO task_wa.
WRITE: / task_wa-name, task_wa-dest.
ENDLOOP.
*&---------------------------------------------------------------------*
*& Form rfc_info
*&---------------------------------------------------------------------*
FORM rfc_info USING name.
task_wa-name = name.
rcv_jobs = rcv_jobs 1.
RECEIVE RESULTS FROM FUNCTION 'RFC_SYSTEM_INFO'
IMPORTING
rfcsi_export = info
EXCEPTIONS
system_failure = 1 MESSAGE mess
communication_failure = 2 MESSAGE mess.
IF sy-subrc = 0.
task_wa-dest = info-rfcdest.
ELSE.
task_wa-dest = mess.
ENDIF.
APPEND task_wa TO task_list.
ENDFORM. "rfc_info
WAIT UNTILL LOG_EXP UP TO N SECONDS.程序中断时间最长是N秒
事务性RFC方式的RFM调用:
同步、异步RFC过程中,每一个RFC调用在远程系统中构成一个独立的LUW
事务性RFC调用,可以将多个逻辑上相关的远程调用绑定至同一个LUW上,在该LUW内,按顺序调用,要么执行所有数据库操作,要么完全回滚来取消全部数据库更新操作,保证RFC调用过程的完整性和数据一致性
事务性RFC调用处理保证在程序到达COMMIT WORK语句时执行所有计划的更新,并保证事务性RFC调用仅运行一次
该调用具有安全、可靠的特点
代码语言:javascript复制CALL FUNCTION rfm_name
IN BACKGROUND TASK
[DESTINATION dest]
[EXPORTING p1 = a1 ... pn = an ... ]
[TABLES t1 = itab1 ... tn = itabn ... ]
[AS SEPARATE UNIT].
CALL FUNCTION rfm_name
IN BACKGROUND UNIT oref
[EXPORTING p1 = a1 ... pn = an ... ]
[TABLES t1 = itab1 ... tn = itabn ... ].
其中oref必须引用一个接口IF_BGRFC_UNIT实现类的对象
在相邻两个COMMIT WORK之间出现的所有相同目标的异步调用都属于同一个LUW
事务性RFC不需要等待每个单独的更新过程完成,调用程序就可以立即继续进行,知道事务结束
若调用发送时,远程系统不可用,调用将设为后台作业运行,不能从调用模块接收返回结果,不允许调用者进行与远程系统的交互性对话及测试
调用参数
不能直接或通过RECEIVE RESULTS FROM FUNCTION语句接收RFM的返回结果,FM的接口不应指定任何EXPORT类型参数,在CALL FUNCTION语句中的IMPORTING参数将导致编译错误
事务性运行的功能模块中不适合进行回调(调用远程目标BACK)
事务性RFC调用示例
代码语言:javascript复制CALL FUNCTION 'TRAVEL_BOOK_REMOTE'
IN BACKGROUND TASK
DESTINATION 'GSE'
EXPORTING
FLIGHT = sflight
CUSTOMERID = customer.
…
COMMIT WORK.
直到COMMIT WORK 语句才开始于远程系统进行联系
TRAVEL_BOOK_REMOTE是一个适合进行事务性RFC调用的RFM,只进行远程系统中的数据库更新,不需要返回任何数据
事务ID
每一个事务性RFC调用均通过一个独特的事物ID(Transactional ID,TID)
TID存在于数据库表ARFCSSTATE和ARFCSDATA,ARFCSSTATE记录LUW执行状态,ARFCSDATA包含事务性RFC调用的输入数据
作业执行过程中,从事务性RFC表中读取相关数据,与相应的事务性RFC进行通信,远程LUW成功执行,则相应的条目在表中删除,因此,若LUW运行成功,则无法重新执行因而保证了仅仅执行一次
若COMMIT WORK同时触发了本地更新操作,则事务性RFC调用在本地更新成功完成之后才开始运行
设定作业开始时间
如果希望在特定时间启动LUW,可以通过功能模块START_OF_BACKGROUPTASK设置作业开始的时间,必须在LUW内部调用该功能模块,必须在第一个CALL…IN BACKGROUNDTASK语句之后和COMMIT WORK语句之前调用该功能模块
对于某个调用需要创建独立的事务,不参与其他目标的事务性RFC调用作何至一个LUW,可以通过AS SEPARATE UNTIAL附加项实现
各个LUW处理都是独立进行的,执行次序无法被保证
出错处理机制
发生错误,事务性RFC调用将启动重试机制或者回滚
通过COMMIT WORK执行远程调用时,不能建立到目标系统的连接,将在ARFCSSTATE表中记录当前状态,系统通过报表RSARFCSE根据当前的TID重新计划后台作业,准备进行下一次调用。
默认时间间隔15分钟,尝试至30次为止
Tools-Administraion-Administraion-Network-RFCdestinations-Destination-TRFC options进行尝试次数、时间间隔设定
若经过最大尝试次数,系统仍然无法连接,系统将停止调用报表RSARFCSE,将ARFCSDATA状态更新为CPICERR,默认8天,将表中的响应条目删除,SM59可以手动启动该条目
执行出错,A类型的消息或者RAISE语句抛出异常,则ARFCSSTATE表将记录出错状态,整个RFC中的操作将取消, SM58查看该错误,修改错误后,通过SM58重新启动出错的RFM
在RFM中,功能模块RESTART_OF_BACKGROUNDTASK启动重试功能
检查事务性RFC调用状态:
每个LUW都用过唯一的TID进行标识,两种方法检查TID状态:
ABAP程序:在CALL… IN BACKGROUND TASK之后和COMMIT WORK之前调用FM“ID_OF_BACKGROUNDTASK”,获得TID后,用FM“STATUS_OF_BACKGROUNDTASK”确定事务性RFC的状态
代码语言:javascript复制CALL FUNCTION 'TRAVEL_BOOK_REMOTE'
IN BACKGROUND TASK
DESTINATION 'GSE'
EXPORTING
FLIGHT = sflight
CUSTOMERID = customer.
...
CALL FUNCTION 'ID_OF_BACKGROUNDTASK'
IMPORTING TASK-ID = tid.
...
CALL FUNCTION 'STATUS_OF_BACKGROUNDTASK'
EXPORTING
TID = tid
IMPORTING
ERRORTAB = errtab
EXCEPTIONS
COMMUNICTATION = 01 "Connection not available: will try again later
RECORDED = 02 "ARFC is scheduled
ROLLBACK = 03 "Rollback triggered in target system
...
COMMIT WORK.
联机确认:通过SM58显示并维护事务性RFC的LUW状态
队列RFC方式的RFM调用
确保事务性RFC调用中的LUW都按照其创建次序执行,需要使用队列RFC创建LUW序列。
队列RFC是事务性RFC的增强版本,用于SAP-SAP及SAP-非SAP系统间的连接
多个FM发送至目标系统中的三种可能情况(实际的连接过程仍然通过事务性RFC来实现,可以增加入站、出站队列),普通事务性RFC、含出站队列的队列RFC、含出入站队列的队列RFC,出站队列在队列RFC中是必须的
出站调度器用于控制其他逻辑目标系统中的LUW执行
入站调度器控制本地系统中的队列RFC执行(目标NONE或IN BACKGROUND TASK实现为指定目标RFC)
事务SMQS可以配置出战的队列RFC序列
事务SMQR可以配置入站的队列RFC序列
需要在普通事务性RFC调用之前使用功能模块TRFC_SET_QUEUE_NAME来指明后续的事务性RFC所要插入的出战队列
通过FM TRFC_SET_QIN_PROPERTIES来完成,入站队列
本地RFM调用和回调
通过DESTNATION附加项的两个特殊目标NONE和BACK,可以进行RFM本地远程调用和回调
调用本地系统中的远程功能模块,即调用当前系统内部的RFM
CALL FUNCTION语句格式决定以远程调用、非远程调用方式运行
远程调用:
代码语言:javascript复制 CALL FUNCTION rfm_name
DESTINATION 'NONE'
...
CALL FUNCTION ‘RFC_CUSTOMER_GET’
DESTINATION 'NONE'
EXPORTING
KUNNR = custno
TABLES
CUSTOMER_T = itab
EXCEPTIONS
NO_RECORD_FOUND = 01.
本地调用:call function 语句没有destination、starting new task、in background taskunit任意出现,不在单独的内存滚动区中运行,若当调用没有指定某些必选exporting参数时,会引起系统异常终止
代码语言:javascript复制CALL FUNCTION ‘RFC_CUSTOMER_GET’
EXPORTING
KUNNR = CUSTNO
TABLES
CUSTOMER_T = ITAB
EXCEPTIONS
NO_RECORD_FOUND = 01.
CALL FUNCTION rfm_name
DESTINATION SPACE.
远程回调:
在服务器执行远程功能时,该服务器可以调用客户中随调用程序载入内存的功能模块,称为回调
通过特殊目标BACK可以触发回调机制
代码语言:javascript复制CALL FUNCTION rfm_name
DESTINATION ‘BACK’
只有同步调用时,才可以在服务器中被调用功能模块中使用BACK功能
各种RFC调用总结:
同步RFC调用需要等待RFM返回结果;异步RFC不需要,但需要通过RECEVICE语句在回调子程序中接收结果;事务性RFM不能接收RFM返回值
同步异步RFC调用,服务器系统必须在调用时可用;事务性RFC无此限制
同步异步RFC调用过程,允许用户与远程系统进行交互对话;事务性RFC不允许
同步异步RFC调用过程,参数值将直接传输至支持远程调用的功能模块;事务性RFC,参数值暂时存储在数据库中
对于异步RFC,只适用于SAP系统内部或之间的调用,不能通过T类型目标连接至外部系统
事务性RFC、队列RFC支持状态查询