首页 > 其他分享 >被 AT ... END AT 等 AT 语法搞懵了?试试这个 LOOP AT Groups 语法

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

时间:2024-11-07 14:15:54浏览次数:3  
标签:WRITE ... GROUP gr 语法 LOOP END booking carrid

在本篇文章中,您将了解到在 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.

标签:WRITE,...,GROUP,gr,语法,LOOP,END,booking,carrid
From: https://blog.csdn.net/SAP_yu/article/details/143592886

相关文章

  • 不要再使用 READ TABLE 了,教你如何使用新语法读取内表
    在本文章中,您将了解ABAP7.40版中引入的新读取语法。该语法早在2013年就已引入,因此已不再新鲜。但是,如果您仍在使用READTABLE关键字来读取表项,那么这篇文章绝对适合您。请看下面的示例。请注意,下面的代码是在读取语句之前编写的。DATA:it_flightsTYPESTANDARD......
  • DICOM标准:重要概念——多种传输语法、私有数据元素标签、唯一标识符(UID)等详解
    1私有数据元素标  1.1 私有数据元素标签(PrivateDataElementTags)        在DICOM标准中,多个实现者可能会定义带有相同(奇数)组号码的私有数据元素标签。为了避免冲突,私有元素根据以下规则分配私有数据元素标签:  a)私有创作者数据元素的分配 编号为(gggg......
  • mysql学习必备四大语法 增 删 改 查
    SQL(结构化查询语言)是用于管理关系型数据库的标准语言。增、删、改、查是对数据库表中数据进行基本操作的四种主要功能,通常称为CRUD(Create,Read,Update,Delete)。以下是这四个操作的详细讲解和示例1.增(Create)功能:简单来说插入数据库表中新记录SQL语法:表名:你想要插入数......
  • 【日常记录】解包android vendor_boot.img和vendor_boot-debug.img
    查看文件类型:$filevendor_boot.imgvendor_boot.img:data$filevendor_boot-debug.imgvendor_boot-debug.img:dataunpack_bootimg用法:$./unpack_bootimg-husage:unpack_bootimg[-h]--boot_imgBOOT_IMG[--outOUT][--format{info,mkbootimg}][-0]Unpacks......
  • 从 vue 源码看问题 — vue 中的 render helper 是什么?
    前言前面的文章中提到组件更新时,需要先执行编译器生成的渲染函数得到组件的vnode,而渲染函数生成vnode则是通过其中的_c、_l、、_v、_s等方法实现的.比如:普通节点被编译成了可执行_c函数v-for节点被编译成了可执行的_l函数…那么下面就一起来了解一下,什么......
  • es6,for....of是异步的嘛? 如何实现循环中异步实现
    for...of循环本身不是异步的,它是同步执行的。这意味着for...of循环会按顺序依次执行每一项,直到循环结束。如果循环中的操作是异步的(例如,async函数或者Promise),则这些异步操作会并发执行,但for...of本身不会等待这些操作完成,除非你显式地处理它们。让我们通过一个例子来说明......
  • MarkDown语法
    MarkDown语法标题:一级标题二级标题三级标题四级标题,最多到六级标题加粗斜体加粗斜体废弃引用Maxwell分割线图片超链接http://www.baidu.com2024-11-0623:20:49列表ABC表格名字性别生日张三男1997-1-1代码select*fromdict_item;......
  • SQL语法基础知识总结
    SQL(StructuredQueryLanguage)即结构化查询语言,是用于管理关系型数据库的标准语言。掌握SQL语法是操作数据库的关键,以下是SQL语法基础知识的详细总结。一、数据定义语言(DDL-DataDefinitionLanguage)1.创建数据库(CREATEDATABASE)用于创建一个新的数据库。例如,创建一......
  • 【Java SE语法】抽象类(abstract class)和接口(interface)有什么异同?
    目录1.抽象类与接口的基本概念1.1 抽象类1.2接口2.抽象类与接口的异同2.1相同点2.2不同点3.拓展知识:多态与设计模式3.1多态3.2设计模式4.结论        在软件工程中,设计模式和代码结构的选择对于构建可维护、可扩展的系统至关重要。抽象类(Abstrac......
  • ArkTS 基础语法全解析
    在移动应用开发的世界里,ArkTS作为华为为HarmonyOS应用开发推出的编程语言,正逐渐展现出其强大的实力和独特的魅力。本文将深入探讨ArkTS的基础语法,帮助开发者快速上手并掌握这门语言。一、引言随着智能设备的普及和技术的不断进步,移动应用开发的需求也日益增长。HarmonyO......