2019.12.05【ABAP随笔】 分组循环(LOOP AT Group) / REDUCE
ABAP 7.40新语法 LOOP AT Group 和 REDUCE
*LOOP AT itab result [cond] GROUP BY key ( key1 = dobj1 key2 = dobj2 …
* [gs = GROUP SIZE] [gi = GROUP INDEX] )
* [ASCENDING|DESCENDING [AS TEXT]]
* [WITHOUT MEMBERS]
* [{INTO group}|{ASSIGNING <group>}]
* …
* [LOOP AT GROUP group|<group>
* …
* ENDLOOP.]
* …
*ENDLOOP.
*
*… REDUCE type(
*INIT result = start_value
* …
*FOR for_exp1
*FOR for_exp2
*…
*NEXT …
* result = iterated_value
*… ) "首先创建一个内表
TYPES:BEGIN OF ty_data,
id TYPE i, "人员ID
name TYPE char10, "人员名称
country TYPE char10, "国家
language TYPE char2, "语言
age TYPE i,
END OF ty_data,
ty_t_data TYPE STANDARD TABLE OF ty_data WITH EMPTY KEY. "数据
DATA(gt_data) = VALUE ty_t_data(
( id = name = 'Jerry' country = 'China' language = 'ZH' age = )
( id = name = 'Jack' country = 'China' language = 'ZH' age = )
( id = name = 'Nick' country = 'Korea' language = 'EN' age = )
( id = name = 'Rossi' country = 'Korea' language = 'EN' age = )
( id = name = 'Randy' country = 'Korea' language = 'EN' age = )
( id = name = 'Tab' country = 'China' language = 'ZH' age = )
( id = name = 'Lily' country = 'Korea' language = 'EN' age = )
( id = name = 'Lucy' country = 'China' language = 'EN' age = )
( id = name = 'Zera' country = 'China' language = 'EN' age = )
( id = name = 'Grace' country = 'China' language = 'EN' age = )
)
. "REDUCE
"1计算年龄最大
DATA(lv_age_max_zh) = REDUCE i( INIT x = FOR lw_data IN gt_data
WHERE ( language = 'ZH' ) NEXT x = nmax( val1 = x
val2 = lw_data-age )
) .
WRITE:/ |说中文的人中年龄最大的是:{ lv_age_max_zh } |. "2.输出的reduce
TYPES:outref TYPE REF TO if_demo_output.
DATA(output) = REDUCE outref( INIT out = cl_demo_output=>new( )
text = 'Count up:'
FOR n = UNTIL n >
NEXT out = out->write( text )
text = | { n } | ).
output->display( ). "分组循环
"1.ls_data这个工作区里面是没有内容的
"2.<group>里面只有size index 和分组参数
LOOP AT gt_data INTO DATA(ls_data) GROUP BY ( country = ls_data-country language = ls_data-language
size = GROUP SIZE index = GROUP INDEX ) ASCENDING ASSIGNING FIELD-SYMBOL(<group>). WRITE:/ |Group:{ <group>-index } Country :{ <group>-country } language : { <group>-language }| &
| Number lines :{ <group>-size } |. "3.按照<group>中的分组参数循环 GT_data中的数据
LOOP AT GROUP <group> ASSIGNING FIELD-SYMBOL(<ls_member>). WRITE:/ | Name:{ <ls_member>-name } |. ENDLOOP. DATA(lv_age_max) = REDUCE i( INIT max = FOR lw_member IN GROUP <group>
NEXT max = nmax( val1 = max val2 = lw_member-age ) ). DATA(lv_age_min) = REDUCE i( INIT min = FOR lw_member IN GROUP <group>
NEXT min = nmin( val1 = min val2 = lw_member-age ) ). DATA(lv_age_sum) = REDUCE i( INIT sum = FOR lw_member IN GROUP <group>
NEXT sum = sum + lw_member-age ).
DATA(lv_age_avg) = lv_age_sum / <group>-size. WRITE:/ | 该组最大年龄,最小年龄和平均年龄分别为:{ lv_age_max } { lv_age_min } { lv_age_avg } |.
ENDLOOP.
结果为:
个人感觉LOOP AT GROUP 和 REDUCE可以很好的代替 LOOP 中使用 AT END OF field 和 AT NEW field ( 这个是需要调整内表结构字段顺序的)。
平时用在分组求和,分组操作的时候还是很好用的。
-TAB 热爱技术 享受生活
2019.12.05【ABAP随笔】 分组循环(LOOP AT Group) / REDUCE的更多相关文章
- 2019.06.05 ABAP EXCEL 操作类代码 OLE方式(模板下载,excel上传,内表下载)
一般使用标准的excel导入方法9999行,修改了标准的excel导入FM 整合出类:excel的 模板下载,excel上传,ALV内表下载功能. 在项目一开始可以SE24创建一个类来供整体开发使用, ...
- 【2019年05月20日】A股滚动市盈率PE历史新低排名
2010年01月01日 到 2019年05月20日 之间,滚动市盈率历史新低排名. 上市三年以上的公司, 2019年05月20日市盈率在300以下的公司. 1 - 阳光照明(SH600261) - 历 ...
- Atitit 循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate).
Atitit 循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate). 1.1. 循环算是最基础的概念, 凡是重复执行一段代码, 都可以称之为循环. ...
- 循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate)的区别
表示“重复”这个含义的词有很多, 比如循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate). 循环算是最基础的概念, 凡是重复执行一段代码, 都可以称 ...
- app后端设计(11)-- 系统架构(2014.12.05更新)
个人认为,在小型的创业团队中,特别是以应用产品为主,在架构后台的时候,需要集中精力解决自身业务上的问题,不是花时间解决第三方已经解决的问题,简单点来说,就是能用第三方服务就使用第三方的服务.基于这个原 ...
- app后端设计(3)--短信,邮件,推送服务(2014.12.05更新)
在app的后端设计中,免不了消息的推送,短信,邮件等服务,下面就个人的开发经验谈谈这方面. (1)最重要的是,各种推送一定要放在队列系统中处理,不然会严重影响api的响应时间. (2)短信方面 以前我 ...
- 003_循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate)的区别
表示“重复”这个含义的词有很多, 比如循环(loop), 递归(recursion), 遍历(traversal), 迭代(iterate). 循环算是最基础的概念, 凡是重复执行一段代码, 都可以称 ...
- NOI2019退役记 upd:2019.12.1
(我把原来写的东西全部删掉了) AFO. 我退役了,\(\mbox{yyb}\)退役了. 至少,在接下来的日子里,我得投身到文化课,度过快乐的高三生活了. 这两年的\(OI\)生涯给了我很多,让我学会 ...
- 2019.07.05 纪中_B
今日膜拜:czj大佬orz%%% 2019.07.05[NOIP提高组]模拟 B 组 今天做题的时候大概能判断出题人的考点,可是就是没学过...特别痛苦 T0:栈的定义,模拟就好了T1:感觉像是找规律 ...
随机推荐
- postman 接口测试(一)
一.postman 应用场景 开发接口快速的调用接口,以便调试 方便的调用接口,通过不同的参数去测试接口的输出 这些接口调用时需要保存下来的反复运行的 在运行中如果有断言(检查点 <预期 和现实 ...
- Rectangle Puzzle CodeForces - 281C (几何)
You are given two rectangles on a plane. The centers of both rectangles are located in the origin of ...
- Web Api(3)
Web API中的路由. 路由机制会把一个请求的URL映射到一个Controller上面的Action.这一点很关键.也就说你发送一个Http请求,MVC框架会解析这个请求的URL,之后尝试把它去映射 ...
- 第六章 组件 67 使用ref获取DOM元素和组件引用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- linux LVM逻辑卷管理
什么是LVM LVM是逻辑卷管理(Logical Volume Manager)的简称,它是建立在物理存储设备之上的一个抽象层,允许你生成逻辑存储卷,与直接使用物理存储在管理上相比,提供了更好灵活性. ...
- ESP8266烧录选项中的QIO 和 DIO解释
https://blog.csdn.net/recclay/article/details/78956580 看到的由烧录引起的QIO和DIO问题探索.. 所以一般选择DIO QIO -> Qu ...
- Luogu P4331 [BOI2004]Sequence 数字序列 (左偏树论文题)
清晰明了%%% Fairycastle的博客 个人习惯把size什么的存在左偏树结点内,这样在外面好写,在里面就是模板(只用修改update). 可以对比一下代码(好像也差不多-) MY CODE # ...
- Newnode's NOI(P?)模拟赛 第二题 dp决策单调优化
其实直接暴力O(n3)DP+O2O(n^3)DP+O_2O(n3)DP+O2优化能过- CODE O(n3)O(n^3)O(n3) 先来个O(n3)O(n^3)O(n3)暴力DP(开了O2O_2O2 ...
- MySQL错误:ERROR 1067 (42000): Invalid default value for 'timestamp_field'
数据库报错 ERROR 1067 (42000): Invalid default value for 'start_time' 是因为数据库的配置有问题: 可以看到 NO_ZERO_IN_DA ...
- win10本机安装rabbitMQ
在win10环境下安装RabbitMQ的步骤 第一步:下载并安装erlang 原因:RabbitMQ服务端代码是使用并发式语言Erlang编写的,安装Rabbit MQ的前提是安装Erlang. 下载 ...