如何高效检查无键表中存在非初始lenum字段的行?
内表非初始lenum行检查的现代实现方案
推荐写法
1. FILTER + LINE_EXISTS组合
针对无键内表,直接用LINE_EXISTS带WHERE条件会因无可用键报错,结合FILTER即可解决:
DATA(has_non_initial_lenum) = LINE_EXISTS( FILTER #( quants WHERE lenum IS NOT INITIAL ) ).
FILTER先筛选出所有lenum非初始的行,再通过LINE_EXISTS判断筛选结果是否非空,直接返回布尔值,代码简洁高效。
2. 简化版REDUCE写法
如果偏好REDUCE,可以优化为更紧凑的形式:
DATA(has_non_initial_lenum) = REDUCE abap_bool( INIT res = abap_false FOR <quant> IN quants NEXT res = res OR ( <quant>-lenum IS NOT INITIAL ) ).
遍历过程中只要遇到第一个非初始lenum,后续判断会保留abap_true,无需继续遍历,效率和带EXIT的LOOP一致。
无效原因说明
你之前尝试的LINE_EXISTS直接带WHERE条件失效,是因为该写法要求内表必须有主键或辅助键,而你的内表是SELECT内联声明的无键表,不满足这个前提。
旧式LOOP写法对比
DATA(has_non_initial_lenum) = abap_false. LOOP AT quants INTO DATA(quant). IF quant-lenum IS NOT INITIAL. has_non_initial_lenum = abap_true. EXIT. ENDIF. ENDLOOP.
逻辑直观但代码冗余,仅适用于ABAP 7.40及以下版本。
内容的提问来源于stack exchange,提问作者Kevin Holtkamp
相关产品推荐
相关产品推荐

