agentsclimarketplace

Sap abap advanced

Skill efeumutaslan/SAP-SKILLS/skills/sap-abap-advanced

23 SAP development skills for Claude Code — ABAP, RAP, CAP, Fiori, BTP, HANA, S/4HANA, Integration Suite and more. Agent Skills Specification compatible.

Install
npx -y skills add efeumutaslan/SAP-SKILLS --skill sap-abap-advanced

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 4 stars4 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Advanced ABAP development skill extending the base sap-abap skill. Use when working with ABAP Cloud (Tier 1) vs Classic (Tier 2), AMDP for HANA pushdown, abapGit workflows, released API checks, or RTTI/RTTC dynamic programming. If the user mentions ABAP Cloud, Steampunk, AMDP, abapGit, Tier 1/Tier 2 API, or classic-to-cloud migration, use this skill.

The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

14.9 KB, as published. Nobody here has run it

Advanced ABAP — Cloud, HANA-Optimized & Modern Patterns

Related Skills

  • sap-abap — Base ABAP skill (syntax, internal tables, OOP fundamentals)
  • sap-rap-comprehensive — RAP Business Objects built with ABAP Cloud
  • sap-hana-cloud — HANA database features consumed via AMDP
  • sap-devops-cicd — abapGit + gCTS pipeline integration
  • sap-migration — Classic → Cloud ABAP migration

Quick Start

ABAP Cloud (Tier 1) vs Classic ABAP (Tier 2):

AspectABAP Cloud (Tier 1)Classic ABAP (Tier 2)
API AccessReleased APIs onlyAll APIs (including internal)
WhereBTP Steampunk, S/4HANA Cloud PublicS/4HANA Private, On-Premise
Language versionABAP for Cloud DevelopmentStandard ABAP
DB accessABAP SQL only (no native SQL)ABAP SQL + Native SQL + ADBC
ExtensibilityRAP, Released BAdIs onlyAll enhancement techniques
NamingNamespace /.../ or Z/Y with prefixZ/Y prefix

Check if API is released:

" In ADT: Open element → Properties → API State
" Or: ABAP Cloud: compilation error if not released
" Or: Cloudification Repository (api.sap.com)

Core Concepts

ABAP Cloud Restrictions

What you cannot use in ABAP Cloud:

  • SELECT ... FROM <db_table> on non-released tables → Use released CDS views
  • CALL FUNCTION on non-released FMs → Use released APIs/classes
  • WRITE / SUBMIT / CALL TRANSACTION → Use RAP / HTTP services
  • SY-SUBRC after non-ABAP-SQL statements → Use exceptions
  • INCLUDE, FORM/PERFORM → Use classes/methods
  • Direct DB modifications (INSERT/UPDATE/DELETE dbtab) on non-owned tables

ABAP Language Version (Since 2022)

" Set in class/interface/program attributes:
" Option 1: ABAP for Cloud Development (Tier 1 — released APIs only)
" Option 2: Standard ABAP (Tier 2 — full access)
" Option 3: ABAP for Key Users (limited, no-code)

" Check programmatically:
DATA(lv_version) = cl_abap_context_info=>get_abap_language_version( ).
" Returns: 'CLOUD' | 'STANDARD' | 'KEYUSER'

Released API Categories

CategoryExampleCheck Method
Released CDS ViewI_BusinessPartnerPrefix I_ or C_, annotation @ObjectModel.usageType
Released ClassCL_BCS_MAIL_MESSAGEADT: API State = Released
Released InterfaceIF_HTTP_SERVICE_EXTENSIONADT: API State = Released
Released BAdIBADI_IDENTITY_CHECKEnhancement Spot → Released flag
Released RAP BOI_BankTPBehavior definition → Released

Common Patterns

Pattern 1: AMDP — ABAP Managed Database Procedures

CLASS zcl_amdp_examples DEFINITION PUBLIC.
  PUBLIC SECTION.
    INTERFACES if_amdp_marker_hdb.

    TYPES: BEGIN OF ty_sales_summary,
             customer_id TYPE vbak-kunnr,
             total_amount TYPE vbak-netwr,
             order_count TYPE i,
             avg_amount TYPE vbak-netwr,
           END OF ty_sales_summary,
           tt_sales_summary TYPE STANDARD TABLE OF ty_sales_summary WITH EMPTY KEY.

    " Table function (consumed in CDS)
    CLASS-METHODS get_sales_summary
      FOR TABLE FUNCTION z_tf_sales_summary.

    " Regular AMDP method
    CLASS-METHODS calculate_running_total
      IMPORTING VALUE(iv_customer) TYPE kunnr
                VALUE(iv_year)     TYPE gjahr
      EXPORTING VALUE(et_result)   TYPE tt_sales_summary
      RAISING   cx_amdp_execution_error.
ENDCLASS.

CLASS zcl_amdp_examples IMPLEMENTATION.
  METHOD get_sales_summary BY DATABASE FUNCTION
    FOR HDB
    LANGUAGE SQLSCRIPT
    OPTIONS READ-ONLY
    USING vbak vbap.

    RETURN SELECT
      k.kunnr AS customer_id,
      SUM(p.netwr) AS total_amount,
      COUNT(DISTINCT k.vbeln) AS order_count,
      AVG(p.netwr) AS avg_amount
    FROM vbak AS k
    INNER JOIN vbap AS p ON k.vbeln = p.vbeln
    WHERE k.erdat >= :iv_date_from
      AND k.erdat <= :iv_date_to
    GROUP BY k.kunnr;
  ENDMETHOD.

  METHOD calculate_running_total BY DATABASE PROCEDURE
    FOR HDB
    LANGUAGE SQLSCRIPT
    OPTIONS READ-ONLY
    USING vbak.

    et_result = SELECT
      kunnr AS customer_id,
      netwr AS total_amount,
      ROW_NUMBER() OVER (ORDER BY erdat) AS order_count,
      SUM(netwr) OVER (ORDER BY erdat ROWS UNBOUNDED PRECEDING) AS avg_amount
    FROM vbak
    WHERE kunnr = :iv_customer
      AND LEFT(erdat, 4) = :iv_year;
  ENDMETHOD.
ENDCLASS.

Pattern 2: ABAP Cloud — HTTP Service Handler

CLASS zcl_http_handler DEFINITION PUBLIC
  FINAL CREATE PUBLIC.
  PUBLIC SECTION.
    INTERFACES if_http_service_extension.
ENDCLASS.

CLASS zcl_http_handler IMPLEMENTATION.
  METHOD if_http_service_extension~handle_request.
    CASE request->get_method( ).
      WHEN 'GET'.
        handle_get( request = request response = response ).
      WHEN 'POST'.
        handle_post( request = request response = response ).
      WHEN OTHERS.
        response->set_status( 405 ).
        response->set_text( '{"error":"Method not allowed"}' ).
    ENDCASE.
  ENDMETHOD.

  METHOD handle_get.
    DATA(lv_id) = request->get_uri_query_parameter( 'id' ).

    TRY.
        SELECT SINGLE * FROM zi_myentity WHERE id = @lv_id INTO @DATA(ls_entity).
        IF sy-subrc <> 0.
          response->set_status( 404 ).
          response->set_text( '{"error":"Not found"}' ).
          RETURN.
        ENDIF.

        response->set_status( 200 ).
        response->set_header_field( i_name = 'Content-Type' i_value = 'application/json' ).
        response->set_text( /ui2/cl_json=>serialize( data = ls_entity ) ).
      CATCH cx_root INTO DATA(lx_error).
        response->set_status( 500 ).
        response->set_text( |{{"error":"{ lx_error->get_text( ) }"}}| ).
    ENDTRY.
  ENDMETHOD.
ENDCLASS.

Pattern 3: abapGit Workflow

Development Workflow with abapGit:
┌─────────────┐     ┌──────────┐     ┌──────────┐
│ ABAP System │────►│ abapGit  │────►│  GitHub   │
│ (DEV)       │◄────│ (tcode:  │◄────│  Repo     │
│             │     │  ZABAPGIT)│     │           │
└─────────────┘     └──────────┘     └──────────┘

Best practices:

  1. One Git repo per package (or package tree root)
  2. Use .abapgit.xml for serialization settings
  3. Never commit generated artifacts (proxies, number range objects)
  4. Use transport-based deployment to QA/PRD (not abapGit pull)
  5. Branch strategy: main (PRD state) + dev + feature branches
<!-- .abapgit.xml -->
<?xml version="1.0" encoding="utf-8"?>
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
 <asx:values>
  <DATA>
   <MASTER_LANGUAGE>E</MASTER_LANGUAGE>
   <STARTING_FOLDER>/src/</STARTING_FOLDER>
   <FOLDER_LOGIC>PREFIX</FOLDER_LOGIC>
   <IGNORE>
    <item>/.gitignore</item>
    <item>/LICENSE</item>
    <item>/README.md</item>
    <item>/package.json</item>
    <item>/.travis.yml</item>
   </IGNORE>
  </DATA>
 </asx:values>
</asx:abap>

Pattern 4: Released API Wrapper Pattern

" When you need non-released functionality in ABAP Cloud,
" create a Tier 2 wrapper and release it

" Step 1: Tier 2 class (Standard ABAP) — wraps non-released API
CLASS zcl_legacy_wrapper DEFINITION PUBLIC
  FINAL CREATE PUBLIC.
  PUBLIC SECTION.
    " Mark with C1 release contract
    INTERFACES if_released_for_cloud.

    METHODS get_customer_credit
      IMPORTING iv_customer    TYPE kunnr
      RETURNING VALUE(rv_limit) TYPE knkk-klimk
      RAISING   cx_sy_no_handler.
ENDCLASS.

CLASS zcl_legacy_wrapper IMPLEMENTATION.
  METHOD get_customer_credit.
    " This uses non-released table KNKK — allowed in Tier 2
    SELECT SINGLE klimk FROM knkk
      WHERE kunnr = @iv_customer
      INTO @rv_limit.
  ENDMETHOD.
ENDCLASS.

" Step 2: Tier 1 consumer (ABAP Cloud) — uses released wrapper
CLASS zcl_cloud_consumer DEFINITION PUBLIC
  FINAL CREATE PUBLIC.
  PUBLIC SECTION.
    METHODS check_credit_limit
      IMPORTING iv_customer TYPE kunnr
                iv_amount   TYPE netwr
      RETURNING VALUE(rv_ok) TYPE abap_bool.
ENDCLASS.

CLASS zcl_cloud_consumer IMPLEMENTATION.
  METHOD check_credit_limit.
    DATA(lo_wrapper) = NEW zcl_legacy_wrapper( ).
    DATA(lv_limit) = lo_wrapper->get_customer_credit( iv_customer ).
    rv_ok = xsdbool( iv_amount <= lv_limit ).
  ENDMETHOD.
ENDCLASS.

Pattern 5: ABAP SQL — HANA-Optimized Patterns

" Window functions (pushed to HANA)
SELECT customer, order_date, amount,
       SUM( amount ) OVER( PARTITION BY customer
                           ORDER BY order_date
                           ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW )
         AS running_total,
       ROW_NUMBER( ) OVER( PARTITION BY customer ORDER BY amount DESC )
         AS rank
  FROM zorders
  INTO TABLE @DATA(lt_ranked).

" String aggregation
SELECT customer,
       STRING_AGG( product, ', ' ORDER BY product ) AS all_products
  FROM zorder_items
  GROUP BY customer
  INTO TABLE @DATA(lt_agg).

" Hierarchies in ABAP SQL
WITH +hierarchy AS (
  SELECT FROM zi_org_unit AS org
    FIELDS org~id, org~parent_id, org~name,
           $node.hierarchy_rank AS rank,
           $node.hierarchy_level AS level
    WHERE HIERARCHY_ANCESTORS( source = zi_org_unit
                               child_id = '1000'
                               start WHERE id = org~id )
)
SELECT FROM +hierarchy FIELDS * INTO TABLE @DATA(lt_hier).

" Privileged access in RAP (bypass auth for internal reads)
SELECT FROM zi_salesorder
  FIELDS *
  WHERE status = 'OPEN'
  INTO TABLE @DATA(lt_open)
  PRIVILEGED ACCESS.

Pattern 6: Dynamic Programming with RTTI/RTTC

" Create structure dynamically at runtime
METHOD create_dynamic_structure.
  DATA: lt_components TYPE cl_abap_structdescr=>component_table.

  " Build component list
  lt_components = VALUE #(
    ( name = 'ID'     type = cl_abap_elemdescr=>get_string( ) )
    ( name = 'NAME'   type = cl_abap_elemdescr=>get_string( ) )
    ( name = 'AMOUNT' type = cl_abap_elemdescr=>get_p( p_length = 8 p_decimals = 2 ) )
  ).

  " Add dynamic fields from config
  LOOP AT it_custom_fields ASSIGNING FIELD-SYMBOL(<field>).
    APPEND VALUE #(
      name = <field>-fieldname
      type = SWITCH #( <field>-datatype
               WHEN 'STRING' THEN cl_abap_elemdescr=>get_string( )
               WHEN 'INT'    THEN cl_abap_elemdescr=>get_i( )
               WHEN 'DATE'   THEN cl_abap_elemdescr=>get_d( ) )
    ) TO lt_components.
  ENDLOOP.

  " Create types
  DATA(lo_struct) = cl_abap_structdescr=>create( lt_components ).
  DATA(lo_table) = cl_abap_tabledescr=>create( lo_struct ).

  " Create data references
  CREATE DATA rr_table TYPE HANDLE lo_table.
  ASSIGN rr_table->* TO FIELD-SYMBOL(<table>).

  " Now use <table> for dynamic SELECT
  SELECT (it_fieldlist) FROM (iv_tablename)
    INTO CORRESPONDING FIELDS OF TABLE @<table>
    UP TO iv_max_rows ROWS.
ENDMETHOD.

Error Catalog

ErrorMessageRoot CauseFix
Use of non-released APINot released for ABAP CloudUsing Tier 2 API in Tier 1Find released alternative or create Tier 2 wrapper
AMDP: Syntax errorSQLScript compilation failedInvalid SQLScript in AMDP methodCheck HANA SQL syntax; test in HANA SQL Console
CX_AMDP_EXECUTION_ERRORAMDP runtime failureData type mismatch or HANA errorCheck parameter types match HANA equivalents
abapGit: DeserializationObject import failedConflicting object in target systemCheck package assignment; resolve naming conflicts
abapGit: Auth errorGitHub authentication failedToken expired or wrong permissionsRegenerate personal access token with repo scope
ABAP SQL: Syntax not allowedFeature not availableSQL feature not supported in ABAP CloudCheck ABAP release notes for SQL feature availability
Released API deprecatedSuccessor API availableUsing deprecated released APIMigrate to successor (check ADT deprecation info)
Tier mismatchCannot use Tier 1 in Tier 2 contextMixing language versions incorrectlyKeep clean tier separation; wrappers go Tier 2 → Tier 1

Performance Tips

  1. Push down to HANA — Use AMDP for complex calculations; avoid ABAP loops for aggregation
  2. ABAP SQL over Open SQL — New ABAP SQL features (window functions, CTEs) execute on DB
  3. Avoid SELECT in loops — Use JOINs or associations; even with buffered tables, loop SELECTs are anti-patterns
  4. Buffer wiselycl_abap_context_info=>get_system_date() is buffered; sy-datum triggers DB call per access in cloud
  5. AMDP table functions — For CDS consumption, table functions outperform calculated fields for complex logic
  6. Parallel processing — Use CL_ABAP_PARALLEL for cloud-compatible parallel RFC replacement
  7. String operations — Use string templates |{ }| over CONCATENATE; they're optimized in cloud runtime

Validation Workflow

After writing or modifying ABAP Cloud code, run the compliance validator:

bash scripts/validate-abap-cloud.sh ./src

Plan → Validate → Fix → Validate again — do not proceed until validation passes with 0 errors.

Gotchas

  • No SE80/SE38 in Cloud: Use ADT (Eclipse) exclusively for ABAP Cloud development
  • No transport in Steampunk: BTP ABAP Environment uses software components + Git, not transport requests
  • AMDP debugging: Set breakpoints in ADT; SQLScript debugging requires HANA permissions
  • abapGit and namespaces: Namespace /MYNAMESPACE/ objects need special serializer configuration
  • Released API stability: C1 (released) APIs have backward-compatible contract; C0 can change anytime
  • Tier 2 is not "legacy": Tier 2 (Standard ABAP) is valid for S/4HANA Private/On-Premise — it's not deprecated

MCP Server Integration

For live ABAP system access, add to your .mcp.json:

{
  "mcpServers": {
    "vibing-steampunk": {
      "command": "npx", "args": ["-y", "vibing-steampunk"],
      "env": { "SAP_HOST": "https://your-system.abap.hana.ondemand.com",
               "SAP_USER": "YOUR_USER", "SAP_PASSWORD": "YOUR_PASSWORD" }
    },
    "sap-docs": {
      "command": "npx", "args": ["-y", "mcp-sap-docs"]
    }
  }
}
  • Vibing Steampunk (41-68 tools): Full ADT bridge — read/write ABAP source, syntax check, ATC, debug
  • SAP Docs: Offline ABAP documentation with hybrid BM25+semantic search

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.