SAP系统集成
SAP系统集成概述
SAP系统作为全球领先的企业级应用软件,在企业资源计划(ERP)、供应链管理(SCM)和客户关系管理(CRM)等领域占据核心地位。其系统集成主要涉及以下关键概念:
SAP核心集成技术
- RFC(Remote Function Call):
- SAP系统间的远程函数调用协议
- 支持同步/异步通信模式
- 典型应用:财务模块的实时数据交互
- IDoc(Intermediate Document):
- SAP专用的中间文档格式
- 典型应用:采购订单(ORDERS05)、发货通知(DESADV)等业务单据交换
典型集成场景
供应链协同
- 供应商门户与SAP MM模块集成
- 采购订单自动生成与状态跟踪
- 库存水平实时可视化管理
财务一体化
- 与银行系统的支付指令交换
- 电子发票与财务凭证自动匹配
- 跨系统成本中心数据同步
制造执行
- MES系统与SAP PP模块数据交互
- 生产订单状态实时更新
- 质量检验结果自动回传
ESB在SAP集成中的作用
企业服务总线(ESB)作为集成平台的核心组件,为SAP系统集成提供以下关键能力:
协议转换中枢
- 实现HTTP/SOAP/REST等现代协议与SAP RFC/IDoc协议的双向转换
业务流程编排
- 构建跨SAP模块的复合业务流程(如订单到现金流程)
- 实现SAP与非SAP系统的长事务协调
- 提供基于内容的路由能力(如按工厂代码分发物料主数据)
数据治理平台
- 统一主数据模型映射(如客户/供应商主数据)
- 提供数据校验和清洗规则引擎
- 实现敏感数据的脱敏处理(如财务数据加密)
运维监控中心
- 异常处理与自动重试机制
- 接口性能分析报表(SAP RFC调用耗时统计等)
典型问题解决方案
数据一致性问题
- 建立基于时间戳的增量同步机制
- 实施端到端业务校验规则(如订单金额核对)
流程配置示例
前提条件
- sap 系统可用
需要SAP系统和SAP客户端
ECC6 测试安装虚拟机地址:https://pan.baidu.com/s/1AvgEI67BsKPnb0ikNAwjTA 提取码:prtb
虚拟机登录密码
WINDOWS系统登录密码:686470 SAPMMC登录密码:686470 000、001、066集团用户名DDIC\SAP*\GOOGLE密码:123456Abc
客户端用001,用户输入GOOGLE,密码输入123456Abc,语言选择ZH。回车键进入客户端 系统标识:ER1,实例编号 00
- 有可用的RFC函数
创建RFC函数
- 使用SAP客户端工具登录系统
- 创建函数事务码: SE37

- 输入函数名称进行创建

-
需要KEY(sap开发程序必须要使用以下KEY)-算号器SAP Keygen 1.70


配置基本属性
- 需要开启远程启用的模式,外部才能连接到

- 配置输入参数

- 配置输出参数

-
配置输出 的 表数据

-
编写 ABAP 代码,调用内部的READ_TXT函数

FUNCTION Z_TEST_READ_TXT.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(CLIENT) TYPE SY-MANDT DEFAULT SY-MANDT
*" VALUE(ID) TYPE THEAD-TDID
*" VALUE(LANGUAGE) TYPE THEAD-TDSPRAS
*" VALUE(NAME) TYPE THEAD-TDNAME
*" VALUE(OBJECT) TYPE THEAD-TDOBJECT
*" VALUE(DATE) TYPE TIMS
*" EXPORTING
*" VALUE(T_HEADER) TYPE THEAD
*" VALUE(OUTPUT_A1) TYPE CHAR2
*" TABLES
*" T_LINES STRUCTURE TLINE
*"----------------------------------------------------------------------
DATA: lt_lines TYPE TABLE OF TLINE,
ls_line TYPE string.
" 调用 READ_TEXT 函数
CALL FUNCTION 'READ_TEXT'
EXPORTING
client = CLIENT
id = ID
language = LANGUAGE
name = NAME
object = OBJECT
IMPORTING
header = T_HEADER " 设置为 'X' 表示获取头部信息
TABLES
lines = lt_lines.
Data: char1 TYPE CHAR2.
char1 = '1'.
IF sy-subrc = 0.
" 成功读取文本,将结果赋值给表格参数
LOOP AT lt_lines INTO ls_line.
OUTPUT_A1 = char1 + '1'.
APPEND ls_line TO T_LINES.
ENDLOOP.
ELSE.
" 处理错误
WRITE: / 'Error occurred while reading text:', sy-msgid, sy-msgno.
ENDIF.
ENDFUNCTION.
- 进行测试


对应ESB调用SAP的请求参数的值
<?xml version="1.0" encoding="UTF-8"?>
<Z_TEST_READ_TXT:Request xmlns:Z_TEST_READ_TXT="http://sap.fusesource.org/rfc/ECC/Z_TEST_READ_TXT" CLIENT="001" ID="TEXT" NAME="- GEBRAUCHSABNAHMESCHEIN" LANGUAGE="D" OBJECT="FVVD"/>

-
激活函数
激活函数后,当前函数才可使用

- READ_TEXT 函数
read_text 函数为内置的读取长文本函数。通过自定义开发的Z_TEST_READ_TEXT 函数实现read_text函数的功能
-
查询read_txt 支持的参数
查询透明表 事务:se16n


都是可查询的文档
<CLIENT="001" ID="TEXT" NAME="- GEBRAUCHSABNAHMESCHEIN" LANGUAGE="D" OBJECT="FVVD"/>
client 固定值登录的系统号
ID 标识
NAME 文本名
OBJECT 文本对象
LANGUAGE 语言

创建外部SAP系统连接
- 登录TUS管理控制台
- 展开"数据连接",然后点击新建

- 展开"企业管理系统",然后点击 ”SAP“

- 填写连接属性配置:
- 连接名称、版本号
- sap客户端
- sap用户名、密码
- 系统编号、网关主机和AS主机等信息

- 测试连接并保存

SAP系统连接参数配置说明
基础连接配置
| 参数名称 | 类型 | 必填 | 说明 | 默认值 |
|---|---|---|---|---|
| SAP客户端 | 字符串 | 是 | 连接SAP系统的SAP客户端ID | - |
| AS系统编号 | 字符串 | 是 | SAP ABAP应用服务器的系统号 | - |
| AS主机 | 字符串 | 是 | SAP ABAP应用程序服务器地址 | - |
| 目标名称 | 字符串 | 否 | SAP 作为入站端点的时候需要填写,预定义的配置名称 | - |
| SAP路由 | 字符串 | 否 | SAP路由器连接字符串,格式:/H/<host>[/S/<port>]+ | - |
| progid | 字符串 | 否 | SAP 作为入站端点的时候需要填写,标识注册程序的id |
登录认证配置
| 参数名称 | 类型 | 必填 | 说明 | 敏感信息 |
|---|---|---|---|---|
| SAP用户名 | 字符串 | 是 | 用于登录SAP系统的用户名 | 否 |
| SAP密码 | 字符串 | 是 | 对应用户的登录密码 | 是 |
| SAP用户别名 | 字符串 | 否 | 可替代登录用户的别名账号 | 否 |
| 语言 | 字符串 | 否 | 登录语言设置 | 否 |
| x509证书 | 字符串 | 否 | 用于证书认证的X509证书 | 否 |
高级连接选项
| 参数名称 | 类型 | 说明 | 默认值 | 取值范围 |
|---|---|---|---|---|
| 峰值限制 | 数字 | 最大活动连接数 | 0(无限制) | ≥0 |
| 池容量 | 数字 | 最大空闲连接数 | 1 | ≥0 |
| 过期时间 | 毫秒 | 空闲连接超时时间 | - | - |
| 最大获取时间 | 毫秒 | 等待连接的最长时间 | - | - |
安全配置
| 参数名称 | 类型 | 说明 | 可选值 |
|---|---|---|---|
| SNC模式 | 枚举 | 安全网络通信开关 | 0(关闭),1(开启) |
| SNC安全级别 | 数字 | 加密强度等级 | 1-9 |
| SNC库 | 字符串 | SNC加密库路径 | - |
系统监控
| 参数名称 | 类型 | 说明 | 可选值 |
|---|---|---|---|
| RFC Trace | 枚举 | RFC调用跟踪开关 | 0(关闭),1(开启) |
| CPIC Trace | 数字 | CPIC跟踪级别 | 0-3 |
配置说明:
- 连接池参数应根据实际业务量调整
- 生产环境建议启用SNC加密(SNC模式=1)
- 必填参数在连接配置时必须提供
常见问题: Q: 直连和负载均衡配置有什么区别? A: 直连需要填写"AS主机"和"AS系统编号";负载均衡需要配置"MS主机"和系统ID
Q: 连接数设置多少合适? A: 建议初始值:峰值限制=20,池容量=5,根据实际负载调整
创建集成SAP系统流程(restApi 获取SAP系统数据)
- 登录TUS管理控制台
- 展开"集成编排",选择"新建"然后点击新建

-
编排流程
-
填写必要的参数
-
选择rfc 动作,参考【作为出站端点支持的操作】
-
填写 函数名称 Z_TEST_READ_TXT (需要sap系统有当前名称的函数)
-
填写随机的目标名称(一般和rfc名称一致就行)
-

- 调用测试
-
在流程中选择 sap 流程,点击‘部署’按钮进行部署操作
-
使用工具进行调用获取sap数据
参考【请求和响应格式说明】部分
RFCName 是指调用的rfc函数名称。属性部分是当前函数的参数

创建集成SAP系统流程(监听接收SAP系统数据)
ESB会在SAP系统的指定函数中注册一个监听。SAP向该函数发送数据的时候就会进入到ESB的流程中
- 配置函数的名称(RFC名称,需要sap系统有当前函数)
- 配置服务名称(一般和RFC名称一致)

作为入站端点支持的动作
sap-idoclist-server
在SAP 系统需要将中间文档列表传递到 路由的情况下,应使用此端点。
sap-srfc-server(用的比较多)
在需要路由来同步处理来自 SAP 系统的请求和对 SAP 系统的响应的情况下,应使用此组件及其端点。
sap-trfc-server
在 SAP 系统最多需要一次将其请求传递到路由的情况下,应使用此端点。为此,发送 SAP 系统会生成一个事务 ID,tid它伴随它发送到组件端点的每个请求。发送 SAP 系统tid在发送一系列与tid. tid组件会检查它维护的received列表,tid如果不在该列表中,则记录发送,然后响应发送SAP系统,指示是否发送tid已经被记录下来了。tid如果之前没有记录,则发送 SAP 系统将仅发送一系列请求。这使发送 SAP 系统能够可靠地将一系列请求一次发送到路由。
作为出站端点支持的动作
sap-srfc-destination(用的比较多)
SAP 同步远程函数调用目标组件。在 路由需要向 SAP 系统同步传递请求和响应来自 SAP 系统的情况下,应使用此端点。
sap-trfc-destination
在请求必须最多传送到接收 SAP 系统一次的情况下,应使用此端点。为了实现这一点,该组件生成一个事务 ID,tid它伴随着通过路由交换中的组件发送的每个请求。接收 SAP 系统tid在发送请求之前记录随附的请求;如果 SAP 系统再次收到相同tid的请求,它将不会发送该请求。因此,如果路由在通过该组件的端点发送请求时遇到通信错误,它可以在同一个交换中重试发送请求,因为它知道它只会被传递和执行一次。
sap-qrfc-destination
通过添加顺序交付保证到通过其端点的请求交付。在一系列请求相互依赖且必须最多一次且按顺序传送到接收 SAP 系统的情况下,应使用此端点。组件最多完成一次交付保证使用与 JBoss Fuse SAP Transactional Remote Function Call Destination Camel 组件相同的机制。排序保证是通过按照 SAP 系统接收请求的顺序将请求序列化到入站队列来实现的。入站队列由SAP 中的QIN 调度程序处理。当入站队列被激活时,QIN 调度器将按顺序执行队列请求。
sap-idoc-destination
在需要使用路由将中间文档 (IDoc) 列表发送到 SAP 系统的情况下,应使用此端点。
sap-idoclist-destination
在需要使用路由将中间文档 (IDoc) 列表发送到 SAP 系统的情况下,应使用此端点。
sap-qidoc-destination
在需要 将中间文档 (IDoc) 列表按顺序发送到 SAP 系统的情况下,应使用此组件及其端点。
sap-qidoclist-destination
在需要路由将中间文档 (IDoc) 列表按顺序发送到 SAP 系统的情况下,应使用此组件及其端点。
请求和响应格式说明
SAP 请求和响应对象支持 XML 序列化格式,使这些对象能够序列化到 XML 文档或从 XML 文档序列化。
XML 命名空间
存储库中的每个 RFC 为组成其请求和响应对象的序列化形式的元素定义了一个特定的 XML 名称空间。这个命名空间 URL 的形式如下:
http://sap.fusesource.org/rfc/<Repository Name>/<RFC Name>
RFC 命名空间 URL 有一个公共http://sap.fusesource.org/rfc前缀,后跟定义 RFC 元数据的存储库的名称。URL 中的最后一个组成部分是 RFC 本身的名称。
请求和响应 XML 文档
SAP 请求对象将被序列化为一个 XML 文档,该文档的根元素名为 Request,并由请求的 RFC 的命名空间限定范围。
<?xml version="1.0" encoding="ASCII"?>
<BOOK_FLIGHT:Request
xmlns:BOOK_FLIGHT="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT">
...
</BOOK_FLIGHT:Request>
SAP 响应对象将被序列化为一个 XML 文档,该文档的根元素名为 Response 并由响应的 RFC 的命名空间限定范围。
<?xml version="1.0" encoding="ASCII"?>
<BOOK_FLIGHT:Response
xmlns:BOOK_FLIGHT="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT">
...
</BOOK_FLIGHT:Response
Structure 字段
参数列表或嵌套结构中的结构字段被序列化为元素。序列化结构的元素名称对应于它所在的封闭参数列表、结构或表行条目中结构的字段名称。
<BOOK_FLIGHT:FLTINFO
xmlns:BOOK_FLIGHT="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT">
...
</BOOK_FLIGHT:FLTINFO>
请注意,RFC 命名空间中结构元素的类型名称将对应于定义结构的记录元数据对象的名称,如下例所示:
<xs:schema
targetNamespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT">
xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
<xs:complexType name="FLTINFO_STRUCTURE”>
...
</xs:complexType>
...
</xs:schema>
Table字段
参数列表或嵌套结构中的表字段被序列化为元素。序列化结构的元素名称将对应于它所在的封闭参数列表、结构或表行条目中的表的字段名称。表格元素将包含一系列行元素来保存表格行条目的序列化值。
<BOOK_FLIGHT:CONNINFO
xmlns:BOOK_FLIGHT="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT">
<row ... > ... </row>
...
<row ... > ... </row>
</BOOK_FLIGHT:CONNINFO>
请注意,RFC 命名空间中表元素的类型名称将对应于记录元数据对象的名称,该记录元数据对象定义表的行结构,后缀为_TABLE. RFC 名称中表行元素的类型名称对应于定义表行结构的记录元数据对象的名称,如下例所示:
<xs:schema
targetNamespace="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT">
xmlns:xs="http://www.w3.org/2001/XMLSchema">
...
<xs:complextType name="CONNECTION_INFO_STRUCTURE_TABLE”>
<xs:sequence>
<xs:element
name="row”
minOccures="0”
maxOccurs="unbounded”
type="CONNECTION_INFO_STRUCTURE”/>
...
<xs:sequence>
</xs:sequence>
</xs:complexType>
<xs:complextType name="CONNECTION_INFO_STRUCTURE”>
...
</xs:complexType>
...
</xs:schema>
基本领域
参数列表或嵌套结构中的基本字段被序列化为封闭参数列表或结构的元素上的属性。序列化字段的属性名称对应于它所在的封闭参数列表、结构或表行条目中的字段的字段名称,如下例所示:
<?xml version="1.0" encoding="ASCII"?>
<BOOK_FLIGHT:Request
xmlns:BOOK_FLIGHT="http://sap.fusesource.org/rfc/nplServer/BOOK_FLIGHT"
CUSTNAME="James Legrand"
PASSFORM="Mr"
PASSNAME="Travelin Joe"
PASSBIRTH="1990-03-17T00:00:00.000-0500"
FLIGHTDATE="2014-03-19T00:00:00.000-0400"
TRAVELAGENCYNUMBER="00000110"
DESTINATION_FROM="SFO"
DESTINATION_TO="FRA"/>
日期和时间格式
日期和时间字段使用以下格式序列化为属性值:
yyyy-MM-dd'T'HH:mm:ss.SSSZ
日期字段将仅设置年、月、日和时区组件进行序列化:
DEPDATE="2014-03-19T00:00:00.000-0400"
时间字段将仅使用小时、分钟、秒、毫秒和时区组件进行序列化:
DEPTIME="1970-01-01T16:00:00.000-0500"