前言:在7.4版本以后,SAP ABAP语言做出了一些调整,让一些语法书写起来更加方便快捷,类似于其他语言的语法糖,不过一些稍微老的系统版本还不支持这些新写法,所以在使用方面主要看个人的习惯了,当然以前的写法肯定是要会的,这个新的语法作为了解也是可以的,今天就记录一下目前本人所接触的一些新语法,当然新语法肯定不止这些,更多的还是需要小伙伴去发掘,话不多说,上代码。
新语法练习
**********************************************************************
* PROGRAM DETAIL *
**********************************************************************
* --T-CODE:ZDEMO_NEW_GRAMMAR
* --AUTHOR:秋の夕
* --CREATE DATE:19.12.2021 13:19:28
* --DESCRIBLE:新语法总结练习
**********************************************************************
* EDIT LOG *
**********************************************************************
* VERSION DATE AUTHOR REMARK
* <DEVK90XXX> <YYYY/MM/DD> <...> <REASON>
REPORT zdemo_new_grammar.
**********************************************************************
* DECLARATIONS *
**********************************************************************
TABLES:ztdemo.
* 根据数据生成内表
WRITE: / | >----------------------无声明:根据数据生成内表 -------------------------<|.
SELECT * INTO TABLE @DATA(gt_data) FROM ztdemo.
* 自定义结构
TYPES:BEGIN OF ty_data,
id TYPE i,
name TYPE char10,
language TYPE char2,
age TYPE i,
END OF ty_data.
DATA:itab TYPE STANDARD TABLE OF ty_data WITH EMPTY KEY.
* 添加数据
** ---->单个赋值
itab = VALUE #(
( id = '1' name = '张三' language = 'ZH' age = '18' )
( id = '2' name = '李四' language = 'ZH' age = '19' )
( id = '3' name = '王五' language = 'EN' age = '20' )
( id = '4' name = '赵六' language = 'EN' age = '21' )
).
WRITE: / | >----------------------单个赋值 -------------------------<|.
LOOP AT itab INTO DATA(wa).
WRITE:/ |{ wa-id } - { wa-name } - { wa-language } - { wa-age WIDTH = 20 ALIGN = LEFT }|.
ENDLOOP.
** ---->基于内表赋值
WRITE: / | >----------------------基于内表赋值 -------------------------<|.
itab = VALUE #( BASE itab
( id = '5' name = '孙七' language = 'EN' age = '23' )
( id = '6' name = '蔡九' language = 'ZH' age = '21' )
).
LOOP AT itab INTO wa.
WRITE:/ |{ wa-id } - { wa-name } - { wa-language } - { wa-age WIDTH = 20 ALIGN = LEFT }|.
ENDLOOP.
*---------------------------------------------内表行数
WRITE: / | >----------------------内表行数 -------------------------<|.
DATA(tlines) = lines( itab ).
WRITE:/ |表行数:{ tlines }|.
*
*---------------------------------------------按照指定索引查找内表数据
WRITE: / | >----------------------按照指定索引查找内表数据 -------------------------<|.
DATA(wa_data1) = itab[ 2 ] .
WRITE:/ |行号为2的姓名:{ wa_data1-name }|.
*
*---------------------------------------------按照指定条件查找内表数据
WRITE: / | >----------------------按照指定条件查找内表数据 -------------------------<|.
DATA(wa_data2) = itab[ name = '张三' ] .
WRITE:/ |姓名为张三的行号: { wa_data2-id } |.
*
WRITE: / | >----------------------判断是否存在记录 -------------------------<|.
IF line_exists( itab[ id = 3 age = '20' ] ).
WRITE:/ |内表存在id为3,年龄为20的记录| .
ENDIF.
WRITE: / | >----------------------按照语言分组 -------------------------<|.
LOOP AT itab INTO DATA(group) GROUP BY ( language = group-language ).
WRITE: / | 分组语言:{ group-language }|.
LOOP AT GROUP group INTO DATA(ls_data).
WRITE: / |属于语言:{ group-language } 的id - { ls_data-id } |.
ENDLOOP.
ENDLOOP.
WRITE: / | >----------------------条件查询汇总 -------------------------<|.
SELECT
vbrp~vgbel,
vbrp~vgpos,
SUM( CASE WHEN vbrk~vbtyp = 'N' THEN - vbrp~fkimg
WHEN vbrk~vbtyp = 'M' THEN vbrp~fkimg END ) AS fkimg
FROM vbrk
INNER JOIN vbrp ON vbrk~vbeln = vbrp~vbeln
GROUP BY vbrp~vgbel ,vbrp~vgpos
INTO TABLE @DATA(lt_vbrp) UP TO 10 ROWS.
LOOP AT lt_vbrp INTO DATA(ls_vbrp).
WRITE:/ | { ls_vbrp-vgbel }-{ ls_vbrp-vgpos }-{ ls_vbrp-fkimg } |.
ENDLOOP.