如何在ABAP CDS 7.40中模拟LEFT和RIGHT函数?ECC适配方案
在SAP ECC系统CDS视图中替代CASE语句内LEFT/RIGHT函数的方案
ECC系统搭载的ABAP CDS版本(多基于ABAP 7.40及以下)不支持在CASE表达式的分支里直接调用LEFT、RIGHT这类字符串函数,而S/4HANA对应的高版本CDS(如ABAP 7.52+)没有这个语法限制,这就是你遇到差异的原因。下面是两种可行的替代方案:
方案1:预计算LEFT/RIGHT结果再在CASE中引用
先把需要用LEFT/RIGHT处理的字段提前计算成中间字段,之后在CASE语句里直接调用这些中间字段即可,这种方式可读性更高,适合多分支复用同一段截取逻辑的场景。
示例代码:
@AbapCatalog.sqlViewName: 'ZTEST_VIEW' @AbapCatalog.compiler.compareFilter: true @AccessControl.authorizationCheck: #CHECK @EndUserText.label: '测试视图' define view ZTEST_VIEW as select from ekko { // 提前计算截取结果作为中间字段 left(ebeln, 4) as ebeln_left4, right(ebeln, 4) as ebeln_right4, // CASE语句直接引用预计算字段 case when ebeln_left4 = '4500' then '采购订单类型A' when ebeln_right4 = '0001' then '采购订单类型B' else '其他类型' end as po_type, // 保留原业务字段 ebeln, bukrs, ekorg }
方案2:用substring函数替代LEFT/RIGHT
ECC的CDS原生支持substring函数,可以用它来实现LEFT和RIGHT的等价逻辑,而且能直接在CASE语句中使用:
LEFT(str, n)等价于substring(str, 1, n)RIGHT(str, n)等价于substring(str, length(str) - n + 1, n)
示例代码:
@AbapCatalog.sqlViewName: 'ZTEST_VIEW' @AbapCatalog.compiler.compareFilter: true @AccessControl.authorizationCheck: #CHECK @EndUserText.label: '测试视图' define view ZTEST_VIEW as select from ekko { case when substring(ebeln, 1, 4) = '4500' then '采购订单类型A' when substring(ebeln, length(ebeln) - 4 + 1, 4) = '0001' then '采购订单类型B' else '其他类型' end as po_type, // 保留原业务字段 ebeln, bukrs, ekorg }
注意事项
如果用substring做RIGHT的等价逻辑时,要确保目标字段不为空,避免出现负数起始位置导致报错,空值场景可以结合coalesce函数处理,比如coalesce(length(str), 0)。
内容的提问来源于stack exchange,提问作者user3406679
相关产品推荐
相关产品推荐

