SAP ABAP新语法

  1. 变量及对象声明

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

扫描二维码关注公众号,回复: 6236015 查看本文章
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’ ).

  1. 内表操作

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: <line> type …

READ TABLE itab

           ASSIGNING <line>.

After

READ TABLE itab

   ASSIGNING FIELD-SYMBOL(<line>).

   

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 ) ).

 

  1. 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

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

 

  1. 其他语法

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}|{<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} 
           ... ) ... 

实例:

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 ) ).

 

猜你喜欢

转载自blog.csdn.net/z_x_xing_/article/details/90204896