ABAP 各种按组分类求和方法比对

2022-11-28 21:07:40 浏览数 (1)

开启掘金成长之旅!这是我参与「掘金日新计划 · 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 一样,灵活. 第二种 ,简单,粗暴.

今天的不开心到此为止吧,明天依旧光芒万丈. 这里是百里,一个努力的学习者.

0 人点赞