TYPES: begin of ty_tab , num(3) type i, str(3) type c, end of ty_tab. data: gw_tab TYPE ty_tab , gt_tab TYPE TABLE OF ty_tab WITH HEADER LINE. data: gt_out TYPE TABLE OF ty_tab, gw_out TYPE ty_tab. gw_tab-num = 100. gw_tab-str = 'AAA'. append gw_tab to gt_tab. gw_tab-num = 100. gw_tab-str = 'BBB'. append gw_tab to gt_tab. gw_tab-num = 200. gw_tab-str = 'AAA'. append gw_tab to gt_tab. gw_tab-num = 200. gw_tab-str = 'BBB'. append gw_tab to gt_tab. gw_tab-num = 200. gw_tab-str = 'CCC'. append gw_tab to gt_tab. CLEAR gw_tab. sort gt_tab by num. loop at gt_tab . MOVE gt_tab to gw_tab."这个转移很重要 at END OF num. gw_out-num = gw_tab-num. gw_out-str = gw_tab-str. APPEND gw_out to gt_out. endat. CLEAR gw_tab. endloop. LOOP AT gt_out into gw_out. write:/ gw_out-num,gw_out-str. ENDLOOP.
使用AT END OF语句,主要是抓取重复字段如num为100的最后一条记录 100 BBB。
本实例定义的structure中 ,字段num在字段str前,这样在使用AT END OF语句后,内表中str会变为***。
在loop循环之前 内表gt_tab中的数据为:
100 AAA
100 BBB
200 AAA
200 BBB
200 CCC
第一次循环,内表gt_tab中的数据为 100 AAA 在执行AT END OF语句后,内表gt_tab中的数据为 100 AAA
第二次循环,内表gt_tab中的数据为 100 BBB 在执行AT END OF语句中,内表gt_tab中的数据为 100 ***,在执行AT END OF语句后,内表gt_tab中的数据为 100 BBB
第三次循环,内表gt_tab中的数据为 200 AAA 在执行AT END OF语句后,内表gt_tab中的数据为 200 AAA
第四次循环,内表gt_tab中的数据为 200 BBB 在执行AT END OF语句后,内表gt_tab中的数据为 200 BBB
第五次循环,内表gt_tab中的数据为 200 CCC 在执行AT END OF语句中,内表gt_tab中的数据为 200 ***,在执行AT END OF语句后,内表gt_tab中的数据为 200 CCC
为了得到我们想要的重复数据的最后一条,需要将内表的数据在执行AT END OF语句前,转移到另一个工作区gw_tab中保存,否则想要的数据中str均为***。
最后得到的数据为:
100 BBB
200 CCC
另外,同理 AT NEW 语句的使用 ,也是如此,本实例将AT END OF num,改为AT NEW num后,最后的结果为:
100 AAA
200 AAA
转自:https://www.cnblogs.com/Sapbruce/p/4155764.html