开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
Hello ,这里是百里,一个学习中的abaper,在此记录下,在开发中遇到的问题,bug,知识积累等内容. 今天我们要研究的是,ABAP中的求和方法.
序
在ABAP开发中,求和计算是必不可少的必要操作,在ecc版本及HANA版本中均提供了多种求和的方式,在实际工作中也会下意识的用到不同的求和方式,那么有几种,那种比较好,就成了需要讨论的问题.
传统sql方式
在OPENSQL 中 存在像传统sql的求和分组函数使用方式,这种方式也是百里经常使用的,因为语法和sql相似,不用考虑过多内容.而且用inner join 关联取数内表也可以快速关联数据.
语法
代码语言:javascript复制select 字段1, 字段2, sum(求和字段) from 表 where 条件 group by 字段1,字段2 into table 内表
实例
代码语言:javascript复制*&--------------------------------
tables:ZNAMETABLE2 .
data: gt_data TYPE TABLE of ZNAMETABLE2 .
data: gs_data TYPE ZNAMETABLE2 .
data : num1 TYPE i .
TYPES : BEGIN OF ty_data ,
name TYPE char10 ,
sex TYPE char10 ,
age TYPE i ,
END OF ty_data .
data : lt_data TYPE TABLE OF ty_data .
data : lt_data1 TYPE TABLE OF ty_data .
data : ls_Data TYPE ty_data .
select name , sex ,cast( age as QUAN ) into table @lt_data from ZNAMETABLE2 .
select sex ,sum( age ) as age1 from @lt_data as a GROUP BY sex into table @data(lt_oudata) .
data: ls_outdata LIKE line of lt_oudata .
LOOP AT lt_oudata into ls_outdata .
WRITE : ls_outdata-sex .
WRITE : ls_outdata-age1.
ENDLOOP.
使用此种方式,不仅可以使用透明表数据,同时也可以内表当做取数表,进行二次'加工',需要注意的是,本种方式存在弊端,即关联条件最好准确,取数源最好不要重复.
二: 求和 collect
collect函数是将 ,非数字字段内容相同的归类,将数字字段进行汇总。此种方式是abap中经常使用的求和方式,对于字段少,主键明确的内容,使用此种方式,可以速获取对应字段的求和内容.简单理解是:如果非数据字段值相等,那么数值字段值相加.
语法
代码语言:javascript复制 LOOP AT t_data.
COLLECT t_data INTO t_test.
ENDLOOP .
实例
代码语言:javascript复制 LOOP AT t_data.
IF t_data-v1 = 2 OR t_data-v1 = 4 OR t_data-v1 = 5.
COLLECT t_data INTO t_test. "按关键列统计值
ELSE.
DELETE t_data.
ENDIF.
ENDLOOP .
使用此种方式时要注意,求和的字段必须存在数字类型, 必须 COLLECT 命令的所有非关键字段均为数字(类型 I、P 或F)时才可在表中使用该命令。 即数据类型为 I, P, F .
总结
以上内容为在工作中abap 常用到的求和方式, 其实还有一种为at new of 和at end of 使用,但是不怎么常用. 平时工作中以这两种为主,第一种像传统sql 一样,灵活. 第二种 ,简单,粗暴.
今天的不开心到此为止吧,明天依旧光芒万丈. 这里是百里,一个努力的学习者.