在本篇文章中,您将了解到在 7.40 中引入的 LOOP AT… GROUP BY 语句。该语句可以代替 AT NEW... END AT
语句。
您可以参阅 SCN wiki Control Level Statements in ABAP - ABAP Development - Community Wiki (sap.com) 了解 AT... END AT
控制层语句。
简而言之,有 4 条 AT
语句可以在 LOOP
中使用,以生成汇总数据。
AT FIRST
- 在表的第一条记录上执行
- 可用于编写报告标题
AT NEW <field>
- 在
AT NEW
后提到的字段之前的字段组合发生变化时执行 - 可用于初始化选定组合的汇总数据
AT END OF <field>
- 在字段组合的最后一个条目至
AT END OF
后提到的字段时执行 - 可用于将汇总数据写入内表或屏幕/或者调用 BAPI
AT LAST
- 在表格的最后一条记录上执行
- 清除/释放数据表
控制功能按下表进入 AT... ENDAT
块。
例如,使用 AT
语句按 CARRID
、CONNID
、FLDATE
组合打印行李总重量的总和如下。
LOOP AT bookings INTO DATA(booking).
AT FIRST.
WRITE: 'Carrier', 9 'Connection', 21 'Flight Date'.
ULINE.
ENDAT.
AT NEW fldate.
CLEAR total_weight.
WRITE: / booking-carrid, 9 booking-connid,
21 booking-fldate.
WRITE: 35 'Customer Id', 50 'Luggage Weight'.
ENDAT.
WRITE: /35 booking-customid, 50 booking-luggweight.
total_weight = total_weight + booking-luggweight.
AT END OF fldate.
WRITE: /35 'Total Weight : ', 50 total_weight.
ULINE.
ENDAT.
ENDLOOP.
输出结果如下:
在 ABAP 7.4 中,使用 LOOP AT ... GROUP BY
可以实现相同的输出。
WRITE: 'Carrier', 9 'Connection', 21 'Flight Date'.
ULINE.
LOOP AT bookings INTO DATA(booking_gr)
GROUP BY ( carrid = booking_gr-carrid
connid = booking_gr-connid
fldate = booking_gr-fldate ).
WRITE: / booking_gr-carrid, 9 booking_gr-connid,
21 booking_gr-fldate.
WRITE: 35 'Customer Id', 50 'Luggage Weight'.
CLEAR total_weight.
LOOP AT GROUP booking_gr
ASSIGNING FIELD-SYMBOL(<booking>).
WRITE: /35 <booking>-customid, 50 <booking>-luggweight.
total_weight = total_weight + <booking>-luggweight.
ENDLOOP.
WRITE: /35 'Total Weight : ', 50 total_weight.
ULINE.
ENDLOOP.
为了简单起见,让我们看看没有写入语句的代码。
LOOP AT bookings INTO DATA(booking_gr)
GROUP BY ( carrid = booking_gr-carrid
connid = booking_gr-connid
fldate = booking_gr-fldate ).
CLEAR total_weight.
LOOP AT GROUP booking_gr ASSIGNING FIELD-SYMBOL(<booking>).
total_weight = total_weight + <booking>-luggweight.
ENDLOOP.
ENDLOOP
这样就创建了一个深层结构 booking_gr,其中包含来 group by
子句的字段(carrid
、connid
、fldate
)和与此组合匹配的表项。要对此进行循环,需要使用 LOOP AT GROUP
。
变体
WITHOUT MEMBERS
(无成员)–获取唯一值,无需循环查看组内成员。
LOOP AT bookings INTO DATA(booking_gr)
GROUP BY ( carrid = booking_gr-carrid )
WITHOUT MEMBERS
REFERENCE INTO DATA(booking_gr_2).
WRITE: / booking_gr_2->carrid.
ENDLOOP
请注意,我们使用了显式引用来获取数据。输出结果如下。
MEMBERS
、SIZE
和INDEX
的用法
在这里,您可以获得组的索引和组的大小(即组中成员的数量)。注意指定的排序顺序。默认为 ASCENDING
。
LOOP AT bookings INTO DATA(booking_gr)
GROUP BY ( carrid = booking_gr-carrid
size = GROUP SIZE
index = GROUP INDEX )
ASCENDING
REFERENCE INTO DATA(booking_gr_2).
WRITE: / booking_gr_2->index LEFT-JUSTIFIED,
booking_gr_2->carrid,
booking_gr_2->size.
ENDLOOP.
输出:
因此,通过使用 LOOP AT... GROUP BY
可以省去 AT
语句,使代码更加简洁。与 AT
不同的是,组合中使用的字段不需要在表结构中排在第一位。
例如,下图也行得通。
LOOP AT bookings INTO DATA(booking_gr)
GROUP BY ( customid = booking_gr-customid
size = GROUP SIZE
index = GROUP INDEX )
REFERENCE INTO DATA(booking_gr_2).
WRITE: / booking_gr_2->customid, booking_gr_2->size.
ENDLOOP.
标签:WRITE,...,GROUP,gr,语法,LOOP,END,booking,carrid
From: https://blog.csdn.net/SAP_yu/article/details/143592886