ABAP使用REDUCE校验内表全量行符合条件的实现及语法问题咨询
问题解答
1. 语法报错的技术原因
ABAP的REDUCE语法有明确的作用域限制:UNTIL/WHILE终止条件仅允许访问FOR关键字后定义的迭代局部变量,无法访问INIT块中声明的归约变量(即你的lvr_flag_allowed),归约变量的作用域仅限NEXT块内部,因此将归约变量放入终止条件会直接触发语法错误。
2. 替代方案的正确性判断
你给出的第二段代码逻辑是正确的,返回rv_last_index = 3符合预期:迭代到第三个元素-22时触发条件将索引置0,循环终止,累计值正好是违规行的位置。但该写法属于对迭代索引的非常规利用,可读性极差,不推荐在生产环境使用。
3. 最优兼容实现方案
3.1 布尔值校验(所有元素满足条件即返回真,遇违规立即终止)
该写法兼容ABAP 740及以上版本,完全满足753及更低内核的要求,可读性极强,没有冗余的索引操作:
DATA: lt_itab TYPE TABLE OF i, rv_all_valid TYPE abap_bool. lt_itab = VALUE #( ( 2 ) ( 1 ) ( -1 ) ( 5 ) ). " 示例校验规则:所有元素都大于等于0,遇小于0的元素立即终止 rv_all_valid = REDUCE abap_bool( INIT valid = abap_true FOR wa IN lt_itab WHEN valid = abap_true " 迭代前置判断,一旦valid为假直接终止所有迭代 NEXT valid = xsdbool( wa >= 0 ) ).
核心逻辑利用FOR迭代的WHEN前置条件:每次执行NEXT前先判断WHEN条件,不满足则直接终止整个归约过程,完全符合你要求的提前终止逻辑。
3.2 结构类型归约变量支持
REDUCE完全支持使用自定义结构作为归约变量,你可以同时存储布尔校验结果和违规索引等多维度信息,示例如下:
TYPES: BEGIN OF ty_check_res, all_valid TYPE abap_bool, bad_idx TYPE i, " 存储第一个违规行的索引 END OF ty_check_res. DATA(ls_check_res) = REDUCE ty_check_res( INIT res = VALUE ty_check_res( all_valid = abap_true bad_idx = 0 ) FOR idx = 1 THEN idx + 1 WHEN res-all_valid = abap_true AND idx <= lines( lt_itab ) NEXT res = COND #( WHEN lt_itab[ idx ] < 0 THEN VALUE #( all_valid = abap_false bad_idx = idx ) ELSE res ) ).
内容的提问来源于stack exchange,提问作者dasausTeR
相关产品推荐
相关产品推荐

