ABAP7.40之后版本新语法

更新时间:2023-07-26 19:35:31 阅读: 评论:0

ABAP7.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,    " 姓名
x    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' x = 'B' ).
"附加年龄信息
gs_man = VALUE #( name = 'Tom' x = 'B' age = 18 ).
*DATA(gs_man_02) = VALUE #( name = 'Tom' x = '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' x = 'G' age = 17 ) ( name = 'Ann' x = 'G' age = 16 ) ).
"内表基础上附加额外数据
gt_man = VALUE #( BASE gt_man ( name = 'Xiaohong' x = 'G' age = 20 school = 'C SCHOOL' )                              ( name = 'Xiaoming' x = '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 ) ).
lect 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. 内表分组
lect * 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,        "标签值
"⽇志表
rnumber    TYPE ztcust_tag_log-rnumber,  "流⽔号
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
rnumber = VALUE #( gt_data_t[ tag_id = ls_itab-tag_id ]-rnumber ) "通过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,    " 姓名
x    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' x = 'G' age = 17 )
( name = 'Ann'  x = 'G' age = 16 ) ).
cl_demo_output=>write( gt_man ).
"内表基础上附加额外数据
gt_man = VALUE #( BASE gt_man ( name = 'Xiaohong' x = 'G' age = 20 school = 'C SCHOOL' )
( name = 'Xiaoming' x = '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 ( x = '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 ( x = '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 ( x = '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:

本文发布于:2023-07-26 19:35:31,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1118700.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:内表   记录   数据   赋值
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图