ABAP CDS view entity使用IS_NULL报错:不允许在布尔表达式上下文使用
报错原因
ABAP CDS View Entity 语法规则限制,不允许直接在WHERE子句中对左外连接的关联表字段使用IS NULL表达式,需要改写为语法兼容的判断逻辑。
解决方案
方案1:替换为IS INITIAL表达式
如果你的ABAP平台版本支持CDS View Entity的IS INITIAL语法,直接替换IS NULL即可生效,修改后代码如下:
define view entity ZI_EntityExample as select from aufk join afko as orderheader on orderheader.aufnr = aufk.aufnr left outer join jest as status on status.objnr = aufk.objnr and status.stat = 'I0009' { key aufk.aufnr as OrderId, aufk.objnr as ObjectId } where status.stat is initial
方案2:使用COALESCE函数改写(兼容低版本ABAP平台)
COALESCE函数会返回入参中第一个非空值,我们可以为空值设置默认的无效标记,判断等于该标记即可实现IS NULL的等效逻辑:
define view entity ZI_EntityExample as select from aufk join afko as orderheader on orderheader.aufnr = aufk.aufnr left outer join jest as status on status.objnr = aufk.objnr and status.stat = 'I0009' { key aufk.aufnr as OrderId, aufk.objnr as ObjectId } where COALESCE(status.stat, '') = ''
说明:status.stat为状态字段,正常有效值不会为空字符串,因此判断等于空字符串与原IS NULL逻辑完全等效。
方案3:使用NOT EXISTS子查询(性能最优)
如果仅需要筛选关联表无匹配的记录,使用NOT EXISTS子查询不需要额外做左连接,执行效率更高,同时也可以规避IS NULL语法限制,代码示例如下:
define view entity ZI_EntityExample as select from aufk join afko as orderheader on orderheader.aufnr = aufk.aufnr { key aufk.aufnr as OrderId, aufk.objnr as ObjectId } where NOT EXISTS ( SELECT * FROM jest WHERE jest.objnr = aufk.objnr AND jest.stat = 'I0009' )
内容的提问来源于stack exchange,提问作者SAPDEV
相关产品推荐
相关产品推荐

