做过规模稍大的 SAP S/4HANA 项目之后,很容易遇到一种让人相当熟悉的场景。
销售领域有一套金额字段,采购领域也有一套金额字段,财务领域又有一套金额字段。它们看起来都差不多,通常会包含金额、币种、数量、单位、日期、状态,甚至还会带上一组用于计算净额、税额、折扣额或者业务分类的表达式。
问题并不在于这些字段写起来有多困难,而在于这些定义会逐渐散落到大量 CDS View Entity、Projection View 以及其他数据模型里。
某一天,领域团队发现某个计算公式应该调整。销售模型改了,采购模型没有改。另一个团队修改了字段的元数据,但分析模型仍然沿用旧定义。再往后看,同一个业务概念在不同服务里的语义慢慢产生偏差。
这类问题靠代码复制无法真正解决。
SAP 在较新的 ABAP CDS 数据建模体系里引入 CDS Aspects,恰好就是冲着这个问题来的。
SAP 官方对 CDS Aspect 的定位非常明确,它借鉴了 Aspect-Oriented Programming,也就是面向切面编程中的模块化思想。这里并不是把传统 AOP 的 Join Point、Advice、Weaving 整套机制搬进 ABAP CDS,而是借用了其中一个很有价值的思想,把原本散落在多个对象里的横向能力抽离出来,形成可以独立定义、独立演进、被多个实体复用的数据模型组件。
在 SAP 当前的定义里,一个 CDS Aspect 可以保存字段定义、计算逻辑以及与这些元素相关的元数据。定义完成后,同一个 Aspect 可以被不同 CDS Entity 使用,从而让多个业务场景共享同一份定义。SAP 把这个目标描述为 Single Source of Truth,也就是让某个领