1.3Bloom · AnNot started

Restricted ABAP — what changes

Reading depth

What you'll learn

Set a package to 'ABAP for Cloud Development' and the compiler itself blocks non-Clean-Core code — only released APIs compile.

  • Restricted ABAP is set per package via the ABAP language version.
  • Only released (C1) objects compile; classic statements (WRITE, CALL TRANSACTION, EXEC SQL, macros) are syntax errors.
  • Compile-time enforcement is stronger than an ATC finding you can ignore.

Setting a package's ABAP language version to 'ABAP for Cloud Development' switches it into Restricted ABAP. From then on the compiler enforces Clean Core: only released (C1) objects can be consumed, and a long list of classic statements becomes a syntax error.

Forbidden constructs include WRITE-to-list and list processing, CALL TRANSACTION / SUBMIT / LEAVE TO TRANSACTION, classic Dynpro / CALL SCREEN / module pools, CALL FUNCTION ... DESTINATION for direct DB, EXEC SQL / native SQL, macros, and IMPORT/EXPORT FROM MEMORY or SHARED BUFFER. BAdI consumption is limited to released enhancement spots.

The win is that violations fail at compile time, not just in ATC. The package property has four values — Standard ABAP (unrestricted default), ABAP for Key Users, ABAP for Cloud Development, and the legacy 'ABAP for SAP Cloud Platform' — progressively more locked down.

Key points

  • Restricted ABAP is set per package via the ABAP language version.
  • Only released (C1) objects compile; classic statements (WRITE, CALL TRANSACTION, EXEC SQL, macros) are syntax errors.
  • Compile-time enforcement is stronger than an ATC finding you can ignore.
  • ATC variant ABAP_CLOUD_DEVELOPMENT_DEFAULT is the practical source of truth for what's allowed.

Examples

BeforeA classic report header

Perfectly valid Standard ABAP — and a syntax error in a Cloud Development package.

ABAPwrite: / 'Hello'.
call transaction 'VA01'.
AfterThe Cloud-clean equivalent

Output goes through a released channel (here, application logging); UI/transaction launches move to Fiori + released APIs.

ABAPdata(log) = cl_bali_log=>create( ).
" ... add released messages, persist via the released log API

Source notes: clean-core-curriculum §1.3

Ask Claude

Build a prompt from this lesson + your question and open a fresh Claude chat with it pre-filled — handy for adapting a before/after pattern to your own object.