Smithery Logo
MCPsSkillsDocsPricing
Login
Smithery Logo

Accelerating the Agent Economy

Resources

DocumentationPrivacy PolicySystem Status

Company

PricingAboutBlog

Connect

© 2026 Smithery. All rights reserved.

    secondsky

    sap-abap

    secondsky/sap-abap
    Coding
    26
    3 installs

    About

    SKILL.md

    Install

    Install via Skills CLI

    or add to your agent
    • Claude Code
      Claude Code
    • Codex
      Codex
    • OpenClaw
      OpenClaw
    • Cursor
      Cursor
    • Amp
      Amp
    • GitHub Copilot
      GitHub Copilot
    • Gemini CLI
      Gemini CLI
    • Kilo Code
      Kilo Code
    • Junie
      Junie
    • Replit
      Replit
    • Windsurf
      Windsurf
    • Cline
      Cline
    • Continue
      Continue
    • OpenCode
      OpenCode
    • OpenHands
      OpenHands
    • Roo Code
      Roo Code
    • Augment
      Augment
    • Goose
      Goose
    • Trae
      Trae
    • Zencoder
      Zencoder
    • Antigravity
      Antigravity
    ├─
    ├─
    └─

    About

    Comprehensive ABAP development skill for SAP systems.

    SKILL.md

    SAP ABAP Development Skill

    Related Skills

    • sap-abap-cds: Use when developing CDS views for ABAP-backed Fiori applications or defining data models with annotations
    • sap-btp-cloud-platform: Use when working with ABAP Environment on BTP or deploying ABAP applications to the cloud
    • sap-cap-capire: Use when connecting ABAP systems with CAP applications or integrating with OData services
    • sap-fiori-tools: Use when building Fiori applications with ABAP backends or consuming OData services from ABAP systems
    • sap-api-style: Use when documenting ABAP APIs or following SAP API documentation standards

    Version Compatibility

    This skill covers ABAP syntax from 7.40 SP08 through ABAP Cloud. Features requiring a higher release are annotated with inline comments in code examples using the format " [7.xx+] or noted in reference files. The table below summarizes the key version boundaries.

    Feature 7.40 SP02 7.40 SP05 7.40 SP08 7.50 7.51 7.52 7.54
    Inline declarations DATA(...) x x x x x x x
    Constructor operators (VALUE, NEW, CONV, COND, SWITCH, REF, EXACT, CAST) x x x x x x x
    Table expressions itab[...] x x x x x x x
    String templates x x x x x x x
    WITH EMPTY KEY x x x x x x x
    line_exists(), line_index() x x x x x x x
    ABAP SQL: @ host variables x x x x x x
    ABAP SQL: comma-separated lists x x x x x x
    ABAP SQL: SQL expressions in SELECT x x x x x x
    CORRESPONDING operator x x x x x x
    Table comprehensions (FOR) x x x x x x
    LET expressions x x x x x x
    REDUCE operator x x x x x
    FILTER operator x x x x x
    BASE addition x x x x x
    LOOP AT ... GROUP BY x x x x x
    ABAP SQL: dbtab~* in SELECT x x x x x
    ABAP SQL: RIGHT OUTER JOIN x x x x x x
    CDS views with parameters x x x x x
    FINAL(...) inline declaration x x x x
    Host expressions @( expr ) x x x x
    UNION in SELECT x x x x
    IS INSTANCE OF / CASE TYPE OF x x x x
    int8 type x x x x
    CDS table functions x x x x
    CDS access control (implicit) x x x x
    $session.user/client/system_language x x x x
    Test seams (TEST-SEAM) x x x x
    Common Table Expressions (WITH) x x x
    OFFSET in SELECT x x x
    UPPER/LOWER in CDS x x x
    Enumerated types x x x
    Internal tables as data source FROM @itab x x
    WITH PRIVILEGED ACCESS x x
    utclong type and functions x

    On a 7.40 system: Replace any FINAL(...) with DATA(...), and avoid 7.50+ features marked in bold above. Most modern ABAP syntax (VALUE, NEW, CONV, inline declarations, table expressions, REDUCE, FILTER, GROUP BY) is available since 7.40 SP08.

    Table of Contents

    • Version Compatibility
    • Quick Reference
    • Bundled Resources
    • Common Patterns
    • Error Catalog
    • Performance Tips
    • Source Documentation

    Quick Reference

    Data Types and Declarations

    " Elementary types
    DATA num TYPE i VALUE 123.
    DATA txt TYPE string VALUE `Hello`.
    DATA flag TYPE abap_bool VALUE abap_true.
    
    " Inline declarations
    DATA(result) = some_method( ).
    FINAL(immutable) = `constant value`.              " [7.50+] Use DATA(...) on 7.40
    
    " Structures
    DATA: BEGIN OF struc,
            id   TYPE i,
            name TYPE string,
          END OF struc.
    
    " Internal tables
    DATA itab TYPE TABLE OF string WITH EMPTY KEY.
    DATA sorted_tab TYPE SORTED TABLE OF struct WITH UNIQUE KEY id.
    DATA hashed_tab TYPE HASHED TABLE OF struct WITH UNIQUE KEY id.
    

    Internal Tables - Essential Operations

    " Create with VALUE
    itab = VALUE #( ( col1 = 1 col2 = `a` )
                    ( col1 = 2 col2 = `b` ) ).
    
    " Read operations
    DATA(line) = itab[ 1 ].                    " By index
    DATA(line2) = itab[ col1 = 1 ].            " By key
    READ TABLE itab INTO wa INDEX 1.
    READ TABLE itab ASSIGNING FIELD-SYMBOL(<fs>) WITH KEY col1 = 1.
    
    " Modify operations
    MODIFY TABLE itab FROM VALUE #( col1 = 1 col2 = `updated` ).
    itab[ 1 ]-col2 = `changed`.
    
    " Loop processing
    LOOP AT itab ASSIGNING FIELD-SYMBOL(<line>).
      <line>-col2 = to_upper( <line>-col2 ).
    ENDLOOP.
    
    " Delete
    DELETE itab WHERE col1 > 5.
    DELETE TABLE itab FROM VALUE #( col1 = 1 ).
    

    ABAP SQL Essentials

    " SELECT into table
    SELECT * FROM dbtab INTO TABLE @DATA(result_tab).   " @ syntax: 7.40 SP05+
    
    " SELECT with conditions
    SELECT carrid, connid, fldate                          " comma syntax: 7.40 SP05+
      FROM zdemo_abap_fli
      WHERE carrid = 'LH'
      INTO TABLE @DATA(flights).
    
    " Aggregate functions
    SELECT carrid, COUNT(*) AS cnt, AVG( price ) AS avg_price
      FROM zdemo_abap_fli
      GROUP BY carrid
      INTO TABLE @DATA(stats).
    
    " JOIN operations
    SELECT a~carrid, a~connid, b~carrname
      FROM zdemo_abap_fli AS a
      INNER JOIN zdemo_abap_carr AS b ON a~carrid = b~carrid
      INTO TABLE @DATA(joined).
    
    " Modification statements
    INSERT dbtab FROM @struc.
    UPDATE dbtab FROM @struc.
    MODIFY dbtab FROM TABLE @itab.
    DELETE FROM dbtab WHERE condition.
    

    Constructor Expressions

    " VALUE - structures and tables
    DATA(struc) = VALUE struct_type( comp1 = 1 comp2 = `text` ).
    DATA(itab) = VALUE itab_type( ( a = 1 ) ( a = 2 ) ( a = 3 ) ).
    
    " NEW - create instances
    DATA(dref) = NEW i( 123 ).
    DATA(oref) = NEW zcl_my_class( param = value ).
    
    " CORRESPONDING - structure/table mapping
    target = CORRESPONDING #( source ).
    target = CORRESPONDING #( source MAPPING target_field = source_field ).
    
    " COND/SWITCH - conditional values
    DATA(text) = COND string( WHEN flag = abap_true THEN `Yes` ELSE `No` ).
    DATA(result) = SWITCH #( code WHEN 1 THEN `A` WHEN 2 THEN `B` ELSE `X` ).
    
    " CONV - type conversion
    DATA(dec) = CONV decfloat34( 1 / 3 ).
    
    " FILTER - table filtering
    DATA(filtered) = FILTER #( itab WHERE status = 'A' ).
    
    " REDUCE - aggregation
    DATA(sum) = REDUCE i( INIT s = 0 FOR wa IN itab NEXT s = s + wa-amount ).
    

    Object-Oriented ABAP

    " Class definition
    CLASS zcl_example DEFINITION PUBLIC FINAL CREATE PUBLIC.
      PUBLIC SECTION.
        METHODS constructor IMPORTING iv_name TYPE string.
        METHODS get_name RETURNING VALUE(rv_name) TYPE string.
        CLASS-METHODS factory RETURNING VALUE(ro_instance) TYPE REF TO zcl_example.
      PRIVATE SECTION.
        DATA mv_name TYPE string.
    ENDCLASS.
    
    CLASS zcl_example IMPLEMENTATION.
      METHOD constructor.
        mv_name = iv_name.
      ENDMETHOD.
      METHOD get_name.
        rv_name = mv_name.
      ENDMETHOD.
      METHOD factory.
        ro_instance = NEW #( `Default` ).
      ENDMETHOD.
    ENDCLASS.
    
    " Interface implementation
    CLASS zcl_impl DEFINITION PUBLIC.
      PUBLIC SECTION.
        INTERFACES zif_my_interface.
    ENDCLASS.
    

    Exception Handling

    TRY.
        DATA(result) = risky_operation( ).
      CATCH cx_sy_zerodivide INTO DATA(exc).
        DATA(msg) = exc->get_text( ).
      CATCH cx_root INTO DATA(any_exc).
        " Handle any exception
      CLEANUP.
        " Cleanup code
    ENDTRY.
    
    " Raising exceptions
    RAISE EXCEPTION TYPE zcx_my_exception
      EXPORTING textid = zcx_my_exception=>error_occurred.
    
    " With COND/SWITCH
    DATA(val) = COND #( WHEN valid THEN result
                        ELSE THROW zcx_my_exception( ) ).
    

    String Processing

    " Concatenation
    DATA(full) = first && ` ` && last.
    txt &&= ` appended`.
    
    " String templates
    DATA(msg) = |Name: { name }, Date: { date DATE = ISO }|.
    
    " Functions
    DATA(upper) = to_upper( text ).
    DATA(len) = strlen( text ).
    DATA(found) = find( val = text sub = `search` ).
    DATA(replaced) = replace( val = text sub = `old` with = `new` occ = 0 ).
    DATA(parts) = segment( val = text index = 2 sep = `,` ).
    
    " FIND/REPLACE statements
    FIND ALL OCCURRENCES OF pattern IN text RESULTS DATA(matches).
    REPLACE ALL OCCURRENCES OF old IN text WITH new.
    

    Dynamic Programming

    " Field symbols
    FIELD-SYMBOLS <fs> TYPE any.
    ASSIGN struct-component TO <fs>.
    ASSIGN struct-(comp_name) TO <fs>.  " Dynamic component
    
    " Data references
    DATA dref TYPE REF TO data.
    dref = REF #( variable ).
    CREATE DATA dref TYPE (type_name).
    dref->* = value.
    
    " RTTI - Get type information
    DATA(tdo) = cl_abap_typedescr=>describe_by_data( dobj ).
    DATA(components) = CAST cl_abap_structdescr( tdo )->components.
    
    " RTTC - Create types dynamically
    DATA(elem_type) = cl_abap_elemdescr=>get_string( ).
    CREATE DATA dref TYPE HANDLE elem_type.
    

    Bundled Resources

    This skill includes 28 comprehensive reference files covering all aspects of ABAP development:

    Related Skills

    • sap-abap-cds: For CDS view development and ABAP Cloud data modeling
    • sap-btp-cloud-platform: For ABAP Environment setup and BTP deployment
    • sap-cap-capire: For CAP service integration and ABAP system connections
    • sap-fiori-tools: For Fiori application development with ABAP backends
    • sap-api-style: For API documentation standards and best practices

    Quick Access

    • Reference Guide: references/skill-reference-guide.md - Complete guide to all reference files
    • Internal Tables: references/internal-tables.md - Complete table operations
    • ABAP SQL: references/abap-sql.md - Comprehensive SQL reference
    • Object Orientation: references/object-orientation.md - Classes and interfaces

    Development Topics

    • references/constructor-expressions.md - VALUE, NEW, COND, REDUCE
    • references/rap-eml.md - RAP and EML operations
    • references/cds-views.md - CDS view development
    • references/string-processing.md - String functions and regex
    • references/unit-testing.md - ABAP Unit framework
    • references/performance.md - Optimization techniques
    • ... and 18 more specialized references

    Common Patterns

    Safe Table Access (Avoid Exceptions)

    " Using VALUE with OPTIONAL
    DATA(line) = VALUE #( itab[ key = value ] OPTIONAL ).
    
    " Using VALUE with DEFAULT
    DATA(line) = VALUE #( itab[ 1 ] DEFAULT VALUE #( ) ).
    
    " Check before access
    IF line_exists( itab[ key = value ] ).
      DATA(line) = itab[ key = value ].
    ENDIF.
    

    Functional Method Chaining

    DATA(result) = NEW zcl_builder( )
      ->set_name( `Test` )
      ->set_value( 123 )
      ->build( ).
    

    FOR Iteration Expressions

    " Transform table
    DATA(transformed) = VALUE itab_type(
      FOR wa IN source_itab
      ( id = wa-id name = to_upper( wa-name ) ) ).
    
    " With WHERE
    DATA(filtered) = VALUE itab_type(
      FOR wa IN source WHERE ( status = 'A' )
      ( wa ) ).
    
    " With INDEX INTO
    DATA(numbered) = VALUE itab_type(
      FOR wa IN source INDEX INTO idx
      ( line_no = idx data = wa ) ).
    

    ABAP Cloud Compatibility

    " Use released APIs only
    DATA(uuid) = cl_system_uuid=>create_uuid_x16_static( ).
    DATA(date) = xco_cp=>sy->date( )->as( xco_cp_time=>format->iso_8601_extended )->value.
    DATA(time) = xco_cp=>sy->time( )->as( xco_cp_time=>format->iso_8601_extended )->value.
    
    " Output in cloud (if_oo_adt_classrun)
    out->write( result ).
    
    " Avoid: sy-datum, sy-uzeit, DESCRIBE TABLE, WRITE, MOVE...TO
    

    ABAP 7.40 Compatibility

    When targeting ABAP 7.40 systems, replace 7.50+ syntax with these patterns:

    " Instead of FINAL (7.50+):
    FINAL(value) = `constant`.              " 7.50+
    DATA(value) = `constant`.               " 7.40 compatible
    
    " Instead of host expressions (7.50+):
    SELECT * FROM dbtab WHERE col = @( lv_val ).   " 7.50+
    SELECT * FROM dbtab WHERE col = @lv_val.        " 7.40 compatible
    
    " Instead of UNION (7.50+):
    SELECT a FROM tab1 UNION SELECT a FROM tab2.    " 7.50+
    " Use two separate SELECTs on 7.40 and combine in ABAP:
    SELECT a FROM tab1 INTO TABLE @DATA(r1).
    SELECT a FROM tab2 INTO TABLE @DATA(r2).
    DATA(combined) = VALUE itab_type( FOR l1 IN r1 ( l1 )
                                      FOR l2 IN r2 ( l2 ) ).
    
    " Instead of IS INSTANCE OF (7.50+):
    IF oref IS INSTANCE OF zcl_my_class.    " 7.50+
    " 7.40 alternative — use typed CAST with exception handling:
    TRY.
        DATA(lo) = CAST zcl_my_class( oref ).  " 7.40+
      CATCH cx_sy_move_cast_error.
        " oref is not compatible with zcl_my_class
    ENDTRY.
    
    " Instead of CTEs WITH (7.51+):
    WITH +cte AS ( SELECT ... ) SELECT ...  " 7.51+
    " Use subqueries or temporary tables on 7.40
    

    Error Catalog

    CX_SY_ITAB_LINE_NOT_FOUND

    Cause: Table expression access to non-existent line Solution: Use OPTIONAL, DEFAULT, or check with line_exists( )

    CX_SY_ZERODIVIDE

    Cause: Division by zero Solution: Check divisor before operation

    CX_SY_RANGE_OUT_OF_BOUNDS

    Cause: Invalid substring access or array bounds Solution: Validate offset and length before access

    CX_SY_CONVERSION_NO_NUMBER

    Cause: String cannot be converted to number Solution: Validate input format before conversion

    CX_SY_REF_IS_INITIAL

    Cause: Dereferencing unbound reference Solution: Check IS BOUND before dereferencing


    Performance Tips

    1. Use SORTED/HASHED tables for frequent key access
    2. Prefer field symbols over work areas in loops for modification
    3. Use PACKAGE SIZE for large SELECT results
    4. Avoid SELECT in loops - use FOR ALL ENTRIES or JOINs
    5. Use secondary keys for different access patterns
    6. Minimize CORRESPONDING calls - explicit assignments are faster

    Source Documentation

    All content based on SAP official ABAP Cheat Sheets:

    • Repository: https://github.com/SAP-samples/abap-cheat-sheets
    • SAP Help (latest): https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm
    • SAP Help (7.40): https://help.sap.com/doc/abapdocu_740_index_htm/7.40/en-US/index.htm
    • ABAP Release News: https://github.com/SAP-samples/abap-cheat-sheets/blob/main/33_ABAP_Release_News.md
    Repository
    secondsky/sap-skills
    Files