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/
![]()


