Mustafa HAMIT

ABAP 7.40 New Syntax: Yenilikler ve Örnekler

 Yeni ABAP versiyonu ile birlikte gelen modern özellikler ve geliştirilmiş syntax yapıları, kod yazımını hem daha kısa hem de daha okunabilir hale getirmiştir. Bu yazıda ABAP 7.40 ile hayatımıza giren önemli yenilikleri ve kullanım örneklerini inceleyebilirsiniz. Yeni ABAP versiyonunda gelen özellikler ve syntaxlar için aşağıda örnekler verilmiştir.

  • Değişken Tanımları
  • Tablo İfadeleri
  • Dönüşüm Operatörü CONV
  • Değer Operatörü VALUE
  • FOR Operatörü
  • Azaltma Operatörü REDUCE
  • Koşullu Operatörler COND ve SWITCH
  • Taşıma Operatörü CORRESPONDING
  • String Birleştirme Dönüşümler
  • LOOP AT GROUP BY
  • BOOLEAN kontrol
  • Classes/Methods
  • FILTER Operatörü

Değişken Tanımları

Data statement
Before 7.40
DATA text TYPE string.
text = 'ABC'.
With 7.40
DATA(text) = 'ABC'.
Loop at into work area
Before 7.40
DATA : itab TYPE TABLE OF ekpo,
       wa   LIKE LINE OF itab.

SELECT * FROM ekpo INTO CORRESPONDING FIELDS OF 

TABLE itab.

LOOP AT itab INTO wa.

ENDLOOP.
With 7.40
DATA : itab TYPE TABLE OF ekpo.

SELECT * FROM ekpo INTO CORRESPONDING FIELDS OF 

TABLE itab.

LOOP AT itab INTO DATA(wa).

ENDLOOP.
Loop at assigning
Before 7.40
DATA : itab TYPE TABLE OF ekpo.

SELECT * FROM ekpo INTO 

CORRESPONDING FIELDS OF 

TABLE itab.

FIELD-SYMBOLS: <line> TYPE any.

LOOP AT itab ASSIGNING <line>.

ENDLOOP.
With 7.40
DATA : itab TYPE TABLE OF ekpo.

SELECT * FROM ekpo INTO 

CORRESPONDING FIELDS OF 

TABLE itab.

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

ENDLOOP.
Read assigning
Before 7.40
DATA : itab TYPE TABLE OF ekpo.

SELECT * FROM ekpo INTO 

CORRESPONDING FIELDS OF 

TABLE itab.

FIELD-SYMBOLS: <line> TYPE any.

READ TABLE itab ASSIGNING <line> INDEX 1.
With 7.40
DATA : itab TYPE TABLE OF ekpo.

SELECT * FROM ekpo INTO 

CORRESPONDING FIELDS OF 

TABLE itab.

READ TABLE itab ASSIGNING FIELD-SYMBOL(<line>) INDEX 1.
Select into Table
Before 7.40
DATA : itab TYPE TABLE OF ekpo.

SELECT * FROM ekpo INTO CORRESPONDING FIELDS OF 

TABLE itab.
With 7.40
SELECT * FROM ekpo 

INTO TABLE @DATA(lt_ekpo).
Select single into
Before 7.40
DATA : ls_ekpo TYPE ekpo.

SELECT SINGLE * FROM ekpo 

INTO ls_ekpo.
With 7.40
SELECT SINGLE * FROM ekpo 

INTO @DATA(ls_ekpo).

Tablo İfadeleri

Read Table  index
Before 7.40
DATA : lt_ekpo TYPE TABLE OF ekpo,
       ls_ekpo LIKE LINE OF lt_ekpo.

SELECT * FROM ekpo 

INTO TABLE lt_ekpo.

READ TABLE lt_ekpo INTO ls_ekpo INDEX 1.
With 7.40
SELECT * FROM ekpo 

INTO TABLE @DATA(lt_ekpo).

DATA(ls_ekpo) = lt_ekpo[ 1 ].
Read Table  with key
Before 7.40
DATA : lt_ekpo TYPE TABLE OF ekpo,
       ls_ekpo LIKE LINE OF lt_ekpo.

SELECT * FROM ekpo INTO TABLE lt_ekpo.

READ TABLE lt_ekpo INTO ls_ekpo 

WITH KEY ebeln = '4500000000'.
With 7.40
SELECT * FROM ekpo INTO TABLE @DATA(lt_ekpo).

DATA(ls_ekpo) = lt_ekpo[ ebeln = '4500000000' ].
Does record exist?
Before 7.40
DATA : lt_ekpo TYPE TABLE OF ekpo.

SELECT * FROM ekpo INTO TABLE lt_ekpo.

READ TABLE lt_ekpo TRANSPORTING NO FIELDS 

WITH KEY ebeln = '4500000000'.

IF sy-subrc EQ 0.

ENDIF.
With 7.40
SELECT * FROM ekpo INTO TABLE @DATA(lt_ekpo).

IF line_exists( lt_ekpo[ ebeln = '4500000000' ] ).

ENDIF.
Get table index
Before 7.40
DATA : lt_ekpo TYPE TABLE OF ekpo,
       idx     TYPE sy-tabix.

SELECT * FROM ekpo INTO TABLE lt_ekpo.

READ TABLE lt_ekpo TRANSPORTING NO FIELDS 

WITH KEY ebeln = '4500000000'.

IF sy-subrc EQ 0.
  idx = sy-tabix.
ENDIF.
With 7.40
SELECT * FROM ekpo INTO TABLE @DATA(lt_ekpo).

DATA(idx) = line_index( lt_ekpo[ ebeln = '4500000000' ] ).

Dönüşüm Operatörü CONV

Before 7.40
DATA : text   TYPE c LENGTH 255 VALUE 'MUSTAFA',
       helper TYPE string,
       xstr   TYPE xstring.

helper = text.

xstr = cl_abap_codepage=>convert_to( source = helper ).
With 7.40
DATA text TYPE c LENGTH 255 VALUE 'MUSTAFA'.

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

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

Değer Operatörü VALUE

Structure örneği;

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

TYPES: BEGIN OF ty_columns2,
         coln1 TYPE i,
         coln2 TYPE ty_columns1,
       END OF ty_columns2.

DATA: struc_simple TYPE ty_columns1,
      struc_nest   TYPE ty_columns2.

struc_nest = VALUE ty_columns2( coln1 = 1 coln2-cols1 = 1 coln2-cols2 = 2 ).

Tablo ve Range örneği;

TYPES t_itab TYPE TABLE OF i WITH EMPTY KEY.

DATA itab TYPE t_itab.

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


DATA lr_exam TYPE RANGE OF i.

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

FOR Operatörü

TYPES:
  BEGIN OF ty_customer,
    customer TYPE char10,
    name     TYPE char30,
    city     TYPE char30,
    route    TYPE char10,
  END   OF ty_customer.
TYPES: tt_customers TYPE SORTED TABLE OF ty_customer
          WITH UNIQUE KEY customer.

TYPES: tt_citys TYPE STANDARD TABLE OF char30 WITH EMPTY KEY.

DATA(t_customres) =
  VALUE tt_customers(
    ( customer = 'C0001' name = 'Test Customer 1' city = 'NY' route = 'R0001' )
    ( customer = 'C0002' name = 'Customer 2'      city = 'LA' route = 'R0003' )
    ( customer = 'C0003' name = 'Good Customer 3' city = 'DFW' route = 'R0001' )
    ( customer = 'C0004' name = 'Best Customer 4' city = 'CH' route = 'R0003' )
  ).
Before 7.40
DATA : wa_cus  LIKE LINE OF t_customres,
       ls_city TYPE char30,
       lt_city TYPE tt_citys.

LOOP AT t_customres INTO wa_cus.
  MOVE wa_cus-city TO ls_city.
  APPEND ls_city TO lt_city.
ENDLOOP.
With 7.40
DATA(t_city) =
  VALUE tt_citys(
    FOR ls_cust IN t_customres
    ( ls_cust-city )
  ).

FOR with THEN and UNTIL|WHILE

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.
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_itab2) = VALUE ty_tab( FOR i = 11 THEN i + 10 UNTIL i > 40
                            ( col1 = i col2 = i + 1 col3 = i + 2  ) ).

Azaltma Operatörü REDUCE

Before 7.40
SELECT * FROM ekko INTO TABLE @DATA(lt_ekko).

DATA: lv_lines TYPE i.

LOOP AT lt_ekko TRANSPORTING NO FIELDS WHERE bsart EQ 'ZXNB'.
  lv_lines = lv_lines + 1.
ENDLOOP.
With 7.40
DATA(lv_line) = REDUCE i( INIT x = 0 FOR wa IN lt_ekko
                    WHERE ( bsart EQ 'ZXNB' ) NEXT x = x + 1 ).

 

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

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_sumx) = REDUCE i( INIT x = 0 FOR wa IN gt_itab NEXT x = x + wa ).

Koşullu Operatörler COND ve SWITCH

Örnek 1

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 EQ '120000' THEN |High Noon|
    ELSE 'ERROR' ).

WRITE time.

Örnek 2

DATA(text) = SWITCH #( sy-langu WHEN 'D' THEN 'DE'
                                WHEN 'E' THEN 'EN'
                                ELSE 'OTHER' ).

WRITE text.

Örnek 3

DATA(lv_text) = NEW char10( 'ABCD@#@#' ).
DATA(lv_output) = NEW char10( ).

DO 10 TIMES.
  DATA(lv_offset) = NEW i( sy-index - 1 ).
  DATA(lv_char_part) = NEW char1( lv_text->*+lv_offset->*(1) ).
  DATA(lv_new_part) =
    SWITCH char1( lv_char_part->*
                  WHEN 'A' THEN 'Z'
                  WHEN 'B' THEN 'Y'
                  WHEN 'C' THEN 'X'
                  WHEN 'D' THEN 'W'
                  ELSE 0
    ).
  lv_output->*+lv_offset->*(1) = lv_new_part.
ENDDO.

WRITE: lv_output->*.

Taşıma Operatörü CORRESPONDING 

DATA ls_ekpo2 TYPE ekpo.
SELECT * FROM ekpo INTO TABLE @DATA(lt_ekpo).

DATA(ls_ekpo) = lt_ekpo[ 1 ].



MOVE-CORRESPONDING ls_ekpo TO ls_ekpo2.


ls_ekpo2 = CORRESPONDING #( ls_ekpo ).

String Birleştirme Dönüşümler

CONCATENATE

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 = 10 ALIGN = LEFT   PAD = '0' }|.
WRITE / |{ 'Centre'   WIDTH = 10 ALIGN = CENTER PAD = '0' }|.
WRITE / |{ 'Right'    WIDTH = 10 ALIGN = RIGHT  PAD = '0' }|.

Left000000

00Centre00

00000Right

Upper/Lower CASE

DATA(text) = 'Text'.

TRANSLATE text TO LOWER CASE.
TRANSLATE text TO UPPER 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 Çevirici

DATA(lv_vbeln) = '0000012345'.

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
  EXPORTING
    input  = lv_vbeln
    output = lv_vbeln.

WRITE / |{ lv_vbeln  ALPHA = OUT }|.

Tarih Çevirici

DATA(pa_date) = sy-datum.

WRITE / pa_date DD/MM/YYYY.

WRITE / |{ pa_date DATE = ISO }|.
WRITE / |{ pa_date DATE = USER }|.
WRITE / |{ pa_date DATE = ENVIRONMENT }|.

2018-12-03

03.12.2018

03.12.2018

LOOP AT GROUP BY

TYPES:
  BEGIN OF ty_customer,
    customer TYPE char10,
    name     TYPE char30,
    city     TYPE char30,
    route    TYPE char10,
  END   OF ty_customer.
TYPES: tt_customers TYPE SORTED TABLE OF ty_customer
          WITH UNIQUE KEY customer.

TYPES: tt_citys TYPE STANDARD TABLE OF char30 WITH EMPTY KEY.

DATA(t_customres) =
VALUE tt_customers(
  ( customer = 'C0001' name = 'Test Customer 1' city = 'NY' route = 'R0001' )
  ( customer = 'C0002' name = 'Customer 2'      city = 'LA' route = 'R0003' )
  ( customer = 'C0003' name = 'Good Customer 3' city = 'DFW' route = 'R0001' )
  ( customer = 'C0004' name = 'Best Customer 4' city = 'CH' route = 'R0003' )
  ( customer = 'C0005' name = 'So So Customer 5' city = 'NY' route = 'R0001' )
).


DATA(ls_read) = t_customres[ 1 ].

LOOP AT t_customres INTO DATA(ls_cust_2)
     GROUP BY  ( route = ls_cust_2-route )
      ASCENDING
      REFERENCE INTO DATA(route_group_2).

  WRITE: / route_group_2->route.

ENDLOOP.

R0001

R0003

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

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

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

  gv_avg_age = gv_tot_age / <group>-size.

  WRITE: / |Average age: { gv_avg_age }|.

  SKIP.

ENDLOOP.

BOOLEAN kontrol

DATA lv_bool TYPE boolean.

IF lv_bool EQ abap_true.
  WRITE 'TRUE'.
ELSE.
  WRITE 'FALSE'.
ENDIF.

Classes/Methods

Before 7.40
DATA : gr_report TYPE REF TO lcl_report.

CREATE OBJECT gr_report.
With 7.40
DATA(gr_report) = NEW lcl_report( ).

 

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.

 FILTER Operatörü

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

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.

Abap’ta Open SQL nasıl kullanılır, bunu merak ediyorsanız, bu yazıyı inceleyebilirsiniz.

Link: https://www.mustafahamit.com/abap-open-sql-select-into-where-join/

 

Loading