今天我的 SAP 开发技术交流群里,有朋友问这样的问题:
在 Fiori 界面中,怎么查看当前 Client?
我觉得要回答这个问题,需要提问的朋友提供更多的背景信息,比如:
Fiori 界面,是运行在 ABAP On-Premises 上,还是 Cloud 环境(Cloud 环境下想知道 Client ID 貌似没有意义,因为这个字段值只对 SAP Support Engineer 有用)?
Fiori 界面是 Fiori 1.0,2.0 还是 Fiori 3.0?
在不同的 Fiori 部署方式和版本,查看当前 Client 的方法略微有些差异。Jerry 近期会逐一介绍。
在开始介绍查看 Client 方法之前,我们可以先复习一下这几篇文章介绍到的知识:
- SAP Fiori 应用的三种部署方式
- 如何分辨 SAP Fiori Launchpad 里的"真假" Fiori 应用
- SAP Fiori Launchpad Tile,UI5应用,和PFCG Role的对应关系
下面我们从 Fiori 1.0 开始聊起。
SAP Fiori 1.0 正式发布于 2013 年,旨在通过 Mobile First(移动设备优先)的设计策略,对 SAP 不同领域使用频率最高的应用进行重构。Fiori 1.0 在这门设计语言发展历史上,起到的最重要的作用,就是提出了基于角色的应用访问原则(Role-based Access Principle),目标是开发出具备 simple, responsive, coherent 和 delightful 特性的应用程序。这些原则和目标,贯穿于 Fiori 长达10年的漫长演进历史中。
Fiori 1.0 基于的 SAP UI5 版本号范围是 1.26 到 1.38. 下图是我早在 2014年时,在 SAP 成都研究院 CRM Fiori 开发团队负责开发的 My Opportunity 应用的截图。
从应用的地址栏里,可以一眼看出这个 Fiori 应用的 ABAP 系统名称为 GM4,Client ID 为 001.
如果用户访问的系统 url 被重定向或者由于种种其他原因,无法直接从地址中提取出系统名称和 Client ID,可以打开 Chrome 开发者工具,切换到 network 面板,输入关键字 start_up 进行过滤:
这个 start_up 请求的响应里,就包含了当前系统的 System 和 Client ID,如下图图例1和2所示。除此之外,还有当前登录用户的明细,比如使用的语言,所处时区等信息。
知道了 ABAP On-Premises 系统的系统 ID 和 Client ID,准确的说,这个系统特指 SAP Gateway(也称为 Frontend) 服务器。
Frontend 服务器通过 ABAP RFC 与运行 SAP 业务逻辑的后台系统连接。
在 SAP Gateway 系统上的事务码 /IWFND/MAINT_SERVICE 里,可以指定 Frontend 服务器同后台服务器的映射关系。比如下图的配置,语义就是 GM4 Gateway 系统,可以通过 RFC 连接到两个后台 ABAP 系统,分别是 GHD/504 和 AG3/001. 至于当前登录用户,运行时实际被分配到哪个后台系统,是通过用户分配的 PFCG role,即下图绿色高亮区域所示的角色决定的。
在 Gateway 系统的 /IWFND/CL_MGW_REQUEST_MANAGER~CALL_BACKEND 方法设置断点,运行时通过 Destination 的值,就能分辨出当前用户的请求,到底被 Gateway 系统分发到哪个后台服务器上了。
后续我会介绍如何在更高版本的 SAP Fiori UI 中实现同样的目的,比如 SAP S/4HANA 2021 的 Fiori 3.0 界面里如何找到 Client ID.
我之前写过一套基于 SAP ABAP SEGW 实现的 OData 服务开发教程,已经更新了 35 篇,里面包含了 SAP ABAP OData 服务的开发技巧,以及相关的系统设计原理,思路和相关开发工具。下面是 35 篇文章的目录:
- 在 SAP ABAP 事物码 SEGW 里创建 SAP OData 项目
- 在 SAP ABAP 系统对事物码 SEGW 创建的 OData 服务进行配置并测试
- SAP ABAP OData 服务诊断工具 /IWFND/ERROR_LOG 的使用方法
- SAP ABAP OData 服务 Data Provider Class 的 GET_ENTITYSET 方法实现指南
- SAP ABAP OData 服务如何支持 $filter (过滤)操作
- 使用 Postman 工具高效管理和测试 SAP ABAP OData 服务
- SAP ABAP OData 服务如何支持 $orderby (排序)操作
- SAP ABAP OData 服务如何支持创建(Create)操作
- SAP ABAP OData 服务如何支持删除(Delete)操作
- SAP ABAP OData 服务如何支持修改(Update)操作
- 使用 HTTP PUT, PATCH 以及 MERGE 请求消费 SAP ABAP OData 服务修改操作的实现及其区别
- SAP ABAP OData 服务如何支持 $select 有选择性地仅读取部分模型字段值
- SAP ABAP OData 服务的分页加载数据集的实现(Paging)
- 几种 SAP ABAP OData 服务的性能评估和测试工具介绍
- SAP ABAP OData 服务里 EntityType 和 EntitySet 的区别
- 如何修改 SAP ABAP OData 模型,使其支持 $expand 操作
- 如何通过 SAP ABAP OData $expand 操作在同一个 HTTP 请求中返回多个节点的数据
- SAP ABAP OData 服务嵌套创建功能的实现步骤(Create Deep)
- 如何使用 ABAP 程序消费 SAP ABAP OData 服务
- 如何使用 ABAP 代码消费需要传递 CSRF token 的 OData 服务
- SAP ABAP OData 服务的 $count 操作实现
- SAP ABAP OData 服务的 $count 和 $inlinecount 两个操作的区别
- 如何给 SAP ABAP SEGW 开发的 OData 服务添加 Access-Control-Allow-Origin 响应头
- SAP 标准产品里使用 OData 服务的一些细节分享
- 答疑 - SAP OData 框架处理 Metadata 元数据请求的实现细节,前后端组件部署在同一台物理服务器
- SAP ABAP OData Gateway 框架里 /IWFND, /IWBEP 这些缩写代表了什么含义?
- SAP OData 框架里的缓存(Cache)设计专题讲座
- 如何使用 SAP OData 服务向 ABAP 服务器上传文本格式的文件
- 如何通过 ABAP 代码给 SAP OData 元数据增添注解
- 如何使用 SEGW 的 redefine 功能对 SAP 标准 OData 服务进行扩展
- SAP UI5 Fiori 应用在启动时向 ABAP 后台发起的 OData 请求序列的顺序和作用分析
- 关于 Fiori 应用里 SAP UI5 前端开发和 SEGW 后台 OData 服务开发的工作量比值问题
- 如何找出 SAP Fiori Launchpad 里点击 tile 之后,读取业务数据调用的是哪个 SAP 后台系统的 OData 服务
- 如何使用 Postman 发送 SAP OData Batch 请求到 ABAP 后台服务器
- 如何自行查找出 SAP ABAP 标准的 OData 服务返回数据的后台数据库表和表字段名称