ABAP 新语法记录(一)
原文链接: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 新语法记录(一)的更多相关文章
- ABAP 新语法-实例讲解
主要内容 内联声明 构造表达式 内表操作 Open SQL 其他 本文列出了ABAP新语法的一些使用方式,供大家学习参考. 内联声明 代码实现: *&--------------------- ...
- 2019.11.06 【每天学点SAP小知识】Day1 - ABAP 7.40新语法
最近看同事使用ABAP新语法贼溜,省了好多的功夫,还在使用老语法的我眼红了. 所以就自己补一补7.40之后语法,能够让自己写代码更顺畅吧. 今天学习内联申明 inline 意思是:当编译器发现某段代码 ...
- ABAP 7.4 新语法-内嵌生命和内表操作(转)
转自:https://www.cnblogs.com/mingdashu/p/6744637.html ABAP 7.4 新语法-内嵌生命和内表操作 1.内嵌声明 2.内表操作 3.opensql ...
- 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_ ...
- 【ABAP系列】SAP ABAP7.40新语法简介第一篇
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP7.40新语法简 ...
- 【ABAP系列】SAP ABAP7.40新语法简介第二篇
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP7.40新语法简 ...
- 2019.11.18【每天学点SAP小知识】Day4 - ABAP 7.40新语法 FOR
"今天学习一下FOR的语法,常用的2个语法. FOR wa|<fs> IN itab [INDEX INTO idx] [cond] "FOR i = … [THEN ...
- 2019.11.10【每天学点SAP小知识】Day3 - ABAP 7.40新语法 值转化和值赋值
1.语法为 CONV dTYPE|#(...)\ # 代表任意类型 "7.40之前表达式 . DATA helper TYPE string. DATA xstr TYPE xstring. ...
- Delphi 7以来的Delphi 2009测试版新语法特性
我晕,Delphi 7 以后增加了这么多有用的语法,我都不知道.真是越学越觉得自己浅薄,自己所作的Delphi项目所用的知识还不够Delphi知识储备体系的十分之一,更别说Delphi还在继续发展. ...
随机推荐
- ReactNative: 使用标签栏组件TabBarIOS组件
一.简介 标签栏Tab的作用对于应用程序那是不言而喻的,它是应用程序中除了导航栏组件外的又一个核心组件,使用它可以实现页面的切换.RN提供了一个TabBarIOS组件来完成页面的切换(视图或者路由), ...
- tensorflow中卷积、转置卷积具体实现方式
卷积和转置卷积,都涉及到padding, 那么添加padding 的具体方式,就会影响到计算结果,所以搞清除tensorflow中卷积和转置卷积的具体实现有助于模型的灵活部署应用. 一.卷积 举例说明 ...
- python Json报错json.decoder.JSONDecodeError
近期工作中遇到一个问题,执行json.loads(json_data)时,在json_data中加上tab空格后就报错,不加则不报错 一.json.loads(json_data) 报错json.de ...
- python强大的绘图模块matplotlib示例讲解
Matplotlib 是 Python 的绘图库.作为程序员,经常需要进行绘图,在我自己的工作中,如果需要绘图,一般都是将数据导入到excel中,然后通过excel生成图表,这样操作起来还是比较繁琐的 ...
- 函数式编程 - Functional Programming
什么是函数式编程 函数式编程是一种编程范式. 编程范式又是什么? 编程范式是一种解决问题的思路. 命令式编程 把程序看作 一系列改变状态的指令: 函数式编程 把程序看作 一系列数学函数映射的组合. i ...
- (转)Polynomial interpolation 多项式插值
原文链接:https://blog.csdn.net/a19990412/article/details/87262531 扩展学习:https://www.sciencedirect.com/t ...
- JAVAEE学期总结
声明:除第一张思维导图为博主所制作,其他思维导图皆来自网络,若侵权,望告知,必删除. ...
- Can not find the tag library descriptor for “http://java.sun.com/jstl/core"
此文原博文地址:https://blog.csdn.net/kolamemo/article/details/51407467 按照查到的资料,JSTL taglib需要jstl.jar来支持.在1. ...
- 大数据相关概念和hdfs
大数据 概述 大数据是新处理模式才能具备更多的决策力,洞察力,流程优化能力,来适应海量高增长率,多样化的数据资产. 大数据面临的问题 怎么存储海量数据(kb,mb,gb,tb,pb,eb,zb) 怎么 ...
- nRF24L01+组网方式及防撞(防冲突)机制的实战分享
利用多个nRF24L01+模块组网通信的实现方式 这里讨论的组网方式,不包含使用6个通道实现的多对1通信方式,因其只限于6个发送端,局限性很大,可以附加其他技术实现更好的组网,暂时这里不讨论.这里分享 ...