被 AT ... END AT 等 AT 语法搞懵了?试试这个 LOOP AT Groups 语法

在本篇文章中,您将了解到在 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 中使用,以生成汇总数据。

  1. AT FIRST
  • 在表的第一条记录上执行
  • 可用于编写报告标题
  1. AT NEW <field>
  • AT NEW 后提到的字段之前的字段组合发生变化时执行
  • 可用于初始化选定组合的汇总数据
  1. AT END OF <field>
  • 在字段组合的最后一个条目至 AT END OF 后提到的字段时执行
  • 可用于将汇总数据写入内表或屏幕/或者调用 BAPI
  1. AT LAST
  • 在表格的最后一条记录上执行
  • 清除/释放数据表

控制功能按下表进入 AT... ENDAT 块。

在这里插入图片描述
例如,使用 AT 语句按 CARRIDCONNIDFLDATE 组合打印行李总重量的总和如下。

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 子句的字段(carridconnidfldate)和与此组合匹配的表项。要对此进行循环,需要使用 LOOP AT GROUP

变体

  1. 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

请注意,我们使用了显式引用来获取数据。输出结果如下。

在这里插入图片描述

  1. MEMBERSSIZEINDEX 的用法

在这里,您可以获得组的索引和组的大小(即组中成员的数量)。注意指定的排序顺序。默认为 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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值