SAP ABAP 业务开关和 SAP 电商云的 Feature Level

这是 Jerry 2021 年的第 72 篇文章,也是汪子熙公众号总共第 349 篇原创文章。

基于 ABAP 技术栈的 SAP 产品,客户可以通过安装 Enhancement Package(增强包)的方式,为当前使用的应用导入新的功能。

Enhancement Package(增强包),顾名思义,包含了应用程序增强功能的集合。客户可以根据企业实际的业务流程,有选择性的启用增强包里的部分新功能。每个新增的功能,都对应着一个 Business Function.只有在系统中激活 Business Function 后,其对应的新功能,包含前台页面,后台业务程序,以及 SPRO 实施活动才会生效。

SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第1张图片
借助增强包,客户能够在不升级 Netweaver 版本的情况下,使用到 SAP 产品的新功能。Business Function 则对增强包中的新功能,提供了更细粒度的管理灵活性,客户能够根据自己的实际需要,有选择性地启用部分新功能。

ABAP Business Function 对增强包新功能的控制,最终通过其包含的 Business Switch 即业务开关实现。该开关和我们实际生活中的开关概念一致,具有 On 和 Off 两种状态。业务开关能够控制 ABAP 前后台代码实现的行为,以及后台配置表中的记录。

SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第2张图片

下面通过实际的例子来说明。

SAP CRM 通过中间件可以从 SAP ERP 下载物料主数据。SAP ERP 作为这个数据交换场景的源系统,可以继续对物料主数据某些字段做修改,这些修改会自动同步到 CRM,这称为 Delta Download.

但是,某些字段的修改,在 SAP CRM 的默认实现里是无法接收到的。比如 SAP ERP 起初维护了英文和中文版本的物料描述文本,这两个版本的描述信息成功同步到 SAP CRM 之后,客户再在 ERP 删除中文版本的描述文本,则这个删除动作,无法同步到 SAP CRM.

因此 Jerry 之前工作过的 SAP CRM 开发团队,在 SAP CRM EHP3 里开发了一个新功能,用于支持上述描述的场景。

下图展示了事物码 SFW5 里包裹该新功能的 Business Function,ID 为 CRM_PROD_REQ_LOAD_SUBTRACTION.

当前处于未激活状态。

SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第3张图片

双击则能进入该 Business Function 明细页面,找到关联的业务开关 CRM_PROD_SETTYPE_RL_SUBTRACT.

SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第4张图片
在 ABAP 代码里,我们使用工具类,判断该开关的状态。如果状态为关闭,直接返回,不执行包含新功能的后续代码。

SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第5张图片

总之,SAP ABAP Enhancement Package 里新增添的应用业务逻辑,总是包裹在一段以检查业务开关状态作为条件评估的 IF 代码块里,伪代码如下:

IF 对应的业务开关处于开启状态.
执行增强包的新功能.
ENDIF.

除了代码逻辑外,前台 UI 页面某些元素的显示与否,也能通过业务开关动态控制。比如下图这个 SAP CRM 产品搜索页面的 Simple Search 按钮,就被一个 ID 为 CRM_MD_PRD_SEARCH 的业务开关控制。仅当该开关开启时,才会执行到下图第 6 行开始的代码,将按钮绘制到页面上。

SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第6张图片

简而言之,当 SAP Enhancement Package 安装到系统之后,增强包内的代码,数据库表和其他 ABAP 资源均已存储到系统内。除非显式开启新功能对应的业务开关,否则新功能不会生效。

SAP 电商云

在 SAP 电商云 Spartacus UI 中也可以采取所谓的 Feature Level 概念,给用户提供有选择性地启用部分新功能的灵活度。

SAP 电商云 Spartacus UI 本身是一个高度模块化的 Storefront 开发框架和开发库,电商网站运行涉及到的功能块,按照业务层面划分并实现在不同的功能模块(Feature Modules)里,这些功能模块的列表下图所示:

SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第7张图片

客户实施 Spartacus 时,可以根据自己的实际业务,有选择性地安装功能模块。

下图是一个例子,我安装 Spartacus 时,选择了 Store Finder 和 Tracking 相关的几个功能模块,而未选择 Product Configurator, Qualtrics 和 SmartEdit 这三个功能模块:

SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第8张图片

最后客户决定启用的所有功能模块,通过蓝色高亮信息显示在安装控制台:
SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第9张图片

基于选择的这些功能模块,构建出的 JavaScript Bundles 文件如下图所示:

SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第10张图片

未启用的功能模块,不会参加构建,当然更不会出现在最终 Spartacus Storefront 的运行时环境里。这个机制有助于减小构建出的 JavaScript Storefront Bundles 文件尺寸,提高运行时加载资源的速度。

至此不难看出,SAP 电商云 Spartacus UI 功能模块这一选择性安装的机制,同本文前半部分介绍的 SAP ABAP 增强包全部安装,部分启用的机制有所区别。

当然,SAP 电商云 Spartacus UI 也存在类似 SAP ABAP 增强包的表现行为,即客户已经将新功能的实现代码安装到了本地,只是通过某种开关的控制,暂时不启用。Feature Level 就扮演了这个开关的角色。

由于历史原因,像修改电商页面全局 Directionality 这种特性,并没有封装到某个功能模块里,而是通过 Feature Level 控制。

世界上某些国家和地区,比如使用阿拉伯语和希伯来语的客户,习惯以从右到左的方式浏览网页。为了满足 SAP 产品标准之一即 Internationalization(国际化,简称 i18n), SAP 电商云 Spartacus UI 也对这部分客户的浏览习惯提供了支持。

下图是默认的使用从左到右的方式渲染的 SAP 电商云主页,SAP Logo 在屏幕上方最左边,购物车图标在屏幕上方最右边:

SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第11张图片

在产品明细页面里,产品图片在左边,添加到购物车的按钮在右边:

SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第12张图片

下面是一个测试,我们使用下列配置,告诉 SAP 电商云 Spartacus UI,当客户使用的语言为 zh 即中文时,让电商页面按照从右到左(Right to Left, RTL) 的方式渲染:

SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第13张图片

在 RTL 显示模式下,SAP Logo 和购物车的位置调换了顺序,整个屏幕成了 LTR 模式下显示页面的一个镜像。
SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第14张图片

SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第15张图片

按照 Spartacus 官网文档,从 2.1 版本开始提供对 Directionality 的支持。

SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第16张图片

在 Spartacus 初始化钩子函数 APP_INITIALIZER 里,存在一段包裹在 IF 语句中的代码,逻辑和之前介绍 ABAP 业务开关时提到的伪代码很像。

这段代码的语义是,如果当前 Spartacus Feature Level 大于等于 2.1,则执行 Directionality 相关的逻辑处理。
SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第17张图片

因此,如果出于某种原因,需要在 2.1 之后的版本中,暂时停用 Directionality, 除了修改对应的语言配置外,最快捷的做法就是,将当前 Spartacus 应用的 Feature Level,降至 2.1 之前的版本,比如 2.0:

SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第18张图片

如此一来,虽然我在第 116 行的设置里,让 Spartacus 在客户使用中文登录时,以 RTL 模式显示,但是第 110 行的 Feature Level 设置具有更高的优先级。

这个例子里,因为当前 Feature Level 并没有达到启用 Directionality 所需的最低要求,所以最后我使用中文登录时,Spartacus 仍然采用默认的 LTR 模式显示:
SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第19张图片

SAP 电商云 Spartacus UI 的 Feature Level 除了能控制应用程序的执行逻辑外,也能像前文介绍的 ABAP 业务开关一样,动态控制 UI 元素的显示与否,而且使用方式更加简洁易懂。

看个具体的例子。下图是 SAP 电商云 Spartacus UI 购物车界面,点击红色的 Proceed To Checkout 按钮可以跳转到结帐页面。

SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第20张图片

点击 Proceed To Checkout 按钮之后,我们会向 SAP Commerce Cloud 后台发起一个 Cart Validation 的 API 调用,对当前购物车的内容进行校验。我们最初的实现,并未将该按钮禁用,因此如果用户短时间内迅速点击该按钮,每点击一次都会触发一次 API 调用:

SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第21张图片

于是,在版本 4.2 里,我们用自开发的按钮控件,Progress Button, 替换了之前版本里使用的普通 Button.

两种按钮在没有被用户点击之前,外观没有任何区别,然而点击之后,Progress Button 会出现一个旋转的动画效果,让客户无法重复点击。

这种 Progress Button 被点击之后,外观如下:

SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第22张图片

两种按钮在最终渲染出的 HTML 页面里源代码差异比较如下:

SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第23张图片

在购物车页面里,我们使用自定义指令 cxFeatureLevel,实现了两种按钮的条件显示逻辑:如果 Feature Level 小于 4.2,显示普通 Button;否则显示 Progress Button:

SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第24张图片

自定义指令 cxFeatureLevel 的实现原理为,当指令传入的 Feature Level 同当前应用配置的 Feature Level 相匹配时,调用 Angular ViewContainerRef 动态创建视图的方法 createEmbeddedView,将施加了该指令的 DOM 元素绘制出来。

SAP ABAP 业务开关和 SAP 电商云的 Feature Level_第25张图片

总结

ABAP 业务开关和 SAP 电商云 Spartacus UI 的 Feature Level,二者实现原理各不相同,但都能够给客户提供一定的自由度,让其灵活控制某些业务功能的启用和关闭。

Jerry 的 SAP 电商云 Spartacus UI 开发合集

更多Jerry的原创文章,尽在:"汪子熙":

你可能感兴趣的:(SAP ABAP 业务开关和 SAP 电商云的 Feature Level)