十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

一文搞懂SAP协议:RFC/BAPI/IDoc/OData/SLT的选型与实战

一文搞懂SAP协议:RFC/BAPI/IDoc/OData/SLT的选型与实战 如果一个项目叫“关于SAP协议的理解与应用”很多人第一反应是去查“SAP协议”这个词条结果越查越懵因为SAP官网上根本没有一个叫“SAP协议”的协议。搜索热词里混着一堆诸如spi、iic、modbus、mqtt、mipi、rtmp之类的东西更是把方向带跑偏了。我做了这么多年SAP集成和接口可以负责任地说所谓“SAP协议”本质上是SAP系统与外部系统、以及SAP内部模块之间互相通信的一套接口约定。它不是单一协议而是RFC、BAPI、IDoc、ALE、OData、CDS、SLT等一整套机制的组合。不同年代、不同业务场景选择的“协议”完全不同。搞懂这套东西才能真正看懂SAP里的数据是怎么流出去的又是怎么被其他系统拉走或推回来的。这篇文章我不会给你讲教科书式的定义而是按我实际做项目的思路把SAP协议拆成几类主流技术路线配合物料同步、发票校验、HANA实时同步这些高频场景讲清楚每个协议能干什么、为什么选它、配置路径是什么、踩过的坑在哪里。无论你是刚开始做SAP Basis、ABAP开发还是做外围系统集成的工程师这篇文章都能帮你建立一张清晰的SAP集成地图。1. 先统一认知SAP协议不是网络传输协议1.1 不要被协议两个字带偏看到“协议”这个词搞过嵌入式或物联网的人会自然想到TCP、UDP、MQTT、Modbus这类东西。但在SAP语境里“协议”更多是一种业务接口层面的约定。它借用了底层网络传输但决定其工作方式的是SAP应用服务器上那套消息结构和调用规则。举个最经典的例子RFCRemote Function Call。RFC在底层可能走TCP/IP也可能走SNA等老旧网络但真正让两个系统能协同工作的是调用方和被调用方都认同一套“远程函数”接口定义函数名、导入参数、导出参数、表参数、异常消息。这套约定才是SAP语境下的“协议”。所以我在做项目时给客户讲“SAP协议”第一件事就是把这个认知拉齐你说的是同步接口、异步接口还是数据复制是应用层还是数据库层这个前提不建立后面全是在对暗号。1.2 一个容易被热搜词带偏的坑如果只看热搜词你会发现大量和SAP八竿子打不着的词spi协议、iic协议、can协议、mqtt协议、rtmp协议、robots协议等等。这些词出现在SAP搜索旁边往往是因为搜索系统把“协议”当成了公共关键词或者提问者本身在跨领域搜索时碰到了一起。这对刚入门的人是个很大的干扰。我见过有学员抱着“SAP是不是支持Modbus”的疑问来问我以为SAP能用Modbus去采集PLC设备数据。严格讲如果走工业物联网边缘方案确实可以通过第三方中间件把Modbus数据送进SAP但这不是SAP原生协议SAP侧看到的高级接口多半是OData或RFC。这类词属于另一条技术线混在一起只会让人绕远路。2. 三大经典主力RFC、BAPI、IDoc2.1 RFC是所有远程调用的地基RFC是SAP提供给ABAP程序、外部系统调用SAP功能模块的机制。一个功能模块只要在属性里勾选“远程启用”Remote-Enabled Module它就能被别的系统通过RFC协议来调用。调用方可以是另一个SAP系统、Java/.NET程序也可以是一个后台作业调度工具。RFC有三种基本形态我通常用下面这张表跟客户讲类型工作机制适用场景同步RFCsRFC调用方发出请求后一直等待直到收到结果或异常才继续查询类接口、数据量小的写操作事务性RFCtRFC调用方提交后不等结果SAP保证请求至少被处理一次异步业务能容忍延迟队列化RFCqRFC在tRFC基础上按队列顺序处理保证消息顺序订单、主数据等对顺序敏感的场景同步RFC最像打电话你问一句对方必须答一句不答就断线重打。适合获取供应商主数据、物料清单这类即查即得的需求。tRFC更像发快递你把包裹放进系统系统承诺会送到但不保证对方立刻签收。qRFC在发快递的基础上加了排号规则比如同一个物料主数据的创建和变更必须按先创建后修改的顺序到达否则外围系统会报数据不存在。这里有一个关键细节SAP内部大量接口跑的是qRFC因为业务上经常要求“顺序必须绝对一致”。比如你在SAP里先创建了一个订单紧接着又修改了它如果两条消息乱序到达外围系统对方先处理修改就会因查不到订单而报错。这也是我在SAP集成项目中第一个要检查的点你的异步接口有没有排序要求如果没有消息顺序乱了是最难排查的隐性问题。2.2 BAPI把业务装进标准APIBAPIBusiness Application Programming Interface是SAP把标准业务功能封装成可远程调用的RFC接口比如创建采购订单、过账物料凭证、创建销售订单等。BAPI的特点是颗粒度偏业务化一个BAPI往往对应一个完整的业务操作而不是单条数据库更新。网上经常搜到的“sap miro bapi”指的就是发票校验功能。MIRO是SAP的事务代码负责发票录入和校验而BAPI_INCOMINGINVOICE_CREATE则是把这张发票的业务逻辑封装成外部可调用的接口函数。我们做外围系统集成时经常用这个BAPI代替人工在MIRO里录入把上万家供应商的发票自动接收到SAP。另一个高频词“sap kd285”则不是协议它是和客户主数据相关的错误消息或状态往往出现在IDoc同步或BAPI调用失败后。这类错误码经常把新手绕晕因为你会盯着一个莫名其妙的字母数字组合反复看但真正的原因往往在消息类型配置或主数据字段映射上。后面我会在场景里展开BD87和WE05这类监控工具怎么用。2.3 IDocSAP的异步消息文档IDocIntermediate Document是SAP异步接口的核心载体。它不传递结构化函数参数而是把业务数据包装成一段一段的“文档”由发送方系统推给接收方系统接收方再做解析落库。要理解IDoc你可以把它当成一个标准快递单快递单外层写着收件人、发件人、物流单号控制记录撕开以后里面是真正的商品清单数据记录每件商品上还贴着一张张属性标签段类型。IDoc结构往往是树状的一个主段下面挂多个子段子段可以重复。SAP里配置IDoc最常碰到的几个事务代码WE31定义段类型WE30定义IDoc基础类型WE81维护消息类型WE82把消息类型关联到基础类型WE20配置合作伙伴参数WE21定义RFC端口WE05监控IDoc状态BD87处理错误IDoc标准主数据同步最常用的消息类型是MATMAS物料主数据和DEBMAS客户主数据。如果外围系统需要接收物料创建或修改标准思路就是SAP发送MATMAS类型的IDoc过去。搜热词“sap idoc 如何设置物料创建或修改时同步外围系统”时大概率就是想做这个场景。从设计上看SAP官方在物料、客户、供应商这类主数据上标准做法基本是“源系统发IDoc目标系统收IDoc并映射”很少让你自己去写一堆自定义表来同步。原因很简单标准IDoc承载了字段层面的大量历史演进很多外围系统需要的字段比如EAN码、工厂视图、税收分类MATMAS里早就预留了段位置你只需要激活和映射就好。硬要自己造一套接口后续升级会非常痛苦。3. 现代化路线OData、CDS View与Fiori3.1 为什么SAP把协议重心转向OData这几年做SAP接口大家越来越多地在聊OData。OData本质是RESTful API的一种具体实现通过HTTP/HTTPS传输URL即资源JSON或XML即数据格式。SAP之所以大力推OData是因为新一代前端Fiori、SAP Analytics Cloud、非SAP移动应用都喜欢用轻量级HTTP接口。相比SAP网络图形接口OData有几个让传统RFC吃力的优点一是天然适配互联网不需要安装SAP GUI也不需要配置到SAP内网的通路二是接口自描述系统会把元数据通过$metadata暴露出来前端框架可以自动生成操作界面三是生态成熟几乎所有编程语言都有HTTP库容易对接。但代价也很明显OData是无状态接口SAP系统把每一次请求都当成独立的HTTP请求这意味着事务控制、回滚、分步操作都要靠我们自己拼装和预校验。比如一个复杂业务对象前端可能先POST创建主表再POST子表如果中途网络断了主表已经生成子表没写进去就会产生脏数据。3.2 CDS View在协议链路中扮演的角色CDS View不是协议但它已成为SAP对外提供协议服务最常见的数据源。开发者在ABAP环境里用CDS View定义了一套逻辑数据模型再把它暴露成OData服务。真正消费服务时SAP Gateway负责把HTTP请求翻译成对CDS View或后台函数的调用。热词“sap hana 图形化建模”也和这条路密切相关在HANA Studio或Web IDE里做图形化建模最终目的往往就是把模型发布成可以被外部系统使用的服务。通俗点说CDS View像是你摆好的商品货架OData服务则是货架前面的扫码窗口顾客不需要进仓库翻找只需要按扫码格式说出自己想要的商品名窗口就把货递出来了。实际排查问题的时候Fiori或前端报了HTTP 500或HTTP 404不要只盯着前端网络请求看先看后台CDS View能不能正常取数。可以用事务代码SE38里自带的数据预览功能或者直接通过SAP Gateway的测试工具调一次服务。这一步能隔离大部分问题如果CDS View本身没数据那就不是OData协议的问题而是数据建模或权限的问题。3.3 Fiori调试里最常见的协议问题不少人搜过“sap fiori 怎么debug”。这里我给一个实战判断路径浏览器F12里看Network标签先确认请求是否到达了SAP Gateway如果请求到不了后端最常见的是CSRF Token没刷新导致POST/PATCH被网关拒掉如果请求到了但返回403或401优先查OData服务的角色权限尤其注意SAP网关上的PFCG角色是否分配了对应的服务权限如果返回200但页面数据不对才需要进入ABAP侧去调试后台请求。OData服务真正驱动后台的可能是一个方法级实现类也可能是一个事务代码。搜“sap cds view”时很多人会忽略一个关键点同一份CDS View暴露成OData前还要在Gateway里维护一个服务模型不是建完View就自动生成接口。4. 实操场景一物料主数据创建与修改如何同步外围系统4.1 标准方案与协议选型这个场景在热搜里出现得很明确“sap idoc 如何设置物料创建或修改时同步外围系统”。做SAP集成的人都知道如果外围系统只读最好的方案是基于IDoc的异步推送如果外围系统还要回传结果给SAP就需要在IDoc流程中加入确认IDoc或走RFC同步查询。物料主数据同步我一般建议走IDoc原因是物料创建和修改不是高频低延迟操作几分钟内的延迟完全可接受。更重要的是标准MATMAS IDoc具备很强的扩展性你可以在不改变外围系统接收逻辑的情况下通过增强向IDoc里追加客户自定义段。这一点对集团型企业尤其友好因为全球各子公司都可能要往这个物料接口里塞专属字段。如果业务要求极低延迟比如物料一保存外部系统马上要拿到结果并继续走下一步流程这时IDoc异步就可能不够用。实测大多数场景不需要这么极端但如果你真的遇到这种场景就要考虑BAPI_MATERIAL_SAVEREPLICA这把同步接口。它可以根据物料号在同一个事务里同步创建或修改物料主数据。下面是两套方案的简单对照对比维度IDoc异步MATMASBAPI同步BAPI_MATERIAL_SAVEREPLICA实时性秒级与后台轮询相关实时调用后立即返回业务耦合低发送方不需要等结果高调用方必须处理错误批量能力强一次可打包多物料一般通常循环调用扩展方式增强IDoc段增加结构字段或自定义BAPI包装典型场景主数据分发到数据中台业务系统实时创建物料4.2 关键配置链路端口、伙伴档案和输出控制要在实际系统里落地IDoc推送需要按顺序把下面几个节点打通第一步配置逻辑系统。事务代码SALE或BD54维护逻辑系统名称每台参与分发的SAP系统都要有唯一逻辑系统名。这相当于给每个系统发身份证。第二步建立RFC连接。事务代码SM59创建到对方系统的RFC目的地类型选“3”ABAP系统或“2”通过TCP/IP的Java/.NET系统。第三步维护端口。事务代码WE21创建tRFC类型的端口端口只关联到SM59里创建的RFC目的地。第四步维护合作伙伴档案。事务代码WE20里维护接收方逻辑系统指定出站消息类型比如MATMAS端口选上一步创建的端口再设置处理模式为“传输IDoc”。第五步输出主数据发送条件。物料主数据通过事务代码NACE或自定义增强触发IDoc。SAP标准做法里会设定物料的发送应用程序“MASS”和过程“MASSD”并判断物料创建或修改后是否符合发送条件。细节上物料创建和修改同步最常见的是在保存后直接调用消息控制函数也可以用程序BD10做初始物料主数据批量发送。BD10是物料主数据初始发送事务用于把存量物料一次性推到外围系统增量部分则靠日常事务里的增强或消息控制触发。我在实际项目里强烈建议优先用标准消息控制因为这样物料的创建、修改、删除动作不需要单独写大量的自定义保存后逻辑。自定义增强方案的问题是一旦物料类型多了、工厂多了、字段多的场景复杂化增强代码会膨胀到可怕的程度后续升级SAP时每次都要回归一遍。4.3 一个和外部编号有关的报错排查热词里有这么一条“sap bp创建 外部给号 时 报错 r11 123”。先提醒一下R11 123并不是我在标准Notes里见到的统一错误更像是某个日志或消息文件里的编号片段。如果你遇到了基本思路是往编号范围对象和主数据集成(CVI)方向排查。BPBusiness Partner创建时如果选择“外部给号”意味着SAP不分配内部号而是由调用方传入BP编号。这种情况下最常见的错误就是编号范围没有维护“外部号码分配”属性。SAP系统里所有主角数据都对应一个编号范围对象如果你只维护了内部编号区间或者区间里没开外部标记那么外部系统传进来的编号就会被拒收。第二个常见问题是重复编号。外部系统传进来的号码如果已经在系统里存在SAP会报“编号已存在”类异常。这时候不是像内部编号那样可以自动跳到下一个可用号而是必须由调用方换一个新号重试。第三个问题更隐蔽你以为你传的是供应商编号但SAP内部还把它关联成客户、联系人。BP主数据会涉及多套伙伴角色不同角色可能共用或分离编号范围。出现莫名其妙的编号错误时可以先查SPRO里“跨应用组件-SAP业务伙伴-基础设置-编号范围”这段配置把所有相关编号对象的内部/外部标记都检查一遍。5. 实操场景二BP主数据、发票校验与BAPI调用5.1 BP创建外部分配号的正确打法在SAP最新主数据体系里客户和供应商都统一到了BPBusiness Partner模型。外部系统创建BP时SAP沿用CVICustomer-Vendor Integration把BP信息同步到客户主数据或供应商主数据。外部给号类型的BP我建议按照下面的顺序调BAPIBAPI_BUSINESS_PARTNER_CREATE_FROM_DATA这是创建BP核心数据的老牌BAPICALL METHOD BAPI_TRANSACTION_COMMIT提交提交前可以先调用BAPI_TRANSACTION_ROLLBACK做回滚测试。网上很多报错不是因为BAPI参数传错而是漏了CVI相关的函数调用。SAP针对BP的客户集成提供了一组BAPI比如BUPA_CENTRAL_CREATE等但实际项目里常常需要在创建BP后再调用创建客户主数据的BAPI同时保证两者在同一个LUW逻辑工作单元里提交。拿笔在纸上记一下如果是外部系统走接口最规范的方式是一个RFC wrapped function同时包住BP创建和客户创建而不是把它们切在两个独立事务里。5.2 MIRO与BAPI_INCOMINGINVOICE_CREATE的配合发票校验这个话题几乎是SAP外围系统集成的必考点。MIRO是用户手输界面的前端BAPI_INCOMINGINVOICE_CREATE则是对应的后端接口函数。要做自动发票校验你需要把抬头信息、行项目信息、科目分配信息都结构化地传进这个BAPI。比较常见的参数是INVOICEDOCHEADER和INVOICEDOCITEM它们都是传入结构或表。实现时通常还需要传入发票日期和过账日期。过账日期决定财务期间如果期间未开或已关闭BAPI会直接报错。供应商发票号一般挂在INVOICEDOCHEADER里相应字段。采购订单号、行项目号和数量这些用于做匹配校验。BAPI无法自动完成所有业务判断比如采购订单数量差异容差、金额差异容差这些仍由SAP后台的容差配置控制。所以用BAPI跑完一笔发票最好再调用BAPI_INCOMINGINVOICE_GETDETAIL做一次结果核验确认发票号已经生成而不是仅凭BAPI返回的消息就认为成功。实操里最让我头疼的是测试环境没有打开容差检查开发时发票随便录一上生产就开始成批报错。后来我学乖了每次做接口前先让业务方把生产环境的容差配置导出再在测试环境对照配置一遍避免开发和运维两套状态。5.3 试运行与回滚的实战意义BAPI里很多操作支持“试运行”参数比如BAPI_INCOMINGINVOICE_CREATE里常有TESTRUN标记。我强烈建议外围系统对接时把“试运行模式”做成接口的一个开关字段。外表看起来只是多了个标志但它能让你在联调时反复测试不会在系统里产生垃圾票据。试运行只能帮你验证参数和业务校验能否通过不保证正式运行时一定成功。因为正式运行多了并发冲突和编号占用等问题所以联调流程应该是先试运行测试数据通过后再走正式运行如果正式运行失败立刻查BAPIRETURN表里的消息类型和消息号。等代码稳定后试运行模式仍然可以在预生产发布时用来做全量回归。6. 实操场景三HANA SLT配置与数据库层同步6.1 SLT到底是不是协议“sap hana slt配置”是热门搜索词。SLT的全称是SAP Landscape Transformation Replication Server它负责把源系统数据近实时复制到SAP HANA数据库。很多初学者把SLT理解成协议其实不太精确。SLT算是一种数据复制解决方案它底层用到了RFC连接和数据库触发器技术。从架构上看SLT会在目标HANA环境里安装一个复制服务器通过之前配置的RFC连接远程读取源系统表结构。它在源系统每个需要复制的表上建立数据库级触发器当源表发生INSERT、UPDATE、DELETE时触发器就把变更记录写入SLT的日志表再由SLT的轮询机制把日志批量加载到HANA目标表。SLT最适合两个场景一是SAP ERP或非SAP数据库到HANA的实时数据同步用于HANA分析二是将SAP的表复制到HANA后在HANA里做复杂的列式计算避免影响源系统OLTP性能。要注意SLT适合表级数据同步不适合需要复杂过滤或跨表关联后同步的场景。后者更适合做CDS View或ODP操作数据供给方式。6.2 SLT配置和监控的关键点配置SLT时最容易忽略的是权限和数据类型映射。你要在RFC目标上给SLT用户足够的授权让它可以读取源系统的字典定义并在源数据库里创建触发器。如果你连的源系统是SAP ERP它需要能调用SAP标准远程函数来读元数据如果源系统是非SAP数据库SLT的权限配置方式又有区别。数据进入HANA后最常见的问题是字段长度超限源表字段比HANA目标表字段长触发器日志表写入时不会报但加载到目标表时会出错。我现在做SLT第一件事是检查源表和HANA目标表的数据类型映射关系特别是DECIMAL精度、日期格式、字符串长度。这类问题在联调阶段极难发现因为开发数据量小到了全量数据迁移时一下就爆了。SLT监控可以用事务代码LTR在SAP HANA SLT复制服务器上执行或SLT管理界面里的复制监控面板。你主要看三件事全量加载日志表是否清零、增量加载延迟时长、异常表的数据不一致数。如果发现某张表一直停在保留状态多半是数据处理任务出错或表结构不兼容先把该表对应的复制单元停掉修正后再重启。6.3 SLT和IDoc的取舍很多时候客户问我要实时同步数据我就问他你的“实时”指的是秒级还是分钟级如果你接受几秒或几十秒的延迟且要求的是表结构数据SLT就合适。如果你要处理的是SAP业务对象级别的数据比如采购订单抬头、行项目、文本、合作伙伴信息都要组装好再送出去SLT就不合适因为它只搬运表不做业务逻辑。基于这点选择方案时不要先吹某个平台很牛而要先看数据消费方想要什么形态。消费方是数据仓库里的SQL查询优先SLT或ODP消费方是一个API服务优先OData或RFC/BAPI消费方需要对象快照和事件通知才能真正派出IDoc。7. 从报表需求到GUI脚本外围接入的另类协议思路7.1 Excel直接连SAP的几种方法搜索热词里有“excel能否连接sap”。这个问题在业务部门里极常见。Excel连接SAP大体有几种路直接访问数据库视图比如通过ODBC连接HANA或底层数据库。但直接连数据库往往意味着避开SAP应用层的权限校验和业务逻辑存在安全风险只建议只读分析场景。使用SAP提供的Excel Add-In。传统SAP GUI内置Excel集成可以调用RFC函数也可以用分析办公室等工具查看报表。通过OData服务。Excel 2016以上版本可以用Power Query连接OData URL经过SAP Gateway认证后拉取列表数据。这种方式对SAP系统最友好权限可控也不需要安装重型插件。如果只是写个简单查询我推荐Power Query配置OData路径。这里有个细节SAP OData服务的URL通常包含服务集合名比如sap/opu/odata/sap/API_BUSINESS_PARTNER/BP你在Power Query里输入基础路径后系统会自动让你选要获取哪个实体集。7.2 SAP GUI脚本到底算不算接口“sap中脚本运行”和“excel能否连接sap”这类关键词指向的其实是SAP GUI Scripting而不是真正的后台接口程序。GUI Scripting是通过VBScript或VBA去模拟用户在SAP GUI上的操作比如打开T-Code、填字段、按回车、读回数据。我把GUI Scripting定位成“有风险的低精度自动化”不适合做关键业务接口。原因很简单它依赖前端界面的控件布局一旦某个SAP GUI版本升级按钮名称和位置变了脚本就全废。它不能很好地处理弹窗和报错弹窗一出现脚本经常进入僵尸状态。它的运行状态没有经过SAP事务控制你在Excel宏里做到一半发现数据错误很难完整回滚。如果公司内部临时做一个Excel批量导入小工具用GUI Scripting来操作事务代码可能是最快方案。但如果你面向的是生产系统且使用频率高那就别偷懒老老实实走RFC/BAPI或OData。哪怕前期开发成本高一点后期维护成本会低很多。7.3 用“请求”的思路看接口热词里“sap请求”有时大家指的是传输请求有时又指接口调用里的请求报文。传输请求用来管理ABAP开发对象传输和接口协议没有直接关系。而接口请求报文是每次调用时的入参结构比如IDoc里的控制记录字段或OData的JSON数据。我建议所有刚接触SAP集成的朋友一定要分清这三层概念请求与响应的业务内容、承载内容的协议机制RFC/IDoc/OData、以及底层的传输通道。三层中任何一层出差错都会让你看到一个完全看不懂的报错。排错时要先确定自己卡在哪一层不要拿着一个应用层错误去查网络协议也不要拿着网络超时错误去改BAPI参数。8. 协议选型速查表与故障排查经验8.1 一张表搞定协议选型我汇总了一份选型表不完全覆盖所有场景但足够应对80%的项目初判业务需求推荐协议理由外围系统实时查询SAP主数据RFC/BAPI或OData同步返回业务侧容易处理主数据创建/修改事件推送IDocMATMAS/DEBMAS异步、标准、可扩展SAP业务对象批量写入BAPI通过RFC有标准业务校验和事务控制前端Fiori/移动端页面读写ODataRESTful适合浏览器和移动网络实时表数据复制到HANASLT触发方式近实时批量报表分析CDS View OData列级别建模便于消费快速一次性Excel导入RFC函数或GUI Scripting实现简单但注意维护成本数据仓库持续集成ODP/CDS或SLT适合大数据量持续抽取选型时最忌讳只问“哪个最好”。你得再多问一句集成对象是什么、实时性要求多少、开发团队熟悉哪套技术、运维团队能否处理运行监控。没有万能的协议只有不合适的场景。8.2 IDoc报错排查五板斧如果你发现IDoc一直报错按下面顺序排查比你在SAP社区里大海捞针快得多第一板斧用事务代码WE05查看IDoc状态。状态代码直接告诉你进程卡在哪。常见的有03数据已传输、51接收方处理失败、64/65/68多个发送/接收端异常。状态53是接收成功也是你期望的最终稳定态。第二板斧用事务代码BD87重新处理错误IDoc。先双击进入IDoc明细看每个错误段的具体消息文本。很多错误是业务数据问题比如物料号不存在、工厂不存在、字段过短。第三板斧检查伙伴参数和端口。WE20里最终接收方逻辑系统是否配置正确端口是否指向正确的SM59目的地消息类型是否“准备好发送”Ready for Transfer。第四板斧检查外围系统是否返回CONFIRMATION IDoc。SAP默认不一定要等外围的确认但如果业务需要闭环IDoc状态会停在“已发送但未确认”这要重新确认外围系统接收链路。第五板斧启用跟踪。通过在WE19输入IDoc号后选择“跟踪”相关选项可以看到IDoc在SAP内部分发到目标系统的完整日志。这是我最常用的定位手段能区分问题出在SAP发送端还是外部接收端。8.3 我踩过的一些坑做SAP协议集成这些年我踩过的坑数量不少挑几个比较典型的分享给你。第一外围系统同步物料时没有注意物料类型和行业字段的激活状态。你以为IDoc已经把物料号发过去了但外部接收端在某些视图上没有激活导致外围虽然收到IDoc映射时还是缺字段。这个问题最快检测方法是在外围系统一侧留存原始IDoc段结构比对一下有哪些字段在源系统有值在目标系统最终表里却丢了。第二BAPI调用不查BAPIRETURN的每一行。BAPIRETURN是一个表不是单一消息文本。很多开发只取第一行错误消息而真正的错误细节在最后几行。我形成习惯后凡是调BAPI一是遍历BAPIRETURN所有行并拼出完整错误日志二是在捕捉异常后把整个输入参数和返回消息一起打印到接口日志表里。后续扯皮时这些日志能救我命。第三异步接口没有做幂等控制。tRFC天然保证消息至少投递一次但不保证不重复。外围系统如果直接把IDoc里的数据INSERT进去网络重传或SAP重启后可能出现重复数据。我的做法是在外围系统里维护一个“外部接口主键表”用IDoc号加段号做唯一索引重复到达时执行UPDATE而不是INSERT这样无论消息怎么重发数据不会翻倍。第四HANA SLT配置阶段表名和Schema大小写问题导致映射失败。HANA对表名大小写敏感SLT默认配置有时会把小写表名和源系统里的UNICODE大写表名弄混。遇到这种问题不要急着改触发器优先检查SLT配置里的“Target Schema”和“Mapping Table”大小写设置。第五OData服务上线时忘记刷新SAP Gateway缓存。SAP Gateway的/IWFND/MAINT_SERVICE里新增服务后虽然立刻能测通但前端通过Fiori Launchpad访问时可能会走旧的服务元数据缓存。我记得有一次版本更新后修改了几个字段无论怎么调前端都不刷新最后是清了Gateway缓存和前端Metadata缓存才好。这类问题不算协议本身的问题但非常影响体验上线时一定要把它写进发布清单。我个人现在做接口方案一定会先画清楚一张数据处理流程图数据在哪个系统产生、经什么协议发出去、中间经过哪些队列或日志表、最终落在哪个系统的哪张表。然后从两头往中间推源系统有没有数据目标系统有没有数据中间停在哪一环。这套“两头对中间查”的做法比熟悉任何炫酷技巧都管用。如果你正在做一个SAP接口项目我建议你把这篇文章里的协议地图先存下来遇到具体问题时先用地图确定技术方向再用对应的事务代码去查明细。不需要一次性搞懂所有协议但至少要知道哪类问题可以找哪个工具和事务代码。在实际项目里反复使用几次你就能建立一套自己的SAP集成排查体系。
返回列表