如何通过Range删除ITAB行?能否实现无循环操作?
问题解答
1. 无需循环直接删除符合Range条件的行
完全可以直接用DELETE语句结合IN range[]实现,核心是在WHERE条件里正确引用CASTING后的结构字段:
- 如果
DATA_STRING是内表定义时通过CASTING属性绑定到预定义结构(比如DATA: BEGIN OF itab_line, data_string TYPE c LENGTH 20 CASTING TYPE ty_my_struct, END OF itab_line, itab TYPE TABLE OF itab_line.),可以直接写:DELETE itab WHERE data_string-number IN range[]. - 如果是运行时动态CASTING(比如通过字段符号关联),需要在WHERE条件中显式指定CASTING类型:
DELETE itab WHERE (data_string CASTING TYPE ty_my_struct)-number IN range[].
注意:必须保证
DATA_STRING的长度与预定义结构ty_my_struct的长度完全匹配,否则会触发运行时错误。
2. 无需循环提取DATA_STRING字段到ITAB2
同样可以实现,根据ABAP版本不同有两种简洁方式:
ABAP 7.40及以上版本(推荐)
用CORRESPONDING做批量映射转换,假设ITAB2是预定义结构ty_my_struct的内表类型:
itab2 = CORRESPONDING #( itab MAPPING * = data_string CASTING TYPE ty_my_struct ).
如果DATA_STRING已通过内表定义关联CASTING结构,可简化为:
itab2 = CORRESPONDING #( itab MAPPING * = data_string ).
低版本无循环替代方案
可以用INSERT结合字段传输,但需确保结构匹配:
INSERT lines OF itab INTO TABLE itab2 TRANSPORTING (data_string CASTING TYPE ty_my_struct).
不过这种写法兼容性不如CORRESPONDING,优先推荐高版本语法。
内容的提问来源于stack exchange,提问作者isekaid_maou
相关产品推荐
相关产品推荐

