IDoc、RFC、BAPI — ERP 那边的人说的话
一句话总结
SAP 集成首先需要的不是 ABAP 知识,而是一张术语地图——理解 IDoc、RFC、BAPI、tRFC、qRFC 各自提供什么保证,才能在会议中做出决定。
为什么这是个问题
遗留系统集成中,我们之所以处于不利位置,不是技术太难,而是听不懂对方在说什么。如果无法当场判断“使用 tRFC 还是 qRFC”,决策就会被推迟,而被推迟的决策通常会按对方最方便的方式确定后再通知我们。
差异最终都会变成我们的工作。若商定的方式不保证顺序,我们就必须在我方拦截同一订单的变更报文乱序到达;若不防重复,就必须自行实现幂等处理。理解术语不是常识修养,而是谈判能力。
接手 SAP 集成时
在韩国大型企业项目中,ERP 通常是 SAP,我们开发的系统需要与它交换数据。会议中常会听到这样的话。
“那个用 IDoc 接收就可以,实时部分通过 RFC 调 BAPI。 至于是 tRFC 还是 qRFC,再协商决定。”
如果听不懂,就无法当场决定任何事情。先整理术语。
| 术语 | 是什么 | 何时使用 |
|---|---|---|
| IDoc | Intermediate Document,SAP 标准文档交换格式(异步) | 大批量、批处理、EDI |
| RFC | Remote Function Call,远程调用 SAP 函数 | 实时查询/处理 |
| BAPI | 通过 RFC 暴露的标准业务函数(Business API) | 标准业务处理 |
| tRFC | transactional RFC,保证只执行一次(防重复) | 数据变更 |
| qRFC | queued RFC,tRFC + 顺序保证 | 顺序重要的变更 |
| ALE | Application Link Enabling,在系统间分发 IDoc 的体系 | IDoc 路由 |
只需记住一组对比:IDoc = 异步文档,RFC/BAPI = 同步函数调用。 tRFC/qRFC 则是 SAP 侧解决“防重复”和“保证顺序”的方式,正对应前一模块讨论的问题。
IDoc 的结构
一个 IDoc 由三部分构成。
Control Record (제어 레코드) ← 딱 1개. "이 문서가 무엇이고 어디서 어디로"
IDOCTYP 기본 타입 (예: ORDERS05)
MESTYP 메시지 타입 (예: ORDERS)
SNDPRN 송신 파트너
RCVPRN 수신 파트너
DOCNUM IDoc 번호
CREDAT 생성일자
Data Records (데이터 레코드) ← 여러 개. 세그먼트 단위
SEGNAM 세그먼트 이름 (E1EDK01, E1EDKA1, E1EDP01 ...)
HLEVEL 계층 레벨 (부모-자식 관계)
SDATA 실제 데이터 — 고정길이 문자열 1000자
Status Records (상태 레코드) ← 처리 이력
STATUS 상태 코드 (03 전송, 51 오류, 53 성공 ...)
核心是 SDATA。 一个段的所有实际值都放在一个1000 字符的定长字符串中。因此,解析 IDoc 就是根据段名找到布局,再按位置切分 SDATA。
这与上一模块的定长格式解析完全相同。IDoc 看似陌生,其实实际操作已经练习过。
常见段
订单(ORDERS)系列中经常见到以下段。
| 段 | 含义 | 代表字段 |
|---|---|---|
E1EDK01 |
头部(整份文档) | BELNR(文档编号)、CURCY(货币) |
E1EDKA1 |
合作方信息 | PARVW(合作方角色)、PARTN、NAME1 |
E1EDK02 |
参考文档 | QUALF、BELNR |
E1EDP01 |
项目 | POSEX(项目编号)、MENGE(数量)、MENEE(单位) |
E1EDP19 |
项目引用(物料代码) | QUALF、IDTNR(物料编号) |
HLEVEL 表示层级,因此在 E1EDP01 下方会挂接 E1EDP19。转换为 JSON 时必须保留这种层级。
IDoc 状态码
运维时掌握常见状态即可。
| 代码 | 含义 |
|---|---|
03 |
已发送至外部系统(出站) |
12 |
发送完成 |
51 |
未生成应用文档(错误),最常见 |
53 |
成功生成应用文档 |
64 |
等待处理 |
68 |
取消处理(忽略错误) |
“IDoc 掉到 51”表示数据已经到达,但 SAP 内部业务处理失败,并非传输失败。不能区分这一点,双方就会一直争论“我们已经发了”和“我们没有收到”。
实际设计时要确定什么
SAP 集成设计会议中,需要真正决定以下事项。
- 方向与方式——我们发送还是接收,使用 IDoc 还是 RFC
- 中间经过什么——直连、经过 EAI 中心,还是经过 PI/PO
- 键映射——连接 SAP 客户编号(
KUNNR)与我方客户 ID 的表。这张映射表是集成的心脏。 没有它,任何工作都无法进行 - 错误处理——出现 51 时由谁查看、谁修复,必须与 SAP 负责人协商
- 重发——再次发送相同 IDoc 时,是生成重复文档,还是忽略
第 3 项尤其重要。不同系统用不同 ID 指代同一个对象:SAP 的 KUNNR=10001、销售系统的 ACC-00001、我方系统的 CUST-001。只有建立连接三者的交叉引用(cross-reference)表,集成才能成立。如果各方都通过硬编码解决,六个月后就会无人敢改。
遗留系统集成的一般原则
即使不是 SAP,遗留系统集成也有共同原则。
- 不要试图修改遗留系统。 如果能改,早就改了;转换应由我方完成
- 不要把遗留系统 schema 原样带入我方领域模型。 在边界处转换(anti-corruption layer),内部使用自己的语言
- 把所有假设变成验证。 “这个字段一定有值”通常只表示“迄今为止一直有值”
- 保存原始报文。 只保存解析结果,日后就无法重新解释