ABAP 7.40之后版本新语法

  • 内联声明:

内部直接定义变量,结构,指针,内表。

语法:DATA(....),field-symbol(....)。

SELECT matnr, labst, speme
    FROM mard
    INTO TABLE @DATA(lt_mard)
    FOR ALL ENTRIES IN @it_matnr
    WHERE matnr = @it_matnr-matnr.

***************************************
DATA(lv_char) = '1234059'.

***************************************
READ TABLE lt_itab WITH KEY field1 = 'A' INTO DATA(wa_itab).

*************************************************************

READ TABLE lt_itab WITH KEY field1 = 'A' ASSIGNING FIELD-SYMBOL(<fs_itab>).
  • 构造表达式

实现构造:NWE--创建数据对象或者类的实现:构造单值value,结构structure,内表table,类class。

值构造:VALUE--创建类型为 dypee的数据:构造结构,内表。

组件构造:correspond

" 自定义类型
TYPES: BEGIN OF ty_man,
         name   TYPE char10,    " 姓名
         sex    TYPE char1,       " 性别
         age    TYPE p DECIMALS 2," 年龄
         school TYPE char20,      " 学校
       END OF ty_man.
DATA: gt_man TYPE TABLE OF ty_man.
*&*********结构赋值
DATA(gs_man) = VALUE ty_man( name = 'Tom' sex = 'B' ).
"附加年龄信息
gs_man = VALUE #( name = 'Tom' sex = 'B' age = 18 ).
*DATA(gs_man_02) = VALUE #( name = 'Tom' sex = 'B' age = 18 ) . "错误,未明确类型

"附加学校信息
gs_man = VALUE ty_man( BASE gs_man school = 'A SCHOOL' ).

"调整学校信息
gs_man = VALUE #( BASE gs_man school = 'B SCHOOL' ).

*&*********内表赋值
gt_man = VALUE #( ( name = 'Anna' sex = 'G' age = 17 ) ( name = 'Ann' sex = 'G' age = 16 ) ).

"内表基础上附加额外数据
gt_man = VALUE #( BASE gt_man ( name = 'Xiaohong' sex = 'G' age = 20 school = 'C SCHOOL' )
                              ( name = 'Xiaoming' sex = 'B' age = 21  school = 'D SCHOOL' ) ).

*********Range 表赋值
DATA:   r_data    TYPE RANGE OF mara-matnr. "内表不带表头
RANGES: r_data_01 FOR mara-matnr.           "内表带表头-不支持

"逐步往下填充内表数据
r_data  = VALUE #( sign = 'I' option = 'BT'  ( low = 10 high = 20 )
                                         ( low = 100 high = 150 )
                           option = 'GT'  ( low  = 180 )
                           option = 'LT'  ( low = 200 )
                           option = 'EQ'  ( low = 8 )
                 sign = 'E' option = 'BT'  ( low = 15 high = 18 ) ).
select single * from mara into @data(ls_mara).
DATA: ls_mara2 TYPE mara,
      ls_mara3 TYPE mara.
  
**对应字段赋值
  ls_mara2 = CORRESPONDING #( ls_mara ).
  
  ls_mara3-matkl = 'A'.
  ls_mara3 = CORRESPONDING #( BASE ( ls_mara3 ) ls_mara2 ). "不指定BASE 初始值会丢失
  
  ls_mara3 = CORRESPONDING #( ls_mara2 ).
  • 内表操作

​​​​​​​内表表达式,内表预定义函数,内表推导,内表筛选,内表缩减。

*&----------------------------------------------------------------------
* 主题三:内表操作
* 1. 内表表达式- 相当于READ TABLE
*    语法:… itab[ … ] …
*     注: 如果未找到对应的记录就会抛出CX_SY_ITAB_LINE_NOT_FOUND异常,SY-SUBRC不会记录
*           可以通过line_exists预定义函数改进
* 2. 內表预定义函数
*     2.1 line_exists( ) - 判断记录是否存在
*     2.2 line_index( )  - 获取符合记录的索引值
* 3. 內表推导 - FOR 理解为LOOP,是对实现操作符 NEW 和值操作符VALUE的一种增强,作用是构造內表内容
*     语法1 : …FOR i = ... [THEN expr]  UNTIL | WHILE  log_exp ...
*     语法2 : …FOR wa|<fs> IN itab [INDEX INTO idx][cond][let_exp]...
* 4. 內表筛选-FILTER -筛选内表中的数据
*     语法:  FILTER  type(  itab   [EXCEPT]   [IN ftab]   [USING KEY keyname ]
*                            WHERE c1 op f1  [AND c2 op f2  [...] ]  ) ...
*      注: WHERE对应过滤的条件,是必须要指定的,注意有些操作符是不能在WHERE中使用的,如:OR , NOT 等
*            EXCEPT如果不指定则表示满足条件的找出来,如果指定则表示不满足条件的找出来
* 5. 內表缩减
*      语法: ... REDUCE type(
*                              [let_exp]
*                              INIT {x1 = rhs1}|{<x1> = wrexpr1}|{x1|<x1> TYPE dtype1}
*                                   {x2 = rhs2}|{<x2> = wrexpr2}|{x2|<x2> TYPE dtype2}
*                                   ...
*                              FOR for_exp1
*                              FOR for_exp2
*                              ...
*                              NEXT ...
*                                   {x1 = rhs1}|{<x1> = wrexpr1}
*                                   {x2 = rhs2}|{<x2> = wrexpr2}
*                                   ... ) ...
* 6. 内表分组

select * from mara INTO TABLE @DATA(lt_mara)UP TO 10 ROWS.
  
  "通过索引值判断某一行记录是否存在,也可通过条件判断
  IF line_exists( lt_mara[ 4 ] ).
   "获取第4行记录
    DATA(ls_mara) = lt_mara[ 4 ].
   "获取第4行记录中的标签类型
    DATA(lv_matnr) = lt_mara[ 4 ]-matnr."标签类型
  ENDIF.  
  
  "获取符合条件的索引值,未找到LV_INDEX为0
    DATA(lv_index) = line_index( lt_mara[ matnr = lv_matnr ] ).
    IF lv_index NE 0 AND line_exists( lt_mara[ lv_index + 1 ] ) .
       CLEAR ls_mara.
       "获取下一行记录
       ls_mara = lt_mara[ lv_index + 1 ].
    ENDIF.  

*************内表推导********************************************
  TYPES: BEGIN OF ty_line,
           col1 TYPE i,
           col2 TYPE i,
           col3 TYPE i,
         END OF ty_line,      "结构体
         ty_tab TYPE STANDARD TABLE OF ty_line WITH EMPTY KEY.

*&*********通过语法1给新內表赋值 - 类似于JAVA中的FOR循环
  "for每次遍历一次都将结果,通过value赋值给内表gt_itab
  DATA(gt_itab) = VALUE ty_tab( FOR j = 11 THEN j + 10 UNTIL j > 40  "初始值,递增量,结束条件
                              " 结构中的字段赋值-参考类型ty_tab
                              ( col1 = j col2 = j + 1 col3 = j + 2  ) ).
*&*********同过语法2给新內表赋值
*&*********取数
    "客户标签信息
     SELECT *
       FROM ztcust_tag
       INTO TABLE @DATA(gt_data)
         UP TO 5 ROWS.

    IF gt_data IS NOT INITIAL.
      "标签日期日志表
      SELECT *
        FROM ztcust_tag_log
        INTO TABLE @DATA(gt_data_t)
         FOR ALL ENTRIES IN @gt_data
       WHERE tag_id = @gt_data-tag_id.

       SORT gt_data_t BY tag_id.
       DELETE ADJACENT DUPLICATES FROM gt_data_t COMPARING tag_id.
    ENDIF.

     cl_demo_output=>write( gt_data ).
     cl_demo_output=>write( gt_data_t ).

    TYPES: BEGIN OF ty_tag_line,
          "标签表
           tag_id        TYPE ztcust_tag-tag_id,          "标签ID
           card_no       TYPE ztcust_tag-card_no,         "会员号
           tag_name      TYPE ztcust_tag-tag_name,        "标签值
           "日志表
           sernumber     TYPE ztcust_tag_log-sernumber,   "流水号
           uname         TYPE ztcust_tag_log-uname,       "用户名
           log_date      TYPE ztcust_tag_log-log_date,    "备份日期
           log_time      TYPE ztcust_tag_log-log_time,    "备份时间
           message_type  TYPE ztcust_tag_log-message_type,"消息类型
           message       TYPE ztcust_tag_log-message,     "消息文本
         END OF ty_tag_line,
         ty_tag_tab TYPE STANDARD TABLE OF ty_tag_line WITH EMPTY KEY.

*&*********将标签表和日志表的数据整合在一起,构建新的内表
DATA(gt_itab) = VALUE ty_tag_tab( FOR ls_itab IN gt_data WHERE ( classify = 'brands' )"遍历标签类型为brands; ls_itab 为隐形声明或者<fs>
                                  (
                                  tag_id    = ls_itab-tag_id
                                  card_no   = ls_itab-card_no
                                  tag_name  = ls_itab-tag_name
                                  sernumber = VALUE #( gt_data_t[ tag_id = ls_itab-tag_id ]-sernumber ) "通过VALUE语句和内表表达式赋值
                                      uname      = VALUE #( gt_data_t[ tag_id = ls_itab-tag_id ]-uname )
                                  log_date  = VALUE #( gt_data_t[ tag_id = ls_itab-tag_id ]-log_date )
                                  log_time  = VALUE #( gt_data_t[ tag_id = ls_itab-tag_id ]-log_time )
                                  message_type = VALUE #( gt_data_t[ tag_id = ls_itab-tag_id ]-message_type )
                                  message   = VALUE #( gt_data_t[ tag_id = ls_itab-tag_id ]-message )
                                  )
                                ).
cl_demo_output=>write( gt_itab ).

*&*********使用操作符FILTER过滤
DATA: gt_filter TYPE HASHED TABLE OF ty_tag_line
                  WITH UNIQUE KEY uname.

***INitialize filter Table
gt_filter = VALUE #( ( uname = 'XUWENPAN' ) ).

"找出满足条件的数据
DATA(gt_out) = FILTER #( gt_itab IN gt_filter WHERE uname = uname ) .
cl_demo_output=>write( gt_out ).

"找出不满足条件的数据
DATA(gt_out_t) = FILTER #( gt_itab EXCEPT IN gt_filter WHERE uname = uname ) .
cl_demo_output=>write( gt_out_t ).
*&*********取数
TYPES: BEGIN OF ty_man,
         name   TYPE char10,    " 姓名
         sex    TYPE char1,       " 性别
         age    TYPE p DECIMALS 2," 年龄
         school TYPE char20,      " 学校
       END OF ty_man.
DATA: gt_man TYPE TABLE OF ty_man.

 gt_man = VALUE #( ( name = 'Anna' sex = 'G' age = 17 )
                  ( name = 'Ann'  sex = 'G' age = 16 ) ).
 cl_demo_output=>write( gt_man ).

"内表基础上附加额外数据
 gt_man = VALUE #( BASE gt_man ( name = 'Xiaohong' sex = 'G' age = 20 school = 'C SCHOOL' )
                              ( name = 'Xiaoming' sex = 'B' age = 21  school = 'D SCHOOL' ) ).
 cl_demo_output=>write( gt_man ).

 "内表行数
 DATA(lv_lines) = lines( gt_man ).
  "内表中符合条件的数据有几条
 DATA(lv_lines_g) = REDUCE i( INIT x = 0
                              FOR  ls_man IN gt_man WHERE ( sex = 'G' )
                           NEXT x = x + 1 ).
 cl_demo_output=>write( lv_lines ).
 cl_demo_output=>write( lv_lines_g ).

  "累计内表中符合条件的年龄之和
 TYPES: ty_age TYPE p DECIMALS 2.
 DATA(lv_sum_age) = REDUCE ty_age( INIT dage = VALUE ty_age( )
                                FOR wa IN gt_man WHERE ( sex = 'G' )
                                NEXT dage = dage + wa-age ).
 cl_demo_output=>write( lv_sum_age ).

"综合例子
TYPES:BEGIN OF ty_result,
         sum  TYPE p DECIMALS 2, "总和
          max  TYPE p DECIMALS 2, "最大值
          avg  TYPE p DECIMALS 2, "平均
          cunt TYPE i,            "记录数
        END OF ty_result.

  DATA(ls_result) = REDUCE ty_result( INIT res = VALUE ty_result( )  "可以默认值:ty_result( min = 0 max = 0 )
                                       FOR <fs_man> IN gt_man WHERE ( sex = 'G' ) "性别为G
                                      NEXT res-sum = res-sum + <fs_man>-age       "年龄总和
                                           res-max = nmax( val1 = res-max val2 = <fs_man>-age )"最大年龄
                                           res-cunt = res-cunt + 1                "满足条件的条目数
                                     ).


  ls_result-avg = ls_result-sum / ls_result-cunt.  "平均值
  cl_demo_output=>write( ls_result ).

 cl_demo_output=>display(  ).

Open SQL:

SELECT 'I' AS sign , 'EQ' as option , matnr AS low INTO TABLE @lt_general FROM mara.
  SELECT a~objectid ,
    CASE tabname
      WHEN 'MARA' THEN 'GENERAL'
      WHEN 'DMAKT' THEN 'GENERAL'
      WHEN 'MVKE' THEN 'SALES'
      WHEN 'DMLAN' THEN 'SALES'
      WHEN 'MARC' THEN 'PLANT'
      WHEN 'MBEW' THEN 'PLANT'
    END AS name
    FROM cdhdr AS a INNER JOIN cdpos AS b ON a~objectid = b~objectid AND a~objectclas = b~objectclas AND a~changenr = b~changenr
    INTO TABLE @DATA(lt_mat)
    WHERE  a~udate BETWEEN @iv_start_date AND @iv_end_date
    AND a~tcode IN ('MM01','MM02','MM01(BAPI)','MM02(BAPI)','MM06')
    AND b~tabname IN ('MARA','DMAKT','MVKE','DMLAN','MARC','MBEW').

 

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值