SAP ABAP7.4 S4 最新语法简述

                    1、数据定义

Before 7.40With 7.40
DATADATA :lv_txt TYPE string.
lv_txt = 'SAP北河'.
DATA(lv_txt) = 'SAP北河'.
LOOPDATA wa like LINE OF itab.
LOOP AT itab INTO wa.
...
ENDLOOP.
LOOP AT itab INTO DATA(wa).
  ...
ENDLOOP.
Loop at assigning

FIELD-SYMBOLS: <line> type …

LOOP AT itab ASSIGNING <line>.
  ...
ENDLOOP.

LOOP AT itab
   ASSIGNING FIELD-SYMBOL(<line>).
   ...
ENDLOOP.
Call method

DATA a1 TYPE ...
DATA a2 TYPE ...

oref->meth( 
        IMPORTING p1 = a1
        IMPORTING p2 = a2 ).

oref->meth( 
        IMPORTING p1 = DATA(a1)
        IMPORTING p2 = DATA(a2) ).
Read assigning

FIELD-SYMBOLS: <line> type …

READ TABLE itab
           ASSIGNING <line>.

READ TABLE itab
   ASSIGNING FIELD-SYMBOL(<line>).
Select 

DATA itab TYPE TABLE OF dbtab.

SELECT * FROM dbtab
         INTO TABLE itab
        WHERE fld1 = lv_fld1.

SELECT * FROM dbtab
   INTO TABLE @DATA(itab) 
        WHERE fld1 = @lv_fld1.
Select single

SELECT SINGLE f1 f2
  FROM dbtab
  INTO (lv_f1, lv_f2)
 WHERE ...

 WRITE: / lv_f1, lv_f2.

SELECT SINGLE f1 AS my_f1,
              f2 AS abc
         FROM dbtab
         INTO DATA(ls_struct)
        WHERE ...

WRITE: / ls_struct-my_f1,
         ls_struct-abc.

                 2、内表读取

Before 7.40With 7.40
ReadREAD TABLE itab INDEX idx  
     INTO wa.
wa = itab[ idx ].
Read keyREAD TABLE itab INDEX idx
 USING KEY key
      INTO wa.
wa = itab[ KEY key INDEX idx ].
Read  with keyREAD TABLE itab 
  WITH KEY col1 = …
           col2 = …
      INTO wa.
wa = itab[ col1 = … col2 = … ].
Read with key componentsREAD TABLE itab
  WITH TABLE KEY key 
  COMPONENTS col1 = …
             col2 = …
        INTO wa.
wa = itab[ KEY key col1 = …
                   col2 = … ].
Does record 

READ TABLE itab ... 
     TRANSPORTING NO FIELDS.

IF sy-subrc = 0.    
   ... 
ENDIF.

IF line_exists( itab[ ... ] ).       
   ...
ENDIF.
 index

DATA idx type sy-tabix.

READ TABLE ... 
  TRANSPORTING NO FIELDS.

idx = sy-tabix.

DATA(idx) =
       line_index( itab[ ... ] ).
Before 7.40With 7.40
CLEAR ls_line2.
MOVE-CORRESPONDING ls_line1 
                TO ls_line2.
ls_line2 = CORRESPONDING #( ls_line1 ).
MOVE-CORRESPONDING ls_line1 
                TO ls_line2.
ls_line2 = CORRESPONDING #
        ( BASE ( ls_line2 ) ls_line1 ).

DATA: ls_line3 like ls_line2.

ls_line3 = ls_line2.
MOVE-CORRESPONDING ls_line1 
                TO ls_line2.

DATA(ls_line3) = CORRESPONDING line2
        ( BASE ( ls_line2 ) ls_line1 ).

          3、转换

           Method cl_abap_codepage=>convert_to expects a string

Before 7.40

DATA text   TYPE c LENGTH 255.
DATA helper TYPE string.
DATA xstr   TYPE xstring.

helper = text.

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

With 7.40

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

           4、 运算符

                 Variables:    VALUE dtype|#( )
                Structures:  VALUE dtype|#( comp1 = a1 comp2 = a2 … )
                Tables:         VALUE dtype|#( ( … ) ( … ) … ) …

TYPES:  BEGIN OF ty_columns1, “Simple structure
           cols1 TYPE i,
           cols2 TYPE i,
        END OF ty_columns1.

TYPES: BEGIN OF ty_columnns2,  “Nested structure
          coln1 TYPE i,
          coln2 TYPE ty_columns1,
       END OF ty_columns2.

DATA: struc_simple TYPE ty_columns1,
      struc_nest   TYPE ty_columns2.

     struct_nest   = VALUE t_struct(coln1 = 1
                                    coln2-cols1 = 1
                                    coln2-cols2 = 2 ).

struct_nest   = VALUE t_struct(coln1 = 1
                               coln2 = VALUE #( cols1 = 1
                                                cols2 = 2 ) ).

TYPES t_itab TYPE TABLE OF i WITH EMPTY KEY.
DATA  itab   TYPE t_itab.

itab = VALUE #( ( ) ( 1 ) ( 2 ) ).

DATA itab TYPE RANGE OF i.

itab = VALUE #( sign = 'I'  option = 'BT' ( low = 1  high = 10 )
                                          ( low = 21 high = 30 )
                                          ( low = 41 high = 50 )
                            option = 'GE' ( low = 61 )  ).

        5、FOR

Before 7.40

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.

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

DATA: gt_citys TYPE ty_citys,
      gs_ship  TYPE ty_ship,
      gs_city  TYPE ort01.

LOOP AT gt_ships INTO gs_ship WHERE route = 'R0001'.
  gs_city =  gs_ship-city.
  APPEND gs_city TO gt_citys.
ENDLOOP.

With 7.40
DATA(gt_citys) = VALUE ty_citys( FOR ls_ship IN gt_ships
                               WHERE ( route = 'R0001' ) ( ls_ship-city ) ).
Before 7.40

DATA: gt_itab TYPE ty_tab,
      j       TYPE i.
FIELD-SYMBOLS <ls_tab> TYPE ty_line.j= 1.

DO.
  j = j + 10.
  IF j > 40. EXIT. ENDIF.
  APPEND INITIAL LINE TO gt_itab ASSIGNING <ls_tab>.
  <ls_tab>-col1 = j.
  <ls_tab>-col2 = j + 1.
  <ls_tab>-col3 = j + 2.
ENDDO.

With 7.40
DATA(gt_itab) = VALUE ty_tab( FOR j = 11 THEN j + 10 UNTIL j > 40
                            ( col1 = j col2 = j + 1 col3 = j + 2  ) ).

   6、运算
                FOR for_exp1

Before 7.40

DATA: lv_lines TYPE i.

LOOP AT gt_itab INTO ls_itab where F1 = ‘XYZ’.
  lv_lines = lv_lines + 1.
ENDLOOP.

With 7.40
DATA(lv_lines) = REDUCE i( INIT x = 0 FOR wa IN gt_itab
                    WHERE( F1 = ‘XYZ’ ) NEXT x = x + 1 ).
Before 7.40

DATA: lv_line TYPE i,
      lv_sum  TYPE i.

LOOP AT gt_itab INTO lv_line.
  lv_sum = lv_sum + lv_line.
ENDLOOP.

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

TYPES outref TYPE REF TO if_demo_output.

DATA(output) = REDUCE outref( INIT out  = cl_demo_output=>new( )
                              text = `Count up:`
                              FOR n = 1 UNTIL n > 11
                              NEXT out = out->write( text )
                              text = |{ n }| ).
output->display( ).
 

         7、COND and SWITCH

COND
DATA(time) =  
  COND string(
    WHEN sy-timlo < '120000' THEN
      |{ sy-timlo TIME = ISO } AM|
    WHEN sy-timlo > '120000' THEN
      |{ CONV t( sy-timlo - 12 * 3600 )
       TIME = ISO } PM|
    WHEN sy-timlo = '120000' THEN
      |High Noon|
    ELSE
      THROW cx_cant_be( ) ).
SWITCH
DATA(text) =
NEW class( )->meth(
                     SWITCH #( sy-langu
                              WHEN 'D' THEN `DE`
                              WHEN 'E' THEN `EN`
                              ELSE THROW cx_langu_not_supported( ) ) ).

        8、操作

         CORRESPONDING type( [BASE ( base )] struct|itab [mapping|except] )

TYPES: BEGIN OF line1, col1 TYPE i, col2 TYPE i, END OF line1.
TYPES: BEGIN OF line2, col1 TYPE i, col2 TYPE i, col3 TYPE i, END OF line2.

DATA(ls_line1) = VALUE line1( col1 = 1 col2 = 2 ).
WRITE: / 'ls_line1 =' ,15 ls_line1-col1, ls_line1-col2.
DATA(ls_line2) = VALUE line2( col1 = 4 col2 = 5 col3 = 6 ).
WRITE: / 'ls_line2 =' ,15 ls_line2-col1, ls_line2-col2, ls_line2-col3.
SKIP 2.

ls_line2 = CORRESPONDING #( ls_line1 ).
WRITE: / 'ls_line2 = CORRESPONDING #( ls_line1 )'
     ,70 'Result is ls_line2 = '     
     ,ls_line2-col1, ls_line2-col2, ls_line2-col3.
SKIP.

ls_line2 = VALUE line2( col1 = 4 col2 = 5 col3 = 6 ).   "Restore ls_line2
ls_line2 = CORRESPONDING #( BASE ( ls_line2 ) ls_line1 ).
WRITE: / 'ls_line2 = CORRESPONDING #( BASE ( ls_line2 ) ls_line1 )'
        , 70 'Result is ls_line2 = ', ls_line2-col1
        , ls_line2-col2, ls_line2-col3.
SKIP.

ls_line2 = VALUE line2( col1 = 4 col2 = 5 col3 = 6 ).   "Restore ls_line2
DATA(ls_line3) = CORRESPONDING line2( BASE ( ls_line2 ) ls_line1 ).
WRITE: / 'DATA(ls_line3) = CORRESPONDING line2( BASE ( ls_line2 ) ls_line1 )'
         , 70 'Result is ls_line3 = ' , ls_line3-col1
         , ls_line3-col2, ls_line3-col3.

 9、字符串操作

Before 7.40

DATA itab TYPE TABLE OF scarr.
SELECT * FROM scarr INTO TABLE itab.

DATA wa LIKE LINE OF itab.
READ TABLE itab WITH KEY carrid = 'LH' INTO wa.

DATA output TYPE string.
CONCATENATE 'Carrier:' wa-carrname INTO output SEPARATED BY space.

cl_demo_output=>display( output ).

With 7.40

SELECT * FROM scarr INTO TABLE @DATA(lt_scarr).
cl_demo_output=>display( |Carrier: { lt_scarr[ carrid = 'LH' ]-carrname }|  ).

Before 7.40

DATA lv_output TYPE string.
CONCATENATE 'Hello' 'world' INTO lv_output SEPARATED BY space

With 7.40

DATA(lv_out) = |Hello| & | | & |world|.
Width/Alignment/Padding
WRITE / |{ 'Left'     WIDTH = 20 ALIGN = LEFT   PAD = '0' }|.
WRITE / |{ 'Centre'   WIDTH = 20 ALIGN = CENTER PAD = '0' }|.
WRITE / |{ 'Right'    WIDTH = 20 ALIGN = RIGHT  PAD = '0' }|.
Case
WRITE / |{ 'Text' CASE = (cl_abap_format=>c_raw) }|.
WRITE / |{ 'Text' CASE = (cl_abap_format=>c_upper) }|.
WRITE / |{ 'Text' CASE = (cl_abap_format=>c_lower) }|.
ALPHA conversion
DATA(lv_vbeln) = '0000012345'.
WRITE / |{ lv_vbeln  ALPHA = OUT }|.  “or ALPHA = IN to go in other direction
Date conversion
WRITE / |{ pa_date DATE = ISO }|.           “Date Format YYYY-MM-DD
WRITE / |{ pa_date DATE = User }|.          “As per user settings
WRITE / |{ pa_date DATE = Environment }|.   “As per Environment

 10、LOOP AT GROUP By

TYPES: BEGIN OF ty_employee,
         name TYPE char30,
         role TYPE char30,
         age  TYPE i,
END OF ty_employee,

ty_employee_t TYPE STANDARD TABLE OF ty_employee WITH KEY name.

DATA(gt_employee) = VALUE ty_employee_t(
( name = 'John'     role = 'ABAP guru'       age = 34 )
( name = 'Alice'     role = 'FI Consultant'   age = 42 )
( name = 'Barry'    role = 'ABAP guru'       age = 54 )
( name = 'Mary'     role = 'FI Consultant'   age = 37 )
( name = 'Arthur'   role = 'ABAP guru'       age = 34 )
( name = 'Mandy'  role = 'SD Consultant'  age = 64 ) ).

DATA: gv_tot_age TYPE i,
      gv_avg_age TYPE decfloat34.

"Loop with grouping on Role
LOOP AT gt_employee INTO DATA(ls_employee)
  GROUP BY ( role  = ls_employee-role
             size  = GROUP SIZE
             index = GROUP INDEX )
  ASCENDING
  ASSIGNING FIELD-SYMBOL(<group>).

  CLEAR: gv_tot_age.

  "Output info at group level
  WRITE: / |Group: { <group>-index }    Role: { <group>-role WIDTH = 15 }|
              & |     Number in this role: { <group>-size }|.

   "Loop at members of the group
   LOOP AT GROUP <group> ASSIGNING FIELD-SYMBOL(<ls_member>).
      gv_tot_age = gv_tot_age + <ls_member>-age.
      WRITE: /13 <ls_member>-name.
   ENDLOOP.

   "Average age
   gv_avg_age = gv_tot_age / <group>-size.
   WRITE: / |Average age: { gv_avg_age }|.

   SKIP.

ENDLOOP.

       11、Classes/Methods

Before 7.40


DATA: ls_lfa1  TYPE lfa1,
      lv_name1 TYPE lfa1-name1.

      ls_lfa1= My_Class=>get_lfa1( ).
      lv_name1 = ls_lfa1-name1.

With 7.40
DATA(lv_name1) = My_Class=>get_lfa1( )-name1.

             BOOLEAN

Before 7.40
IF My_Class=>return_boolean( ) = abap_true.

ENDIF.
With 7.40
IF My_Class=>return_boolean( ).

ENDIF.

         NEW operator

Before 7.40

DATA: lo_delivs TYPE REF TO zcl_sd_delivs,
      lo_deliv  TYPE REF TO zcl_sd_deliv.

CREATE OBJECT lo_delivs.
CREATE OBJECT lo_deliv.

lo_deliv = lo_delivs->get_deliv( lv_vbeln ).

With 7.40
DATA(lo_deliv) = new zcl_sd_delivs( )->get_deliv( lv_vbeln ).

12. Meshes

TYPES: BEGIN OF t_manager,
  name   TYPE char10,
  salary TYPE int4,
END OF t_manager,
tt_manager TYPE SORTED TABLE OF t_manager WITH UNIQUE KEY name.

TYPES: BEGIN OF t_developer,
  name    TYPE char10,
  salary  TYPE int4,
  manager TYPE char10,   "Name of manager
END OF t_developer,
tt_developer TYPE SORTED TABLE OF t_developer WITH UNIQUE KEY name.

TYPES: BEGIN OF MESH m_team,
         managers   TYPE tt_manager  ASSOCIATION my_employee TO developers
                      ON manager = name,
         developers TYPE tt_developer ASSOCIATION my_manager TO managers  
                      ON name = manager,
       END OF MESH m_team.

DATA: ls_team TYPE m_team.
ls_team-managers   = lt_manager.
ls_team-developers = lt_developer.

*Get details of Jerry's manager *

"get line of dev table
ASSIGN lt_developer[ name = 'Jerry' ] TO FIELD-SYMBOL(<ls_jerry>).
DATA(ls_jmanager) =  ls_team-developers\my_manager[ <ls_jerry> ].

WRITE: / |Jerry's manager: { ls_jmanager-name }|,30
         |Salary: { ls_jmanager-salary }|.

"Get Thomas' developers
SKIP.
WRITE: / |Thomas' developers:|.

"line of manager table
ASSIGN lt_manager[ name = 'Thomas' ] TO FIELD-SYMBOL(<ls_thomas>).
LOOP AT ls_team-managers\my_employee[ <ls_thomas> ]     
        ASSIGNING FIELD-SYMBOL(<ls_emp>).
  WRITE: / |Employee name: { <ls_emp>-name }|.
ENDLOOP.

 

 13. Filter

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.

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值