在一个典型的SAP S/4HANA数据模型里,我们经常会碰到这样一类计算。某个字段并不是数据库表中直接保存的值,而是需要根据若干输入字段执行一段比较复杂的算法才能得到结果。这个算法可能涉及字符串处理、日期计算、数值判断、条件组合,甚至需要使用SAP HANA SQLScript才能比较自然地表达。
如果只是一个地方需要这样的逻辑,把表达式直接写进CDS view entity里通常没有问题。但当同一套算法陆续出现在销售订单、交货单、采购订单、分析视图以及ABAP SQL SELECT中时,问题就开始出现了。
相同的算法被复制到多个CDS对象里,各处代码略有差异,后续修改规则时需要同时修改很多对象。更麻烦的是,有些逻辑根本无法优雅地用普通CDS表达式描述,如果硬塞进CASE、CAST、字符串函数和算术表达式里,最终得到的模型会变得相当难读。
SQL-Based Scalar Functions正是为这一类问题准备的。
它允许我们在ABAP CDS层定义一个自己的标量函数,把真正的算法交给SAP HANA数据库上的SQLScript实现,再像调用普通内置函数一样,在CDS view entity和ABAP SQL中复用这段逻辑。
从开发者视角来看,它很像我们自己给CDS