原文链接:https://www.cnblogs.com/learnning/p/10647174.html

主要内容

  • 内联声明

  • 构造表达式

  • 内表操作

  • Open SQL

  • 其他


本文列出了ABAP新语法的一些使用方式,供大家学习参考。

内联声明

代码实现:

*&----------------------------------------------------------------------
* 主题一:内联声明
* 语法:DATA(...) ,FILED-SYMBOL(…)
* 1. 定义变量
* 2. 定义结构
* 3. 定义内表
* 4. 定义指针
*&---------------------------------------------------------------------*
* 记录时间:23.03.2019 记录人: YALUOO
*&---------------------------------------------------------------------*
*&*********取数
"客户的标签信息表
SELECT *
FROM ztcust_tag
INTO TABLE @DATA(gt_data)
UP TO 5 ROWS.
cl_demo_output=>write( gt_data ). *&*********定义变量
DATA(lv_card_no) = '1000023312'. "会员号
cl_demo_output=>write( lv_card_no ). *&*********定义结构
READ TABLE gt_data INTO DATA(gs_data) INDEX 1.
IF sy-subrc EQ 0.
DATA(ls_data) = gs_data.
cl_demo_output=>write( ls_data ).
ENDIF. *&*********定义内表
DATA(lt_data) = gt_data.
cl_demo_output=>write( lt_data ). *&*********定义指针
LOOP AT lt_data ASSIGNING FIELD-SYMBOL(<fs_data>) WHERE card_no EQ lv_card_no.
<fs_data>-create_user = 'YALUOO'. "修改创建人
ENDLOOP.
cl_demo_output=>write( lt_data ).
cl_demo_output=>display( ).

运行结果:

构造表达式

代码实现:

*&----------------------------------------------------------------------
* 主题二:构造表达式
* 1. 实现构造: NWE -创建数据对象或类的实现
* 1.1 构造单值
* 1.2 构造结构
* 1.3 构造内表
* 1.4 构造类
* 2. 值构造: VALUE - 创建一个类型为dypee的数据
* 2.1 构造结构
* 语法: ... VALUE dtype | #( [BASE dobj] comp1 = dobj1 comp2 = dobj2 ... ) ...
* 2.2 构造内表 :
* 语法: ... VALUE dtype | #( [BASE itab] ( (line1-com1 = dobj1) ( line2 ..) ... ) ...
* note: dytpe可接具体类型或者# ,接#数据类型必须确定
* 可以嵌套使用;
* 内表赋值不能带表头;
* 3. 组件构造: CORRESPONDING
* 语法:... CORRESPONDING dtype | #( [BASE dobj] comp1 = dobj1 comp2 = dobj2 ... ) ...
*&---------------------------------------------------------------------*
* 记录时间:23.03.2019 记录人: YALUOO
*&---------------------------------------------------------------------*
" 自定义类型
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' ).
cl_demo_output=>write( gs_man ). "附加年龄信息
gs_man = VALUE #( name = 'Tom' sex = 'B' age = 18 ).
*DATA(gs_man_02) = VALUE #( name = 'Tom' sex = 'B' age = 18 ) . "错误,未明确类型
cl_demo_output=>write( gs_man ). "附加学校信息
gs_man = VALUE ty_man( BASE gs_man school = 'A SCHOOL' ).
cl_demo_output=>write( gs_man ). "调整学校信息
gs_man = VALUE #( BASE gs_man school = 'B SCHOOL' ).
cl_demo_output=>write( gs_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 ).
cl_demo_output=>display( ). &*********Range 表赋值
DATA: r_data TYPE RANGE OF ztcust_tag-data_type. "内表不带表头
RANGES: r_data_01 FOR ztcust_tag-data_type. "内表带表头-不支持 "逐步往下填充内表数据
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 )
).
cl_demo_output=>write( r_data ).
cl_demo_output=>display( ).

运行结果:

代码实现:

TYPES: BEGIN OF ty_data.
INCLUDE TYPE ztcust_tag.
TYPES: flag TYPE char1,
END OF ty_data. TYPES: BEGIN OF ty_data_t.
INCLUDE TYPE ztcust_tag.
TYPES: flag_t TYPE char1,
END OF ty_data_t. DATA: gs_data_02 TYPE ty_data,
gs_data_03 TYPE ty_data_t. *&*********取数
SELECT SINGLE *
FROM ztcust_tag
INTO @DATA(gs_data). *&*********对应字段赋值
gs_data_02 = CORRESPONDING #( gs_data ).
cl_demo_output=>write( gs_data_02 ). gs_data_03-flag_t = abap_true.
gs_data_03 = CORRESPONDING #( BASE ( gs_data_03 ) gs_data_02 )."不指定BASE 初始值会丢失
cl_demo_output=>write( gs_data_03 ). gs_data_03 = CORRESPONDING #( gs_data_02 )."初始值丢失
cl_demo_output=>write( gs_data_03 ).
cl_demo_output=>display( ).

运行结果:

内表操作

代码实现:

*&----------------------------------------------------------------------
* 主题三:内表操作
* 1. 内表表达式- 相当于READ TABLE
* 语法:… itab[ … ] …
* note: 如果未找到对应的记录就会抛出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 [...] ] ) ...
* note: 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. 内表分组
*&---------------------------------------------------------------------*
* 记录时间:23.03.2019 记录人: YALUOO
*&---------------------------------------------------------------------* *&*********取数
SELECT *
FROM ztcust_tag
INTO TABLE @DATA(gt_data)
UP TO 5 ROWS. *&*********定义变量
DATA(lv_card_no) = '1000023312'. "会员号
cl_demo_output=>write( gt_data ). "通过索引值判断某一行记录是否存在,也可通过条件判断
IF line_exists( gt_data[ 4 ] ).
"获取第4行记录
DATA(ls_data) = gt_data[ 4 ].
"获取第4行记录中的标签类型
DATA(lv_classify) = gt_data[ 4 ]-classify."标签类型
cl_demo_output=>write( ls_data ).
cl_demo_output=>write( lv_classify ).
ENDIF. "获取符合条件的索引值,未找到LV_INDEX为0
DATA(lv_index) = line_index( gt_data[ card_no = lv_card_no classify = lv_classify ] ).
IF lv_index NE 0 AND line_exists( gt_data[ lv_index + 1 ] ) .
CLEAR ls_data.
"获取下一行记录
ls_data = gt_data[ lv_index + 1 ].
cl_demo_output=>write( ls_data ).
ENDIF. cl_demo_output=>display( ).

运行结果:

代码实现:

  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 )
"11 12 13 - value 到 gt_itab
"21 22 23 - value 到 gt_itab
"31 32 33 - value 到 gt_itab
"41 - 结束循环
).
cl_demo_output=>display( gt_itab ).

运行结果:

代码实现:

*&*********同过语法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 ). cl_demo_output=>display( ).

运行结果:

代码实现:

*&*********取数
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

代码实现:

*&----------------------------------------------------------------------
* 主题四:Open SQL
*
*&---------------------------------------------------------------------*
* 记录时间:23.03.2019 记录人: YALUOO
*&---------------------------------------------------------------------*
DATA(lv_card_no) = '1000023083'. SELECT a~tag_id, "标签ID
card_no, "会员号
tag_name, "会员值
sernumber, "流水号
uname, "用户名
log_date, "备份日期
log_time, "备份时间
message_type, "消息类型
message "消息文本
FROM ztcust_tag AS a
INNER JOIN ztcust_tag_log AS b
ON a~tag_id = b~tag_id
INTO TABLE @DATA(gt_tag)
WHERE a~card_no = '1000023312' OR a~card_no = @lv_card_no
AND classify = 'brands' . cl_demo_output=>display( gt_tag ).

运行结果:

ABAP 新语法记录(一)的更多相关文章

  1. ABAP 新语法-实例讲解

    主要内容 内联声明 构造表达式 内表操作 Open SQL 其他 本文列出了ABAP新语法的一些使用方式,供大家学习参考. 内联声明 代码实现: *&--------------------- ...

  2. 2019.11.06 【每天学点SAP小知识】Day1 - ABAP 7.40新语法

    最近看同事使用ABAP新语法贼溜,省了好多的功夫,还在使用老语法的我眼红了. 所以就自己补一补7.40之后语法,能够让自己写代码更顺畅吧. 今天学习内联申明 inline 意思是:当编译器发现某段代码 ...

  3. ABAP 7.4 新语法-内嵌生命和内表操作(转)

    转自:https://www.cnblogs.com/mingdashu/p/6744637.html ABAP 7.4 新语法-内嵌生命和内表操作   1.内嵌声明 2.内表操作 3.opensql ...

  4. 2019.11.07【每天学点SAP小知识】Day2 - ABAP 7.40新语法 - 内表

    今天学习一下内表的表达式在ABAP 7.4之后的语法: SELECT * FROM mara INTO TABLE @DATA(gt_mara)UP TO 10 ROWS. DATA gt_mara_ ...

  5. 【ABAP系列】SAP ABAP7.40新语法简介第一篇

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP7.40新语法简 ...

  6. 【ABAP系列】SAP ABAP7.40新语法简介第二篇

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP7.40新语法简 ...

  7. 2019.11.18【每天学点SAP小知识】Day4 - ABAP 7.40新语法 FOR

    "今天学习一下FOR的语法,常用的2个语法. FOR wa|<fs> IN itab [INDEX INTO idx] [cond] "FOR i = … [THEN ...

  8. 2019.11.10【每天学点SAP小知识】Day3 - ABAP 7.40新语法 值转化和值赋值

    1.语法为 CONV dTYPE|#(...)\ # 代表任意类型 "7.40之前表达式 . DATA helper TYPE string. DATA xstr TYPE xstring. ...

  9. Delphi 7以来的Delphi 2009测试版新语法特性

    我晕,Delphi 7 以后增加了这么多有用的语法,我都不知道.真是越学越觉得自己浅薄,自己所作的Delphi项目所用的知识还不够Delphi知识储备体系的十分之一,更别说Delphi还在继续发展. ...

随机推荐

  1. java之类的构造方法

    构造器的特征: 具有和类相同的名称: 不声明返回值的类型: 不能被static.final.synchronized.abstract.native修饰,不能有return语句返回值: 构造器的作用: ...

  2. python图片爬虫 - 批量下载unsplash图片

    前言 unslpash绝对是找图的绝佳场所, 但是进网站等待图片加载真的令人捉急, 仿佛是一场拼RP的战争 然后就开始思考用爬虫帮我批量下载, 等下载完再挑选, 操作了一下不算很麻烦, 顺便也给大家提 ...

  3. go语言变量作用域

    Go 语言变量作用域 作用域为已声明标识符所表示的常量.类型.变量.函数或包在源代码中的作用范围. Go 语言中变量可以在三个地方声明: 函数内定义的变量称为局部变量 函数外定义的变量称为全局变量 函 ...

  4. SpringBoot2 整合 ClickHouse数据库,实现高性能数据查询分析

    本文源码:GitHub·点这里 || GitEE·点这里 一.ClickHouse简介 1.基础简介 Yandex开源的数据分析的数据库,名字叫做ClickHouse,适合流式或批次入库的时序数据.C ...

  5. 【带着canvas去流浪(9)】粒子动画

    目录 一. 粒子特效 二. 开发中遇到的问题 2.1 卡顿 2.2 轨迹 2.3 复位 2.4 防护层 2.5 二维向量类 三. 实现讲解 3.1 粒子类的update方法 3.2 粒子群的绘制 3. ...

  6. Slickflow.NET 开源工作流引擎快速入门之二: 简单并行分支流程代码编写示例

    前言:对于急切想了解引擎功能的开发人员,在下载版本后,就想尝试编写代码,完成一个流程的开发和测试.本文试图从一个最简单的并行分支流程来示例说明,如何快速了解引擎代码的编写. 版本:.NET Core2 ...

  7. java基础(6):方法

    1. 方法 1.1 方法概述 在我们的日常生活中,方法可以理解为要做某件事情,而采取的解决办法. 如:小明同学在路边准备坐车来学校学习.这就面临着一件事情(坐车到学校这件事情)需要解决,解决办法呢?可 ...

  8. PHP中RBAC权限管理

    1.RBAC概念和原理          RBAC:全称叫做Role-Based Access Control,中文翻译叫做基于角色的访问控制.其主要的作用是实现项目的权限控制.            ...

  9. URL跳转绕过姿势

    POC "@" http://www.target.com/redirecturl=http://whitelist.com@evil.com "\" http ...

  10. python中函数

    函数特点:一次定义,多次调用 函数阶段:1.定义阶段 2.调用阶段定义阶段的参数叫形参 调用阶段的参数叫实参 例: def test(name,age): print('my name is %s,m ...