课程地址
很多 SAP 从业者反映,open SAP 上的视频,因为网络原因无法访问,所以我会陆续在我的个人微 信 号“汪子熙”上面,把这些视频配上中文字幕并发布出来,敬请关注。
本单元的话题是 SAP OData 和注解的深入讲解。
下面是本单元视频讲解的中文字幕,均由 Jerry 人工翻译而成。
====
欢迎大家来到 Open SAP Fiori Elements 公开课第三单元。本单元介绍 OData 和注解
我是 Stefan Engelhardt, 是 SAP Fiori Elements 的开发架构师
在第二单元,Marcel 已经简单介绍了 OData. 每个 Fiori Elements 应用都需要一个 OData 服务
Fiori Elements 对 OData 服务的后台技术栈没有特殊要求,因为 OData 协议本身就是对后台实现细节的抽象
现在我们将深入介绍 OData 服务的核心概念。从数据模型的元描述开始
每个 OData 服务都有其数据模型的元描述信息。屏幕右边是一个例子
我们通常简称为 OData 元数据。在 OData url 后面加上 $metadata 即可查看其元数据
屏幕左边底部的超链接是 该 OData 元数据的完整 url
元数据定义了业务模型及其属性
下图右边是一个 OData V4 的例子,定义了一个 Person 模型
包含用户名,FirstName 等字段
元数据中属性也具有进一步的定义
这些进一步的定义包含属性的数据类型,比如 Edm.String, 是否允许存储 null 值,字段最大长度等
描述实体与其他实体关系的字段被称为导航字段
模型的导航字段指明了模型和其导航目标模型的基数关系,即"一对一"还是"一对多"
例如屏幕中名为 Trips 的导航属性,指向的目标模型 Trip,类型是 Collection, 说明 Person 和 Trip 两个模型是一对多的关系
此外,元数据还可以包含复杂类型,actions 和 singleton 等等的定义
Marcel 在上一个单元中已经介绍过,OData 支持增删改查操作
让我们来看一些例子
这里我们能看到对一个 OData 服务发起的 HTTP 请求和响应
第一个场景是读取所有的 People. People 的类型是 Person, 定义在元数据里
HTTP 响应包含对应的数据集。结果列表里的第一条记录是 Russell Whyte
我们还可以通过指定 key, 来查询某条特定的 Person 记录
把键值 russellwhyte 添加到花括号里,在响应中您可以看到, 该请求只返回了一条对应的数据
让我们再来看看一些更复杂的查询
使用 select, 只读取 FirstName 和 LastName 字段
对结果集再次过滤,条件为至少拥有一条 Trip 记录,且费用超过3000
如大家看到的, 我们可以非常灵活地构造复杂查询语句
现在展示如何创建一条 Person 记录
使用 HTTP POST 请求,在请求正文中维护 Person 数据
响应返回 HTTP 201 状态码,表明数据创建成功
为提高 Fiori 用户体验,SAP 定义了一种标准化的支持文档 Draft 版本的处理机制
有了 Draft 机制,用户对文档的编辑可以随时中断并随时继续
只有当用户完成编辑之后,文档数据才会存储到对应的数据库表里
在 SAP Fiori Elements 应用里,每当用户在编辑模式下添加或者更改信息时,Draft 版本的数据都会自动被保存
这种自动保存的请求响应,可能会包含一些提示消息,比如 SalesArea 的 sold-to party 没有维护
当 sold-to party 数据发生变化时,HTTP 响应包含了该 party 所有数据,以便显示在 UI 上
比如地址和联系人信息。Draft 机制使应用具备动态交互的特性
注意,Draft 机制应该通过框架提供开箱即用的支持
如果在应用程序层面重新实现整套 Draft 处理机制,工作量相当巨大
上一单元 Marcel 也介绍过 OData 注解。这些注解从行为和消费方式两方面,对模型提供更多描述信息
现在我将解释 OData 注解的工作原理,并举例说明
注解是 OData 额外的元数据,格式为 XML
注解定义于 OData 和 SAP 维护的词汇表中
注解都是一些抽象的定义,因此较稳定,不会频繁变动,能够被包括 SAP UI5 在内的消费端解析
SAP Fiori Elements 解析注解并生成对应的 UI 页面
看一个具体的例子:Travel App 里的 Total Price 字段
在 OData Measures 词汇表里,存在一个 ISOCurrency 注解
OData 元数据里的 TotalPrice 类型被其注解,指向目标字段 CurrencyCode
因而框架代码能够理解,TotalPrice 是一个货币金额,而 CurrencyCode 字段包含了货币单位
于是 Fiori Elements 在金额字段的右边显示货币单位
该注解还用于根据货币单位显示对应的小数,并保证在表格中让金额的显示也能正确对齐
注解当然还能够定义更复杂的 UI 元素
例如,这些 UI 可以是通过 UI.LineItem 定义的表格
通过 UI.FieldGroup 定义的 form, 通过 UI.Chart 定义的图表等等
此外,注解还可以从行为方面来对应用程序进行描述
一个例子是在应用程序中提供增删改查等功能
比如通过注解,可以指定 Travel 模型可以被编辑,于是 Fiori Elements 在 UI 上绘制 Edit 按钮
工具栏其他按钮的显示或隐藏逻辑也以此类推
另一个场景是所谓 Side Effect 的定义
例如,当表格行项目级别的产品单价发生变化时,UI 需要重新从后台读取最新的订单抬头级别的总价信息
SAP 系统后台可以提供基于 ABAP CDS 或者 CAP CDS 的注解
或者也可以使用本地文件定义的注解。对于 UI 来说,它不关心注解来自后台服务器或是本地文件
CDS View 中的注解被后台服务器翻译成 XML 格式的注解
后者被 Fiori Elements 框架解析
XML 格式的注解可以被任何类型的后台服务器使用
这些后台服务器可以是 SAP 传统的 ABAP 编程模型,SAP BW 和非 SAP 服务器。下图右边是 ABAP CDS 注解的一个例子
您平时对于开发工具的偏好,可能会影响您对注解类型的选择
在 SAP Fiori Tools 中,其提供的向导式创建步骤,能帮助我们创建正确的注解
XML 和 CAP CDS 注解都能被 SAP Fiori Tools 支持
如果您使用 ABAP Development Tool, 可以直接在 ABAP CDS 中维护注解
生命周期管理和功能可用性同样会影响注解类型的选取
UI 项目本地文件提供的注解,其生命周期同应用程序一致。CDS 注解的生命周期同 OData 服务实现一致
如果我们是在一个比较低版本的 ABAP 服务器上开发,某些注解可能无法被支持。如果有疑问,请查询文档
让我们总结一下本单元的内容
我们介绍了 OData 概念的核心部分,OData 元数据,OData 请求,以及 Draft 机制
我们也学习了什么是 OData 注解,以及它是如何影响 Fiori Elements 应用的
现在大家可以期待下一单元的内容了。届时我们将介绍如何搭建 Fiori Elements 应用的开发环境。感谢收看本视频,下期再见
更多Jerry的原创文章,尽在:"汪子熙":