☰
从CDS View到SAC实时分析:ABAP开发者全链路配置指南
2026/10/5 21:00:57 网站建设 项目流程

如果你所在的 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 数据库,而是走这样一条查询链:

  1. SAC 前端发出一个分析请求,例如“取某销售组织过去 12 个月的销售额”。
  2. SAC 把请求发给 BTP 子账号里的 SAP S/4HANA 目的地(Destination)。
  3. 目的地将请求转发到 ABAP 网关,转换为 OData 查询。
  4. ABAP Gateway 调用对应的 CDS 查询视图,在 HANA 数据库执行聚合。
  5. 结果按维度、度量结构回传,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。很多企业是先有 SAC,BTP 子账号没有授权管理员,这一步就会卡住。正常路径是:SAC 管理控制台 → 连接 → Live Data Connections,这里能配置所有实时连接。

当然了,现实项目里最后一步往往是 IT 管理员帮你走。但作为 ABAP 开发者,你至少要知道连接配置会消耗哪些配置项,否则你在 ABAP 侧改好服务后,云侧迟迟测不通,连开会都不知道找谁。

2.2 在 ADT 中搭建 CDS 开发环境

写 CDS View 我强烈建议用 ABAP Development Tools(ADT),也就是 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 视图发布到 API(Rolled 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 侧刷新连接元数据,问题才彻底解决。类似地,数量字段不加 unitOfMeasure,SAC 会把所有数量揉成一团,做完占比分析后得到一堆没有意义的“比率”。

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,填技术名称与包名。但这样容易漏掉状态字段,因此我用几分钟确认下服务激活状态也是好事。

发布时还有个小知识点:服务版本一般默认 V2,SAC 的 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?$top=10&$format=json

能看到 JSON 返回,说明数据访问正常。

第三种方式:在 ABAP 系统里用事务代码/NWBC或者直接 SE38 跑一个简单的 HTTP 调用来模拟。不过日常浏览器测试已经足够。

我在项目里通常还会顺手测试一下聚合查询,比如用$apply=groupby((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 用户)。如果你只是做 PoC,Basic Auth 最快;生产环境数据权限要求严格时,建议 Principal Propagation。这个选择要和网络安全同事提前对齐,因为 Basic Auth 意味着一个万能账号,风险较高。

5. 连线 SAP Analytics Cloud

5.1 配置 Communication System 与 Arrangement

SAC 的实时连接,技术底子是 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 Model),SAC 里同样可以基于它建 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_LOG,Gateway 的错误会记录在这里。如果是新式 ABAP 环境,也可以去/n/SM59看外部 HTTP 目标是否可用。SAC 那边错误详情通常会包含 HTTP 状态码和错误文本,拿这个码去 BTP 的日志或 ABAP 网关日志里对,能很快圈定问题域。

最后分享一个我在每个项目里都会做的事:把从 CDS 视图到 SAC Story 的所有对象名、服务名、连接名、通信安排名统一命名,比如都用ZSAC_SALES_*前缀。排查链路问题时,只要看一眼名称就知道这是哪条线的。实时分析涉及多个系统、多套权限、多个配置界面,没有统一命名,踩坑时你连对账都费劲。

实时分析这条路本身并不神秘,它是 CDS 语义建模、OData 暴露、云通信配置与 SAC 可视化四段路的接力。ABAP 开发者的角色已经从“写报表程序”迁移到“提供可被云端消费的分析语义模型”。只要把 CDS 分析视图这头的地基打好,后续一切水到渠成。真要在项目里推,小步快跑:先拿一张业务表打通全链路,再扩展关联视图,最后再上生产权限模型,这样每一层出问题时都清晰可控。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询