ABAP Cheat Sheet
Core ABAP syntax for SAP development, covering data declarations, control flow, internal tables, and Open SQL statements.
Data Declarations
Declaring variables, constants, and types.
DATA: lv_name TYPE string, lv_count TYPE i VALUE 0, lv_price TYPE p DECIMALS 2.CONSTANTS: c_max TYPE i VALUE 100.TYPES: BEGIN OF ty_person, name TYPE string, age TYPE i, END OF ty_person.DATA ls_person TYPE ty_person.ls_person-name = 'Alice'.WRITE: / 'Hello, World!'.
Control Flow
Conditionals and loops.
IF lv_count > 0. WRITE: / 'Positive'.ELSEIF lv_count < 0. WRITE: / 'Negative'.ELSE. WRITE: / 'Zero'.ENDIF.CASE lv_status. WHEN 'A'. WRITE: / 'Active'. WHEN 'I'. WRITE: / 'Inactive'. WHEN OTHERS. WRITE: / 'Unknown'.ENDCASE.DO 5 TIMES. WRITE: / sy-index.ENDDO.WHILE lv_count < 10. lv_count = lv_count + 1.ENDWHILE.
Internal Tables
Declaring and working with internal tables.
DATA: lt_table TYPE TABLE OF spfli, ls_line TYPE spfli.APPEND ls_line TO lt_table.INSERT ls_line INTO lt_table INDEX 1.LOOP AT lt_table INTO ls_line. WRITE: / ls_line-carrid, ls_line-connid.ENDLOOP.READ TABLE lt_table INTO ls_line INDEX 1.DELETE lt_table INDEX 1.SORT lt_table BY carrid.
Open SQL
Reading database tables directly in ABAP.
SELECT * FROM spfli INTO TABLE @DATA(lt_flights) WHERE carrid = 'LH'.SELECT SINGLE carrid connid FROM spfli INTO (@lv_carrid, @lv_connid) WHERE carrid = 'LH' AND connid = '0400'.UPDATE spfli SET price = 500 WHERE carrid = 'LH'.
Modern ABAP SQL & Inline Declarations
SELECT with @DATA inline targets, host expressions, and joins.
SELECT c~carrid, c~carrname, p~connid FROM scarr AS c INNER JOIN spfli AS p ON p~carrid = c~carrid WHERE c~carrid = @lv_carrid INTO TABLE @DATA(lt_flights).IF sy-subrc = 0. SELECT SINGLE carrname FROM scarr WHERE carrid = @lv_carrid INTO @DATA(lv_name).ENDIF.
Classes & Methods (ABAP Objects)
Local class definition, implementation, and instantiation.
CLASS lcl_calc DEFINITION. PUBLIC SECTION. METHODS add IMPORTING iv_a TYPE i iv_b TYPE i RETURNING VALUE(rv_sum) TYPE i.ENDCLASS.CLASS lcl_calc IMPLEMENTATION. METHOD add. rv_sum = iv_a + iv_b. ENDMETHOD.ENDCLASS.DATA(lo_calc) = NEW lcl_calc( ).DATA(lv_r) = lo_calc->add( iv_a = 2 iv_b = 3 ).
Internal Table Operations
Modern expressions for reading and processing internal tables.
- READ TABLE ... INTO ... WITH KEY- locate a row; sets sy-subrc and sy-tabix
- lt_tab[ key = value ]- table expression read; raises CX_SY_ITAB_LINE_NOT_FOUND if absent
- LOOP AT lt_tab INTO/ASSIGNING- iterate; ASSIGNING <fs> avoids a copy and allows in-place change
- VALUE #( ... )- constructor expression to build a table or structure inline
- FOR ... IN ( REDUCE / FILTER )- functional-style table comprehensions and aggregation
- SORT lt_tab BY field ASCENDING- sort in place by one or more columns
- DELETE lt_tab WHERE cond- remove matching rows; use ADJACENT DUPLICATES to dedupe
String Processing & Templates
String templates, operations, and conversions.
DATA(lv_name) = |Hello { lv_first } { lv_last }|.DATA(lv_up) = to_upper( lv_name ).DATA(lv_len) = strlen( lv_name ).SPLIT lv_csv AT ',' INTO TABLE DATA(lt_parts).CONCATENATE lv_a lv_b INTO DATA(lv_c) SEPARATED BY space.REPLACE ALL OCCURRENCES OF 'x' IN lv_name WITH 'y'.FIND REGEX '\d+' IN lv_name MATCH OFFSET DATA(lv_off).
Prefer the inline declaration `@DATA(...)` in SELECT statements over pre-declaring work areas — it keeps variables tightly scoped and lets the compiler infer the correct table type from the query.