科莱特教育

 找回密码
 立即注册
查看: 3784|回复: 0

SAP ABAP新语法

[复制链接]

17

主题

21

帖子

71

积分

注册会员

Rank: 2

积分
71
发表于 2021-1-11 03:48:56 | 显示全部楼层 |阅读模式

变量及对象声明

1.1 变量声明

Before:

DATA text TYPE string.

text = ....

After:

DATA(text) = ....

1.2 使用工作区

Before:

DATA wa like LINE OF itab.

LOOP AT itab INTO wa.

ENDLOOP.

After:

LOOP AT itab INTO DATA(wa).

ENDLOOP.

1.3 返回参数

Before:

DATA xml TYPE xstring.

CALL TRANSFORMATION … RESULT XML xml.

After:

CALL TRANSFORMATION … RESULT XML DATA(xml).

1.4 引用声明

Before:

DATA ixml TYPE REF TO if_ixml.

DATA stream_factory TYPE REF TO if_ixml_stream_factory.

DATA document TYPE REF TO if_ixml_document.

ixml = cl_ixml=>create( ).

stream_factory = ixml->create_stream_factory( ).

document = ixml->create_document( ).

After:

DATA(ixml) = cl_ixml=>create( ).

DATA(stream_factory) = ixml->create_stream_factory( ).

DATA(document) = ixml->create_document( ).

1.5 对象实例化

Before:

DATA lo_human TYPE REF TO class_human.

CREATE OBJECT lo_human EXPORTING NAME = ‘TONY’.

After:

lo_human = NEW class_human( name = ‘TONY’ ).

内表操作

2.1 READ TABLE

2.1.1 Read Table with key

Before:

READ TABLE flight_schedules INTO DATA(flight_schedule)

WITH KEY carrid = ‘AA’

connid = ‘0017’.

After:

DATA(flight_schedule) = flight_schedules[ carrid = ‘AA’ connid = ‘0017’ ].

2.1.2 Read Table index

Before:

READ TABLE itab INDEX idx

INTO wa.

After:
wa = itab[ idx ].

2.1.3 Read Table using key

Before:

READ TABLE itab INDEX idx

USING KEY key
INTO wa.
After:
wa = itab[ KEY key INDEX idx ].

2.1.4 Read Table index

Before:

DATA idx type sy-tabix.

READ TABLE …

TRANSPORTING NO FIELDS.

idx = sy-tabix.

After:

DATA(idx) = line_index( itab[ … ] ).

2.1 READ TABLE ASSIGNING

Before:

FIELD-SYMBOLS: type …

READ TABLE itab

ASSIGNING .

After:

READ TABLE itab

ASSIGNING FIELD-SYMBOL( ).

2.2 获得内表行数

Before:

DATA: lv_rows TYPE i.

LV_ROWS = LINES( ITAB)

After:

DATA(lv_rows) = LINES( itab ).

2.3 填充内表的值到目标内表中

Before:

DATA: gt_citys TYPE ty_citys,

gs_ship TYPE ty_ship,

gs_city TYPE ort01.

LOOP AT gt_ships INTO gs_ship.

gs_city = gs_ship-city.
APPEND gs_city TO gt_citys.

ENDLOOP.

After:

DATA(gt_citys) = VALUE ty_citys( FOR ls_ship IN gt_ships ( ls_ship-city ) ).

Open SQL

3.1 取数到内表

Before:

DATA itab TYPE TABLE OF dbtab.

SELECT * FROM dbtab

INTO TABLE itab

WHERE fld1 = lv_fld1.

After:

SELECT * FROM dbta

INTO TABLE DATA(itab)

WHERE fld1 = @lv_fld1

3.2 宿主变量

在ABAP 7.40之前,OPEN SQL 中我们通常会添加一些变量,用来作为取数的限制条件,这种方式下,Open SQL parser将open SQL语句进行解析成与底层数据可相对应SQL时,可能会出现误差,为了能清晰的区分算符两端的东西到底是ABAP变量、还是数据库内容,从而发送相应的内容给数据库。为了完成这一任务,Open SQL中的ABAP变量因此成为了完全的宿主变量(host variables)。

宿主变量用”@ ”来标记。

3.3 宿主表达式

Before:

没有宿主变量之前,书写SQL时,可能会出现下面的错误。并且不容易察觉。
1)SELECT carrid connid fldate seatsocc seatsmax
FROM sflight INTO TABLE sflight_tab
WHERE seatsmax < sflight-seatsocc.

2)SELECT carrid, connid, fldate, seatsocc, seatsmax
FROM sflight

WHERE seatsmax < sflight~seatsocc

INTO TABLE sflight_tab.

第一种情况 sflight-seatsocc表示的是变量,而第二种sflight~seatsocc则表示的是数据库字段

他们的执行结果是不同的。
After:

3)SELECT carrid, connid, fldate, seatsocc, seatsmax

FROM sflight

WHERE seatsmax < @sflight-seatsocc
INTO TABLE @sflight_tab.

引入宿主变量之后,通过@符号,我们能准确区分@sflight-seatsocc

是宿主变量,也就是程序中的变量,执行结果不会出现误差。

其他语法

4.1 FILTER

语法定义:

FILTER type( itab [EXCEPT] [IN ftab] [USING KEY keyname]

WHERE c1 op f1 [AND c2 op f2 […]] ).

实例:

TYPES: BEGIN OF ty_filter,

cityfrom TYPE spfli–cityfrom,

cityto TYPE spfli–cityto,

f3 TYPE i,

END OF ty_filter,

ty_filter_tab TYPE HASHED TABLE OF ty_filter

WITH UNIQUE KEY cityfrom cityto.

DATA: lt_splfi TYPE STANDARD TABLE OF spfli.

SELECT * FROM spfli APPENDING TABLE lt_splfi.

DATA(lt_filter) = VALUE ty_filter_tab( f3 = 2

( cityfrom = ‘NEW YORK’ cityto = ‘SAN FRANCISCO’ )
( cityfrom = ‘FRANKFURT’ cityto = ‘NEW YORK’ ) ).

DATA(lt_myrecs) = FILTER #( lt_splfi IN lt_filter

WHERE cityfrom = cityfrom

AND cityto = cityto ).

“Output filtered records

LOOP AT lt_myrecs ASSIGNING FIELD–SYMBOL(<ls_rec>).

WRITE: / <ls_rec>–carrid,8 <ls_rec>–cityfrom,30

<ls_rec>–cityto,45 <ls_rec>–deptime.

ENDLOOP.

4.2 REDUCE

语法定义:

… REDUCE type(
[let_exp]
INIT {x1 = rhs1}|{ = wrexpr1}|{x1| TYPE dtype1}
{x2 = rhs2}|{ = wrexpr2}|{x2| TYPE dtype2}

FOR for_exp1
FOR for_exp2

NEXT …
{x1 = rhs1}|{ = wrexpr1}
{x2 = rhs2}|{ = wrexpr2}
… ) …

实例:

DATA itab TYPE STANDARD TABLE OF i WITH EMPTY KEY.
itab = VALUE #( FOR j = 1 WHILE j <= 10 ( j ) ).

DATA(sum) = REDUCE i( INIT x = 0 FOR wa IN itab NEXT x = x + wa ).

4.3 使用类转换字符串 conv

Before:

DATA text TYPE c LENGTH 255.

DATA helper TYPE string.

DATA xstr TYPE xstring.

helper = text.

xstr = cl_abap_codepage=>convert_to( source = helper ).

After:

DATA text TYPE c LENGTH 255.

DATA(xstr) = cl_abap_codepage=>convert_to( source = CONV string( text ) ).

OR

DATA(xstr) = cl_abap_codepage=>convert_to( source = CONV #( text ) ).


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


QQ|科莱特教育

GMT, 2025-4-25 15:32 , Processed in 0.049205 second(s), 24 queries .

福州科莱特教育科技有限公司 版权所有 闽ICP备2021003729号-2

Copyright C 2018-2022 All Rights Reserved

快速回复 返回顶部 返回列表