KSO-SAP ABAP调用远程RFC函数详细过程

2023-12-29 17:09:59

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


创建abap函数 KSO-SAP,ABAP创建远程RFC函数

前言RFC几种调用模式

1. 同步RFC

同步RFC(sRFC,synchronous RFC)是RFC的最原始版本,其执行基于同步通信模式,远程调用时,通信双方的系统必须均可用,调用程序等待远程功能处理结束并返回结果。是应该包括对标准异常OMMUNICATION_FAILURE 和 SYSTEM_FAILURE 的处理。

2. 异步RFC

在异步RFC(aRFC,asynchronous RFC)中,执行并不依赖于RFC服务器系统的可用性。被调用的远程功能启动之后,调用程序继续运行,远程功能和调用程序处理相互分离。远程功能的结果可以稍后接收。
使用 STARTING NEW TASK 附加关键字,可以异步的调用一个远程函数模块。任务名称可以任意选择。被调用的函数模块在它自己的工作进程中执行。只能处理两个系统异常(COMMUNICATION_FAILURE 和 SYSTEM_FAILURE)

3. 事务性RFC

事务性RFC(tRFC,taansactional RFC)广义上也属于异步通信模式,调用程序不接收调用结果而继续运行,但并不立即启动远程功能。相关联的RFC可捆绑至一个事务(即逻辑工作单元LUW,logical unit of work)中,然后通过事务性处理,将LUW内部各个调用中的更新操作作为整体提交或全部取消,且保证所有操作只执行一次,以确保RFC功能的可靠和安全。

4. 队列RFC

队列RFC(qRFC,queued RFC)是事务性RFC功能上的进一步扩展。在事务性RFC中,存在多个LUW时,这些LUW的执行次序是无法确定的。如果要确保每个LUW都按照指定的顺序执行,可以通过队列RFC对事务性RFC进行序列化。

5. 并行RFC

并行RFC(pRFC,parallel RFC)实质上为异步RFC,在功能上实现多个SAP系统或同一SAP系统内部不同应用服务器间,以及应用服务器内部各个工作过程的并行处理。

一、创建远程链接SM59(对方也是sap系统)

点击新建创建新的链接
在这里插入图片描述
在这里插入图片描述
连接类型详细解释:
RFC连接类型:
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连接

创建目标主机:输入目标主机和实例号

在这里插入图片描述
输入对方的用户密码等一些基础信息:,点击连接测试
在这里插入图片描述
在这里插入图片描述
出现以下状况就是成功了:
在这里插入图片描述

二、使用步骤创建SE38程序

data:
  lv_dest type rfcdes-rfcdest value 'ZKSO_RFC6', "上面SM59创建的链接对象名称
  ls_res  type trexs_connection_check_result.

"远程是否连接测试函数
call function 'TREX_RFC_CONNECT_CHECK_LOCAL'
  exporting
    trex_destination        = lv_dest
  importing
    local_result            = ls_res
  exceptions
    system_failure          = 1
    communication_failure   = 2
    authority_not_available = 3
    send_error              = 4
    others                  = 5.
if ls_res-ping_time = '        0'."无响应
  message 'SAP 联通 失败' type 'I'.
else .
  write : / 'ZKSO RFC 5  OK'.
endif.

data:
  lo_root       type ref to cx_root,
  lv_subrc      type sy-subrc,
  lv_error_text type c length 100,
  lv_rfc        type funcname value 'ZKSO_RFC5'. " 被调用方RFC函数名称

data gs_message type message .
data i_zmatnr type matkl .
types: begin of gty_war,
         mandt         type  mandt,
         zwarhouseid   type c length 10,
         zwarhousename type c length 50,
         zaddr         type c length 50,
         zcreatetime   type dats,
         zisstart      type c length 2,
       end of gty_war .
data gt_datanew type table of gty_war .

* 发送数据
try.
    call function lv_rfc
      destination lv_dest
      exporting
        i_zmatnr              = 'R1FC'
      importing
        e_message             = gs_message
      tables
        gt_data               = gt_datanew
      exceptions
        system_failure        = 1 message lv_error_text
        communication_failure = 2 message lv_error_text
        others                = 99.
    write :  /  gs_message  .
    loop at gt_datanew assigning field-symbol(<styu>).
     write : /   <styu>-zwarhousename  .
    endloop.
  catch cx_root into lo_root.
    data(lv_message) = lo_root->get_text( ).
    message lv_message type 'S' display like 'E'.
endtry.
"=================================异步的方式=========
call function lv_rfc
      destination lv_dest
      STARTING NEW TASK 'ZKSO_TASK1'
      exporting
        i_zmatnr              = 'R1FC'
      importing
        e_message             = gs_message
      tables
        gt_data               = gt_datanew
      exceptions
        system_failure        = 1 message lv_error_text
        communication_failure = 2 message lv_error_text
        others                = 99.
"=================================事务的方式=========
call function lv_rfc
      destination lv_dest
      STARTING NEW TASK 'ZKSO_TASK1'
      exporting
        i_zmatnr              = 'R1FC'
      importing
        e_message             = gs_message
      tables
        gt_data               = gt_datanew
      exceptions
        system_failure        = 1 message lv_error_text
        communication_failure = 2 message lv_error_text
        others                = 99.
if sy-subrc = 0 .
  COMMIT  WORK.   "提交函数
endif.
  

文章来源:https://blog.csdn.net/weixin_44320901/article/details/135290701
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。