Updated: 14 November 2026. Exam facts checked on SAP Learning that day.

The smallest ABAP RESTful Application Programming Model (RAP) business object worth practising for C_ABAPD, SAP's ABAP Cloud certification, has five layers: a database table, a root Core Data Services (CDS) view entity, a managed behaviour definition in strict ( 2 ), a behaviour pool, and a service definition with an Open Data Protocol (OData) V4 binding. Build it from an empty package, in that order, until you can do it without notes.
C_ABAPD is SAP Certified - Backend Developer - ABAP Cloud (Beta Version). It is a system-based assessment: you build objects in a live system instead of answering about them. This post builds one tiny business object for course bookings, layer by layer, and shows what each step proves and which activation errors to expect along the way.
Why practise a RAP business object for the ABAP Cloud certification at all?
A RAP business object is worth practising because SAP's C_ABAPD description names RAP, and one minimal stack exercises all three exam topics at once. You touch the ABAP Dictionary, CDS, object-oriented code and the ABAP Cloud rules in about 70 lines of code.
The C_ABAPD certification page, checked on 14 November 2026, shows these figures:
| Item | What SAP Learning shows |
|---|---|
| Format | 1 activity (System Based Assessment) |
| Duration | 3 hours |
| Pass score | 67% |
| Using ABAP and Building Data Models | 61% |
| Designing Effective Object-Oriented Code | 21-30% |
| Applying Basic Techniques and Concepts | 11-20% |
| Tooling | Your own Eclipse with ABAP Development Tools (ADT), highest available release |
SAP does not publish the exam tasks, and this post does not guess at them. Jennifer Hauck, a Product and Topic Expert at SAP, wrote in her March 2026 SAP Community post that the tasks are based on courses S4D400, S4D401 and S4D430, in an ABAP environment on SAP Business Technology Platform (SAP BTP). She also warned: "The certification system will resemble the training and practice systems available in learning environments - but it won’t be identical."
That is the case for a small, self-written business object. You can't memorise the exam system, but you can make the build order automatic. The Acquiring Core ABAP Skills journey lists S4D400 at 17 hours or more, S4D401 at 23 hours or more and S4D430 at 20 hours or more, each with its own practice system. Hauck adds that those practice systems use the same underlying data model as the exam, with identical table and field names, so they are the right place to rebuild the worked example below.
What does the smallest useful RAP business object contain?
The smallest useful RAP business object contains six objects in five layers. Each layer proves one skill that the exam topics name, and each one depends on the layer below it.

| Layer | Object in this example | What it proves | Exam topic it feeds most |
|---|---|---|---|
| 1. Persistence | Table zcourse_book |
You can model keys and admin fields in the ABAP Dictionary | Using ABAP and Building Data Models |
| 2. Data model | Root view entity ZR_CourseBooking |
You can write a CDS view entity and alias fields cleanly | Using ABAP and Building Data Models |
| 3. Behaviour | Behaviour definition (BDEF), managed, strict ( 2 ) |
You know what RAP generates for you and what you must declare | Using ABAP and Building Data Models |
| 4. Code | Behaviour pool zbp_r_coursebooking |
You can implement a handler method in a local class | Designing Effective Object-Oriented Code |
| 5. Service | Service definition ZUI_CourseBooking plus an OData V4 binding |
You can expose and test the object | Applying Basic Techniques and Concepts |
The topic mapping in the last column is this blog's reading of SAP's topic names, not an official SAP mapping. If you share a trial system, add your initials to every Z name.
Step 1: how should the table look so that managed numbering works?
For managed numbering to work, the table needs a client field and a 16-byte raw UUID key. SAP's field numbering documentation says fields with managed numbering must be primary key fields of data type RAW with length 16, which is a UUID (universally unique identifier).
@EndUserText.label : 'Course booking'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table zcourse_book {
key client : abap.clnt not null;
key booking_uuid : sysuuid_x16 not null;
course_id : abap.char(10);
participant : abap.char(40);
status : abap.char(1);
local_last_changed_at : abp_locinst_lastchange_tstmpl;
}
What this step proves: you can pick released data elements (sysuuid_x16, abp_locinst_lastchange_tstmpl) instead of inventing types. The last field later becomes the entity tag (ETag) for optimistic concurrency control.
Errors to expect: a key typed as abap.char(32) activates fine here. It only fails two layers later, when the behaviour definition asks for managed numbering. That delay is why checking types early saves time.
Step 2: what makes a CDS view entity a valid RAP root?
A CDS view entity becomes a valid RAP root only with the keyword root. A behaviour definition can only be created on a root entity, so define root view entity is not optional, even for a single-entity object.
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Course booking'
define root view entity ZR_CourseBooking
as select from zcourse_book
{
key booking_uuid as BookingUUID,
course_id as CourseID,
participant as Participant,
status as Status,
@Semantics.systemDateTime.localInstanceLastChangedAt: true
local_last_changed_at as LocalLastChangedAt
}
What this step proves: you can alias table fields into readable CamelCase names. Those aliases are the names the behaviour definition and the service use from now on.
Errors to expect: a DDL source name that differs from the entity name, or a missing root. The annotation on LocalLastChangedAt matters too. SAP's ETag documentation says the managed provider can fill the field automatically only when it carries @Semantics.systemDateTime.localInstanceLastChangedAt: true.
Step 3: what does strict ( 2 ) change in the behaviour definition?
In a RAP behaviour definition, strict ( 2 ) turns outdated-syntax warnings into errors and adds stricter checks on the business object contract. The strict(2) keyword page explains that outdated syntax, which would normally give a syntax check warning, gives a syntax check error instead. The statement must be the second line.
managed implementation in class zbp_r_coursebooking unique;
strict ( 2 );
define behavior for ZR_CourseBooking alias Booking
persistent table zcourse_book
lock master
authorization master ( global )
etag master LocalLastChangedAt
{
create;
update;
delete;
field ( numbering : managed, readonly ) BookingUUID;
field ( readonly ) LocalLastChangedAt;
field ( mandatory ) CourseID, Participant;
mapping for zcourse_book
{
BookingUUID = booking_uuid;
CourseID = course_id;
Participant = participant;
Status = status;
LocalLastChangedAt = local_last_changed_at;
}
}
What this step proves: you know which lines are framework services you only declare (numbering, locking, ETag, create/update/delete) and which ones need code (authorization).
The authorization line is not decoration. SAP's RAP authorization page states that the root entity of a RAP business object must be defined as an authorization master entity. Choosing ( global ) means you must implement a handler method. Choosing ( none ) needs no method but tests less, so for practice, keep ( global ).
Step 4: what goes into the behaviour pool?
The behaviour pool needs one local handler class with one method for global authorization. Put the cursor on the class name in the first BDEF line and use the ADT quick fix. ADT creates the global class zbp_r_coursebooking and a local handler class with the method definition.
CLASS lhc_booking DEFINITION INHERITING FROM cl_abap_behavior_handler.
PRIVATE SECTION.
METHODS get_global_authorizations FOR GLOBAL AUTHORIZATION
IMPORTING REQUEST requested_authorizations FOR Booking RESULT result.
ENDCLASS.
CLASS lhc_booking IMPLEMENTATION.
METHOD get_global_authorizations.
" Training example only: allow everything.
" Real code checks an authorization object first.
result = VALUE #( %create = if_abap_behv=>auth-allowed
%update = if_abap_behv=>auth-allowed
%delete = if_abap_behv=>auth-allowed ).
ENDMETHOD.
ENDCLASS.
What this step proves: you can read a generated signature (REQUEST, FOR Booking, RESULT) and fill a typed result structure with a constructor expression. That is object-oriented work, and it feeds the topic weighted 21-30%.
Errors to expect: writing the method in the global class instead of the local handler, or using the entity name instead of the alias Booking in the signature.
Step 5: how do you expose and test the business object as a service?
You expose it with two objects: a service definition that lists the entity, and a service binding that publishes it as OData V4. Neither needs code beyond one expose line.
@EndUserText.label: 'Course booking service'
define service ZUI_CourseBooking {
expose ZR_CourseBooking as Booking;
}
Right-click the service definition, create a binding of type OData V4 - UI, activate it, then press Publish. SAP's service binding documentation covers the binding types. Select the entity and open the Fiori elements preview to create one booking.
What this step proves: the whole stack works end to end. If you can create a record in the preview and see a generated UUID, every layer below is correct.
Errors to expect: an empty list in the preview. That is not a bug. The view has no @UI.lineItem annotations, so pick columns in the preview settings or add the annotations.
In which order should you activate the objects?
Activate the RAP objects bottom up: table, view entity, behaviour definition, behaviour pool, service definition, service binding. Each object refers to the one before it, so activating out of order produces follow-on errors that hide the real cause.

Two habits help. First, activate each object as soon as it is written, instead of activating everything at the end. Second, when an error points at a higher layer, check the layer below it first. A mapping error in the behaviour definition is usually an alias typo in the view.
Which activation errors should you expect, and what causes them?
Most activation errors in a minimal RAP build come from five causes: a missing root, strict mode placement, a key type that managed numbering can't fill, alias mismatches in the mapping, and unreleased objects. The table below describes each one in plain words. Exact message texts vary by release.

| Where it shows up | Likely cause | Fix |
|---|---|---|
| Creating the BDEF | View defined without root |
Use define root view entity |
| BDEF, line 2 | strict ( 2 ) not on the second line |
Move it directly under the header line |
| BDEF, numbering | Key is not RAW 16 | Retype the key with sysuuid_x16 |
| BDEF, mapping block | CDS alias and table field names don't match | Copy aliases from the view, field names from the table |
| BDEF, header | No authorization declared on the root | Add authorization master ( global ) |
| Behaviour pool | Pool or authorization method missing | Use the ADT quick fix, then fill the method |
| Any class or view | Object not released for ABAP Cloud | Find the released successor |
| Service binding | Preview button inactive | Press Publish after activating |
The row about unreleased objects deserves attention if you come from on-premise ABAP. Thomas Schneider, a Product and Topic Expert at SAP, explains in his ABAP language versions FAQ: "In Cloud, the ABAP language version is set by the system and cannot be changed." You can't switch to classic ABAP to make an error go away. The only fix is a released API.
How do you turn the walkthrough into a timed C_ABAPD rehearsal?
Turn the walkthrough into a C_ABAPD rehearsal by rebuilding it four times, faster each time, in one of SAP's practice systems. The time targets below are this blog's suggestion, not SAP figures.
| Round | Rules | Target |
|---|---|---|
| 1 | Follow this post, read every error message fully | No time limit; write down each error you hit |
| 2 | Build from an empty package using only your error notes | Under 45 minutes |
| 3 | Build from memory, then add one validation (Status must be N, C or X) | Under 30 minutes for the base stack |
| 4 | Repeat round 3 on top of a table from the course practice system | Same target, unfamiliar data |
Round 3 matters most. A validation adds a BDEF line, a handler method, a READ ENTITIES call and a failed/reported result, which tests the object-oriented topic again.
Time pressure is real. "Three hours go faster than you think!" Hauck writes in the same post. In March 2026 she also noted that Joule for Developers is available within the exam system, so practise asking it to explain a generated signature and then check its answer against the keyword documentation.
To check the reasoning behind these steps away from the system, ERPPrep's C_ABAPD sample questions include free scenario questions on RAP business objects and ABAP SQL, each with a rationale. They complement building the objects yourself; they don't replace it.
Frequently Asked Questions
Q: Is a RAP business object guaranteed to be part of the C_ABAPD task? No. SAP doesn't publish the tasks. SAP's description names RAP, and SAP staff list S4D400, S4D401 and S4D430 as the content base. A minimal RAP stack is good practice because it covers tables, CDS and object-oriented code together.
Q: Why use strict ( 2 ) instead of strict? Version 2 includes every check from version 1 plus stricter checks on the RAP business object contract. SAP's strict mode documentation recommends the most recent strict mode version, so practising with it avoids learning syntax that now produces errors.
Q: Can I use authorization master ( none ) to save time?
It activates without a handler method, so it is faster. For practice, keep ( global ): it makes you write the behaviour pool method, which is exactly the object-oriented step you want to rehearse.
Q: Why does the Fiori elements preview show an empty list?
The view has no @UI.lineItem annotations, so the preview has no default columns. Choose columns in the preview settings, or add a metadata extension with UI annotations. The data is there.
Q: Which ADT version should I use for C_ABAPD in 2026? SAP's certification page asks for your own Eclipse and ADT installation on the highest available release. Update a week before the exam and build this example once with the updated version.
Q: Where can I practise in a real system before the exam? The Acquiring Core ABAP Skills learning journey links a hands-on practice system for each of S4D400, S4D401 and S4D430. Access depends on your SAP Learning account, so check what your subscription unlocks before you plan your rehearsals.
For more ABAP Cloud and RAP guides, see the SAP ABAP Central homepage.