ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从CDS View到SAC实时分析:ABAP开发者全链路配置指南

从CDS View到SAC实时分析:ABAP开发者全链路配置指南 如果你所在的 SAP 项目里有人提过“我们要上 SAP Analytics Cloud做实时分析”而你的反应是一脸茫然——很正常。这题从标题看偏云但真正卡住的往往是 ABAP 这头。SAP Analytics Cloud后面我统一叫 SAC能实时读取后端数据不是靠什么神秘的中间件而是靠一群 CDS View 变成 OData 服务再被云端消费。这条路涉及 ABAP 开发、Gateway 配置、BTP 目的地设置、SAC 建模每一步都埋着坑。这篇指南就是写给 ABAP 开发者的目标是把从本地 ERP 环境到 SAC 的整条实时链路一次讲透。你会看到 CDS 视图怎么设计才符合 SAC 的胃口、OData 服务怎么暴露才不踩版本坑、Connection 配在云端还是配置在本地、Story 里拖图表时性能为什么忽好忽坏。适合刚接触 SAC 的 ABAP 工程师也适合正在做 PoC 的顾问拿来做对照清单。我写到的每个配置项都会说明为什么这么设而不是丢给你一串点击步骤。1. 这条路径要解决什么问题1.1 为什么 ABAP 团队也要关心 SAC传统做法里做报表往往是两条路线要么 ABAP 写一堆报表程序输出 ALV要么用 SAP BW 抽取数据建模再推给 BI 前端。两条路线的共同点是“先把数据搬到某个地方”所以你能听到的各种分析平台都默认了数据复制逻辑。SAC 不一样它天生支持两种数据模型导入模型和实时模型。导入模型把数据源的数据定时复制到 SAC 的云内存里适合低频、海量、非关键性的分析。而实时模型Live Data Model不复制数据查询时直接穿透到源系统。对 ABAP 环境来说源系统就是你的 ECC 或 S/4HANA触发路径是 CDS View → OData 服务 → SAC 查询。这条链路意味着SAC 能不能实时取数关键不在于云端配置多么花哨而在于 ABAP 这侧有没有把“分析语义”完整暴露出去。你写过 CDS View但未必注意过ObjectModel.query.state: #Active这种注解——它基本决定了 SAC 能否找到你的数据源。所以 ABAP 开发者在实时分析这条路上不是旁观者而是卡点。1.2 三条可选的实时路径对比选型我这里说的“实时”严格定义是用户在 SAC 页面打开报表时看到的数据与源系统事务数据一致中间没有批处理、没有复制脚本。实现方式有几种各有适用边界。路径数据流向实时性适用场景主要成本CDS OData Live Data ConnectionABAP → SAC查询直连秒级运营报表、业务人员即席分析、明细透视需要 CDS 开发还需要配置云连接与授权SAC 导入模型数据复制ABAP → 数据采集 → SAC分钟级或小时级复杂建模、大规模历史数据、跨系统合并建模简单但放弃实时SAP Datasphere / HANA Cloud 中转ABAP → 数据复制到 HANA Cloud → SAC Live近实时需要统一数据层SAC 只连一个语义层架构复杂多一层数据存储图中的“CDS OData Live Data Connection”才是本文主线。它在 SAC 侧被称为 Live Data Connection to SAP S/4HANA因为它借助的正是 S/4HANA 网关层的 OData 能力。如果你后端还是 ECC不代表完全没戏——ECC 也可以装 Gateway 组件并手工建 CDS 类似视图但效率与标准支持度都不如 S/4HANA所以我后面默认以 S/4HANA 作为目标系统。1.3 Live Data Connection 的工作原理理解原理能帮你少踩一半坑。SAC 的 Live 连接并不是让 SAC 直接访问你的 ABAP 数据库而是走这样一条查询链SAC 前端发出一个分析请求例如“取某销售组织过去 12 个月的销售额”。SAC 把请求发给 BTP 子账号里的 SAP S/4HANA 目的地Destination。目的地将请求转发到 ABAP 网关转换为 OData 查询。ABAP Gateway 调用对应的 CDS 查询视图在 HANA 数据库执行聚合。结果按维度、度量结构回传SAC 把扁平结果直接渲染进图表。盗个用生活化的说法SAC 不是把整个超市买回来再慢慢捡货而是站在收银台前报需求超市员工CDS按你的清单进仓库HANA捡好货再送出来。这决定了你 CDS 视图里建模好坏直接影响响应速度也决定了哪些计算该在 SAC 里做、哪些该下沉到源端。2. 开工前的前置准备2.1 源系统版本与能力确认别急着写代码先确认三件事。第一后端版本。建议在 S/4HANA 2020 或更高版本上做。这个版本对 CDS 分析注解支持最完整Analytics Model 等功能也齐了。如果还在 1709、1909 之间功能差异容易让你教程里看到的功能找不到。第二是否具备 HANA 数据库。CDS 分析视图跑到 HANA 上才有效率这是前提。尽管 ABAP CDS 在 SAP ASE 或非 HANA 上也能用但大量聚合下推到数据库时性能完全不同。实时分析场景里别在这种环节留短板。第三BTP 子账号与 SAC 租户已经开通。SAC 可以是独立订阅也可以走 BTP 的 SAP Analytics Cloud 服务。你需要能登录 SAC 的管理控制台能访问 BTP Subaccount。很多企业是先有 SACBTP 子账号没有授权管理员这一步就会卡住。正常路径是SAC 管理控制台 → 连接 → Live Data Connections这里能配置所有实时连接。当然了现实项目里最后一步往往是 IT 管理员帮你走。但作为 ABAP 开发者你至少要知道连接配置会消耗哪些配置项否则你在 ABAP 侧改好服务后云侧迟迟测不通连开会都不知道找谁。2.2 在 ADT 中搭建 CDS 开发环境写 CDS View 我强烈建议用 ABAP Development ToolsADT也就是 Eclipse 加 SAP 插件而不是 SE11 那套老界面。ADT 里能做语法检查、自动补全、直接预览 CDS 数据还能快速生成 OData 服务。这套环境向后端开发者其实是老朋友了如果你还没有去 SAP 官网下载 Eclipse 对应版本再装 ABAP Development Tools 插件然后通过 AbapGit 或者直接 SE80 连接到一个开发系统。比较容易被忽略的是ADT 里的 CDS 视图需要在“源文件头”指定正确 package 和 transport request。由于 SAC 连接只消费激活状态的对象视图必须激活并处于 Released 状态意味着你要在 Package 向导里勾选“添加主包与支持包”以及必要的 API 发布状态。这个地方我在项目里见过有人卡了两个小时——视图明明保存并激活了但 SAC 搜索不到最后发现是 Package 里没有把 CDS 视图发布到 APIRolled Out导致外部系统无法枚举。顺带提一下为了敲代码更顺建议把 ABAP 后端系统建立“云开发准备”标记。S/4HANA 里有专门的检查事务代码/N/S4HANA/EXPORT_CLOUD_READY用于发现不兼容对象。这条不是必须但值得跑一跑尤其当 CDS 想用新功能时能提前看到语法兼容性。2.3 必不可少的三项授权与角色在实时链路里ABAP 侧除了开发者角色还需要两类运行时权限一类是网关服务的调用权限另一类是后端数据访问权限。网关角色SAP_GW_BASE_ADMIN、SAP_GW_CLIENT这类角色要加到你用来调用 OData 服务的测试用户上。数据权限CDS 视图如果用AccessControl.authorizationCheck: #CHECK那么调用者必须有对应的授权对象或 DCL 权限。如果你图省事可以在开发早期设置为#NOT_REQUIRED但上线时必须补上 DCL否则任何用户都能通过 OData 看到全量数据。这里不是危言耸听SAC 的 Live 查询最终用的就是你在连接配置里提供的那个通信用户不控制好等于把公司数据放在公共餐厅。SAC 侧的角色也要留个心要能创建 Live Data Connection你至少需要BI_CONTENT_ADMIN或管理员权限要能在 Story 里拖数据源通常需要BI_CONTENT_CREATOR。如果你既是开发又兼分析建模建议用不同账号分别测“配置连接”和“使用连接”能更清楚错误出在哪一层。3. 定义面向 SAC 的分析型 CDS 视图3.1 基础视图从一张干净的表开始SAC 消费的是带分析语义的 CDS 视图所以你的开发重心不在于“能查出数据”而在于“让 SAC 理解这是维度、度量、日期”。第一步通常是建一个基础视图把需要的字段从底表筛选出来。比如说用销售订单表结构AbapCatalog.sqlViewName: ZSQL_SAC_SALES AbapCatalog.compiler.compareFilter: true AbapCatalog.preserveKey: true AccessControl.authorizationCheck: #CHECK EndUserText.label: SAC实时分析 - 销售订单基础视图 ObjectModel: { usageType: #ANALYTICAL, query: { enabled: true } } define view Z_SAC_SALES as select from vbak inner join vbap on vbap.vbeln vbak.vbeln { key vbak.vbeln as SalesOrder, key vbap.posnr as SalesOrderItem, vbak.vkorg as SalesOrganization, vbak.vtweg as DistributionChannel, vbak.vbeln as SoldToParty, vbak.audat as OrderDate, vbap.netwr as NetAmount, vbap.waerk as Currency, vbap.kwmeng as OrderQuantity, vbap.vrkme as BaseUnit }这里有个容易被忽视的细节AbapCatalog.sqlViewName不能太长上限是十六个字符但一般用ZSQL_开头没问题。注解ObjectModel.usageType: #ANALYTICAL声明这是一个分析视图ObjectModel.query.enabled: true则允许后续把它作为查询视图暴露。两个注解组合在一起ABAP 运行时才允许你把它发布给外部查询工具。这个设计是 SAP 为了区分“字典视图”和“分析视图”用的少了任何一个SAC 连服务列表时都找不到你的对象。很多开发者习惯把所有筛选条件都写在基础视图里比如默认“排除已删除订单”。我建议尽量少写死因为同一个 CDS 视图可能被多个 SAC Story 复用一个 Story 要含删除订单一个不要写死在底层就尴尬了。筛选应该放在 SAC 查询端或者在 CDS 上层做参数化。实时分析和传统 ABAP 报表的开发哲学在这里有轻微不同CDS 更像是提供一筐干净的乐高积木而 SAC 负责按场景拼装。3.2 关联视图该关联时要克制基础视图做完你可能觉得还不够丰富于是用 Association 去关联客户主数据、物料描述、信用额度等表。这个思路没问题但一定要克制。SAC 的 Live 查询本质上是把用户拖拽的维度与度量翻译成 OData 查询再让 CDS 数据库执行聚合。这里有个天然矛盾关联表越多数据库执行计划越复杂响应越慢而 SAC 界面的用户又总是爱拖一堆字段因为他们不知道后端有多累。所以我的推荐是维度字段比如客户、物料、销售组织尽量直接存在于同一个视图如果业务上非要带描述再考虑关联文案表。一对多关联比如一张抬头表对应多个行项目尽量在基础视图里通过 JOIN 处理而不是在 SAC 侧用维度聚合时再隐式产生数据膨胀。父子关系、层级合并这类复杂逻辑最好在 ABAP 端用视图解决不要在 SAC 里通过“合并维度”完成。SAC 擅长展示层级不太擅长发现层级。下面是一个典型关联视图写法AbapCatalog.sqlViewName: ZSQL_SAC_SALES_DESC ObjectModel: { usageType: #ANALYTICAL, query: { enabled: true } } ObjectModel.query.state: #Active define view Z_SAC_SALES_DESC as select from Z_SAC_SALES as Sales association [1..1] to KNA1 as Customer on Customer.kunnr Sales.SoldToParty { key Sales.SalesOrder as SalesOrder, Sales.SalesOrderItem as SalesOrderItem, Customer.kunnr as SoldToParty, Customer.name1 as SoldToPartyName, Sales.SalesOrganization, Sales.DistributionChannel, Sales.OrderDate, Sales.NetAmount, Sales.Currency, Sales.OrderQuantity, Sales.BaseUnit }注意关联的基数cardinality用了[1..1]。这个必须明确。SAC 在生成查询时如果关联基数不明确可能生成笛卡尔性能灾难。业务上如果存在 0 条或 N 条匹配你要么显式用[0..1]要么在 JOIN 时写清楚。模糊的关联查询经 SAC 透传后极难调优。3.3 激活分析状态最容易被忽略的一行注解到了关联视图这层有一样东西必须加上ObjectModel.query.state: #Active这行注解至关重要。SAP 网关向外部工具暴露 CDS 视图时只允许查询那些“激活分析状态”的视图。没有它你在 SAC 的模型创建器里搜索服务对应的数据源时会发现结果一片空白或者报“No analysis enabled view found for service”。刚接触这个概念时我也觉得迷明明视图激活了啊为什么叫“没有分析视图”后来理解了#Active在这里不是指 ABAP 激活状态而是“分析查询视图的状态”。它的作用是告诉 ABAP 的 Query 框架这个视图允许被 OData 查询语义访问。这也解释了为什么单独建立一个查询视图而不是直接在基础视图上改——基础视图往往是开放度最低的那层查询视图才承担对外交互。顺带一提在新版 S/4HANA 里你也可以用“Analytics Model”进一步包装。但核心还是这行注解。如果你的 ABAP 版本足够新在 ADT 里创建视图时可以选择模板“Analytical Query View”系统会默认带好这一堆注解不用手敲。3.4 语义注解让 SAC 认识维度和度量SAC 拿到 OData 的元数据并不知道哪个字段是金额、哪个字段是数量、哪个字段是日期。它只能根据 CDS 的语义注解来识别。所以你在定义每个字段时要显式加Semantics。度量字段样例Semantics.amount.currencyCode: Currency NetAmount as NetAmount, Semantics.quantity.unitOfMeasure: BaseUnit OrderQuantity as OrderQuantity, Semantics.currencyCode: true Currency as Currency, Semantics.unitOfMeasure: true BaseUnit as BaseUnit,日期字段样例Semantics.calendarDate: true OrderDate as OrderDate,维度一般为字符串、编号类字段默认可以作为维度。但如果你希望某字段被自动视为层级或关联过滤可能要加ObjectModel.foreignKey.association之类的扩展注解。第一版项目里不用追求太复杂把基础语义标对SAC 就能正确区分维度和度量。这里分享一个我踩过的真实坑NetAmount 金额字段忘了加 currencyCode结果 SAC 度量面板里金额被识别为普通数字用户在做货币换算时发现没有币种选项。后来在视图上补了注解再重新激活SAC 侧刷新连接元数据问题才彻底解决。类似地数量字段不加 unitOfMeasureSAC 会把所有数量揉成一团做完占比分析后得到一堆没有意义的“比率”。4. 把 CDS 视图武装成 OData 服务4.1 自动发布服务与手动注册CDS 视图写好、语义标注完成后下一步是暴露成 OData 服务。SAC 的 Live Data Connection 查到的是服务的元数据而不是直接连视图。所以你至少需要一次服务发布动作。我推荐的做法是在 ADT 里右键已激活的 CDS 查询视图选择“Create OData Service”。稍老一些的版本会走 SEGW 项目但那套流程比较重适合复杂 OData 开发CDS 视图场景下直接用自动生成效率更高。自动生成本质是 ABAP 后端动态生成一个 Gateway 服务服务名一般可以在向导里指定比如Z_SAC_SALES_SRV。完成后服务不一定立刻注册到网关运行时你需要在事务代码/IWFND/MAINT_SERVICE里添加该服务。普通话讲就是后端把“原料”备好了还要把“菜单”登记到网关门口。如果你没走 ADT也可以直接在/IWFND/MAINT_SERVICE里手动 Add Service填技术名称与包名。但这样容易漏掉状态字段因此我用几分钟确认下服务激活状态也是好事。发布时还有个小知识点服务版本一般默认 V2SAC 的 Live 连接只很好地支持 OData V2尚不完整支持 V4。所以别为了赶新潮去启用 V4没必要。你只需要确认在 Gateway 中服务的版本是 “0002” 或 “2.0”这已经成为 ABAP 侧最稳妥的选择。4.2 验证服务的三种姿势服务发布完先别急着切到 SAC在 ABAP 侧把服务验证通过再上云排查会快很多。第一种方式浏览器直接打开服务 URL形如https://你的后端域名/sap/opu/odata/sap/Z_SAC_SALES_SRV/$metadata能返回 XML 元数据说明服务注册成功。第二种方式用 OData 查询测试数据加过滤条件https://你的后端域名/sap/opu/odata/sap/Z_SAC_SALES_SRV/Z_SAC_SALES_DESC?$top10$formatjson能看到 JSON 返回说明数据访问正常。第三种方式在 ABAP 系统里用事务代码/NWBC或者直接 SE38 跑一个简单的 HTTP 调用来模拟。不过日常浏览器测试已经足够。我在项目里通常还会顺手测试一下聚合查询比如用$applygroupby((SalesOrganization),aggregate(NetAmount with sum))这种 OData 扩展确认聚合能下发。不过 SAC 用的是它自己生成的那套查询协议你在浏览器里手动测的过程中但凡遇到 401 认证失败或 404就说明有问题不需要继续向下排查。4.3 细节陷阱OData V2、CORS 与行数限制服务发布成功不代表万事大吉还有三个高频细节要注意。第一个是 CORS 跨域配置。SAC 租户与你的 ABAP 后端域名不一样浏览器在 Story 中调用 OData 时会发起跨域请求。如果后端没有配置允许来自https://*.sapbusinessobjects.cloud的跨域访问前端请求会被浏览器拦截表现症状是 Story 里数据源连接失败但你在本地浏览器直接测试 URL 完全正常。处理办法是去/n/IWFND/CORS_DEFAULT事务代码里维护默认的 CORS 配置添加允许的域名。注意还要在网关服务的配置文件里勾选“支持 CORS”。否则前端调用时SAC 会收到一个“No Access-Control-Allow-Origin header”的错误。第二个是 URL 长度与行数限制。OData 服务默认有最大行数限制比如内部默认 1000 或 5000 行如果没调SAC 拉取稍大的聚合结果时会被截断页面表现为数据少了。在 SAC 侧实时连接里也有一个“最大行数”设置默认自动你可以根据业务调整到 10000 或更高。但别天真地无限加大行数上限越高源系统负载越高。实时分析的精髓是聚合后的小结果集而不是全量明细搬运。第三个是认证模型。ABAP 网关作为服务端点支持 Basic Auth、SAML、Principal Propagation 等方式。SAC 实时连接最常用的是 Basic Auth用一个专用服务账号或 Principal Propagation把云用户映射到 ABAP 用户。如果你只是做 PoCBasic Auth 最快生产环境数据权限要求严格时建议 Principal Propagation。这个选择要和网络安全同事提前对齐因为 Basic Auth 意味着一个万能账号风险较高。5. 连线 SAP Analytics Cloud5.1 配置 Communication System 与 ArrangementSAC 的实时连接技术底子是 SAP BTP 的 Communication Arrangement通信安排虽然 BTP 上叫法叫出口通信但方向其实是 SAC 主动访问 ABAP 系统。在 BTP 子账号里你会进入“连接性”菜单创建一个通信系统名称比如ABAP_ECC_PROD。主机ABAP 系统的公网或内网可访问域名。认证方式Basic Authentication 或 Principal Propagation。证书如果你开了 SSL可能需要双向证书这里要注意 ABAP 系统侧必须配置对应证书信任否则握手失败。接着创建一个通信安排关联“SAP_COM_0009”或对应 SAC 集成场景的通信场景。这个场景会在 BTP 里自动生成一个 destination。逻辑上通信系统是“地址簿”通信安排是“通关文牒”两者不配对SAC 就找不到 ABAP 系统。如果你完整走一遍这个流程会发现它和以前 SAP PI/PO 里的 HTTP 目标很相似只是 UI 换成了云界面。因为涉及证书与 CA这个环节经常要 IT 安全和 Basis 团队协助我在前面的准备工作里就建议你把相关角色确认好。5.2 在 SAC 侧创建 Live Data Connection登录 SAC 管理控制台依次进入连接、Live Data Connection。新建连接时选择SAP S/4HANA类型。界面会让你填系统名称/描述。数据访问方式一般选“Live Data Connection通过目的地”或“SAP S/4HANA Realtime”。如果走 BTP 的 Destination选择刚才在通信安排里生成的目标。配置好之后点击“测试连接”。成功提示是看到了一个绿色检查标志此时 SAC 已经能通讯访问 ABAP 网关。如果测试失败先去查 ABAP 侧 Gateway 日志而不是反复怀疑云端配置——我经历过太多次云端配置完全按标准填最后都是 ABAP 侧网络白名单没放行或者 SSL 证书缺失。这里有第二个小提醒SAC 租户和后端 ABAP 系统之间的网络可能要经过 SAP Cloud Connector如果你用的是 BTP 的 Cloud Connector那你要在 Cloud Connector 里加一条映射到后端网关主机和端口的访问规则。否则用户连接时可以看到 endpoints 列表为空白白浪费一小时。换句话说路径上有几个中间站任何一个没开闸整条链路就断路。5.3 创建模型连接到底是选模型类型还是 CDS连接测试通过后你还要在 SAC 的“模型Model”创建器里建立数据基础。SAC 里新建模型时可以选“使用实时连接”然后选择刚才的 Live Data Connection下一步就是选择 OData 服务。此时 SAC 会向网关请求服务的元数据把 CDS 里的字段按照语义注解映射成为模型里的维度和度量。你会发现CDS 里加了Semantics.amount的字段到了 SAC 模型里自动变成度量并且有货币属性。相反的普通字段映射成维度可以用于筛选、钻取。如果你的 CDS 视图在外层继续包了一层查询视图Analytics ModelSAC 里同样可以基于它建 Live 模型。我的建议是第一版先直接用 CDS 查询视图验证全链路跑通后再考虑是否引入 Analytics Model 来增强计算与关联这样排查范围更小。模型建完之后字段类型、默认聚合方式都是可调的SAC 里能把某些维度改成特性把度量的聚合从求和改成平均值。注意这些调整只影响 SAC 侧展示不会反过来修改 ABAP 系统。也因此一旦 ABAP 侧的字段语义变了SAC 模型需要重新连接或刷新元数据否则新字段不会出现。6. Story 里的实时分析实操6.1 添加 Live 数据源并构建报表连好连接、建好模型后剩下的就是 Story 层面的活了。新建 Story选择响应式页面或画布页面添加数据源时选“Live Data”然后选刚才创建的模型。这时 SAC 会打开查询面板。你可以把维度拖到行或列把度量拖到数值区。实时连接下SAC 会即时向 ABAP 发一次查询返回结果并渲染。第一屏数据展示出来链路就算正式贯通。为了验证实时性你可以开两个浏览器窗口一个去 SAP GUI 里改一条销售订单金额另一个在 SAC Story 里点刷新。只要 CDS 视图对应表没有做数据缓冲刷新后数字立刻变化这就完成了“实时链路”验收。我曾在客户现场做过这种演示业务人员那一刻的表情最为直观——他们终于不用等批处理了。图表选择上并没有绝对标准。时间序列用折线图组织结构对比用柱状图占比用饼图或堆叠条图。SAC 的自动图表推荐也做得不错但我建议你尽早固定“查询面板 图表页”的最小搭配方便后续维护。6.2 让查询下发到源端的性能技巧实时分析最怕的是 SAC 把大量明细数据拉到云端再做本地聚合。虽然 SAC 对实时连接默认会尽可能下推聚合但某些操作很容易把性能拖垮。第一尽量在 ABAP 的 CDS 端预聚合。如果你知道业务端总会按“销售组织 月份”查看可以在 CDS 里直接做一个聚合视图SAC 查询时就少了很多行。第二避免在 SAC Story 里创建过多的“计算度量”。例如把两个 CDS 度量相除后得到新度量SAC 有时需要把原始数据拉出来再计算。轻度计算没问题重度计算会让实时响应变慢。更耗资源的是 Story 里的“表计算”功能它默认在本地按整个数据切片执行一旦数据量大图表转半天。第三合理使用过滤器与钻取层级。SAC Story 的仪表板筛选器能下推到 ABAP 查询里你要优先建议用户使用页面级过滤器而不是在视图里堆大量细节。比如“只看当前月份”这就让 CDS 查询能推送一个WHERE条件而不是把十二个月的数据都拿过来。第四如果发现某张报表确实在 SAC 里跑不动那么反过来检查 ABAP 侧。用事务代码ST05抓 SQL 跟踪看查询是否真的下推到了 HANA 并走了正确的索引。CDS 视图如果做了一些不必要的跨表关联HANA 优化器有时会给出令人惊讶的执行计划。这个步骤对传统 ABAP 开发者而言有点陌生但实时分析栈里数据库执行计划才是终局裁判。6.3 实时报表的权限和发布注意点Story 做出来后你会想分享给业务用户。SAC 的权限模型有两种内容权限和数据权限。内容权限决定谁能看到这个故事数据权限则是在模型层面控制的。因为我们是实时连接ABAP 端如果有 DCL 权限控制会在每次查询时生效。这意味着SAC 上能看到哪些公司代码的数据取决于连接账号在 ABAP 端有什么权限。有些人以为在 SAC 里配了数据权限就够了却漏了 ABAP 端的 DCL结果出现“测试用户看到全部数据”这种风险。如果你用 Basic Auth 的共享账号更是如此。发布 Story 时还有个小细节实时 Story 的刷新模式建议设置为“打开时刷新”或“手动刷新”而不是定时自动刷新。定时刷新对实时连接没有意义因为真正常态已经是实时读取了。设置成自动刷新反而会让系统在人员未打开报表时也发起 ABAP 查询浪费连接数。7. 常见问题与排查技巧实时链路参与环节多出了问题经常让人抓狂。我把实际项目里的高频问题按“现象—定位—解法”整理成一张速查表现象定位方向解法SAC 连接测试失败报认证失败通信系统中的认证配置与 ABAP 端服务用户不匹配检查 Basic Auth 账号密码、证书信任、Principal Propagation 映射Story 无法选择数据源搜索不到服务CDS 视图没有激活分析状态或服务未注册确认ObjectModel.query.state: #Active并在/IWFND/MAINT_SERVICE注册服务元数据能读取但数据报错“Data Source not supported”OData 版本或服务路径配置不对确认服务是 OData V2检查连接里的服务 URL 路径金额/数量字段不显示为度量CDS 缺少Semantics.amount.currencyCode或Semantics.quantity.unitOfMeasure补注解、重新激活、在 SAC 模型里刷新元数据CORS 报错浏览器拦截请求网关 CORS 配置缺失在/n/IWFND/CORS_DEFAULT配置允许 SAC 域名并确认服务启用 CORS图表渲染慢刷新要几十秒数据量过大或计算在 SAC 本地完成在 CDS 端预聚合、在 SAC 端加过滤条件、减少复杂计算度量数据看起来少了OData 行数限制或查询被分页调整网关及 SAC 连接的最大行数设置刷新后数据没有变化ABAP 端有缓冲或视图缓存检查 CDS 视图的缓存设置、数据库缓存必要时清理表缓冲排查顺序自己心里要有数连接失败先查网络与证书再查认证数据源搜索不到先回 ABAP 查注解字段不对回 CDS 查语义速度慢去数据库看执行计划。别在 SAC 界面反复点连接测试那不是排查那是碰运气。日志方面ABAP 侧最常用的是事务代码/IWFND/ERROR_LOGGateway 的错误会记录在这里。如果是新式 ABAP 环境也可以去/n/SM59看外部 HTTP 目标是否可用。SAC 那边错误详情通常会包含 HTTP 状态码和错误文本拿这个码去 BTP 的日志或 ABAP 网关日志里对能很快圈定问题域。最后分享一个我在每个项目里都会做的事把从 CDS 视图到 SAC Story 的所有对象名、服务名、连接名、通信安排名统一命名比如都用ZSAC_SALES_*前缀。排查链路问题时只要看一眼名称就知道这是哪条线的。实时分析涉及多个系统、多套权限、多个配置界面没有统一命名踩坑时你连对账都费劲。实时分析这条路本身并不神秘它是 CDS 语义建模、OData 暴露、云通信配置与 SAC 可视化四段路的接力。ABAP 开发者的角色已经从“写报表程序”迁移到“提供可被云端消费的分析语义模型”。只要把 CDS 分析视图这头的地基打好后续一切水到渠成。真要在项目里推小步快跑先拿一张业务表打通全链路再扩展关联视图最后再上生产权限模型这样每一层出问题时都清晰可控。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进