Appearance
ABAP Cloud Certification Practice
System-Based Assessment — C_ABAPD-style practice (2601)
Independent practice material
This is an independently written practice assessment, not an official SAP certification examination or a reproduction of its instructions. It follows the skills, task sequence, naming discipline, and practical assessment style of the C_ABAPD 2601 task instructions. It uses an SAP BTP, ABAP Environment trial rather than the dedicated certification system. Availability of trial features may change.
Certification prep overview · Prepare your system
Introduction
In this assessment, you will complete practical ABAP development tasks using an SAP system. The tasks cover packages, ABAP Objects, ABAP SQL, the ABAP RESTful Application Programming Model (RAP), CDS access controls, exception handling, and ABAP Dictionary types.
Working time: Allow three hours for Tasks 2–8, after completing the trial setup and the preparation described below. The time limit is for self-practice; no official grading service is provided.
Data Entry Accuracy
Repository object names, parameter names, data types, and literal values matter. Pay attention to:
- Uppercase and lowercase letters where relevant.
- Underscores, leading zeros, and other characters.
- The exact names and signatures specified for repository objects.
- Activating every object that can be activated. Packages and message classes do not use the same activation procedure as executable development objects.
For this practice assessment, use a four-character practice ID made up of your two initials, followed by the two-digit number of your attempt, starting at 01.
For example, a learner with the initials H.P. uses HP01 on the first attempt, HP02 on the second attempt, and HP03 on the third attempt. Write the initials in uppercase and always use two digits for the attempt number. Replace every occurrence of #### in an object name with your practice ID.
| Placeholder | Correct for HP01 | Incorrect |
|---|---|---|
ZABAP_#### | ZABAP_HP01 | ZABAP_HP1 |
ZCL_####_FLIGHT | ZCL_HP01_FLIGHT | ZCL_FLIGHT_HP01 |
ZZ####TRAVEL | ZZHP01TRAVEL | ZHP01TRAVEL |
Use a new attempt number each time you repeat the assessment. If learners with the same initials share an ABAP system, coordinate to avoid repository object name conflicts.
Task 1: Context
Working in your ABAP system
You will work in Eclipse with ABAP Development Tools (ADT), connected to an SAP BTP, ABAP Environment trial instance.
- Make sure your trial ABAP instance and developer user are available.
- Use a current Eclipse installation with ADT. For the closest match to the assessment environment, use Eclipse 2025-12 or newer and ADT 3.56.0 or newer, if these releases are available to you.
- In Eclipse, choose File → New → Other → ABAP Cloud Project. Enter the service URL of your trial ABAP instance and complete browser-based sign-in.
- Add
ZLOCALto your favorite packages. This is the parent package used for custom development in the trial tutorials. - Check that the flight reference scenario is available. Inspect the database tables
/DMO/FLIGHT,/DMO/CONNECTION,/DMO/AGENCY, and/DMO/CUSTOMERin ADT. - Before starting the timed tasks, ensure that the Practice-system preparation at the end of this page has been completed.
Trial adaptation
The dedicated certification environment provides an exam group number, an exam service URL, a package ZSTUDENTS, and certain ready-made Z* repository objects. A normal BTP trial does not provide that assessment-specific setup automatically. In this practice, use your initials-and-attempt practice ID, ZLOCAL, and the starter objects described below. The standard /DMO/* flight tables are already part of the trial flight reference scenario and must not be recreated.
General instructions
- Create all requested objects in package
ZABAP_####, except for the supplied practice starter objects. - Use the types specified in the tasks rather than replacing them with generic built-in types.
- Save and activate each object before proceeding.
- You may consult SAP Help, SAP Learning, and the ABAP Keyword Documentation. Use of AI assistance is a personal practice choice; the availability of Joule in the real certification environment does not mean it is included in a trial account.
- Unless a task specifically requests it, do not change the prepared starter objects.
Task 2: Create a Package
Before continuing, create a package for your development objects.
- Create an ABAP package named
ZABAP_####. - Assign it to superpackage
ZLOCAL. - Create a transport request, or select one according to the options offered by ADT.
- Use this transport request for the remaining development objects.
- Maintain meaningful descriptions and complete all mandatory fields.
Expected result: The package is visible in the Project Explorer and can hold your development objects.
Task 3: Create a Class Hierarchy
Create a general flight class and a subclass for passenger flights. You can inspect /DMO/FLIGHT and /DMO/CONNECTION to understand the data types and records.
3.1 General flight
In package ZABAP_####, create a global class ZCL_####_FLIGHT with the following instance attributes:
| Attribute | Type | Required visibility |
|---|---|---|
carrier_id | /DMO/CARRIER_ID | Publicly readable, not publicly changeable |
connection_id | /DMO/CONNECTION_ID | Publicly readable, not publicly changeable |
airport_from | /DMO/AIRPORT_FROM_ID | Publicly readable, not publicly changeable |
airport_to | /DMO/AIRPORT_TO_ID | Publicly readable, not publicly changeable |
plane_type | /DMO/PLANE_TYPE_ID | Accessible within the class and its subclasses, but not by external consumers |
Provide an instance constructor with:
- Importing parameters corresponding to
carrier_id,connection_id, andplane_type, using the specified types. - A declared class-based exception
ZCX_C_ABAPD_NO_CONNECTION.
Implement the constructor so that it:
- Assigns the supplied values to the relevant attributes.
- Looks up the matching record in
/DMO/CONNECTIONusing the carrier and connection IDs. - Uses that record to populate
airport_fromandairport_to. - Raises
ZCX_C_ABAPD_NO_CONNECTIONif the requested connection does not exist.
3.2 Passenger flight
Create another global class ZCL_####_PASSENGER_FLIGHT as a subclass of ZCL_####_FLIGHT.
Add this instance attribute:
| Attribute | Type | Required visibility |
|---|---|---|
seats_max | /DMO/PLANE_SEATS_MAX | Private |
Provide a constructor that imports the same three flight-related values and declares ZCX_C_ABAPD_NO_CONNECTION.
Implement it so that it:
- Calls the constructor of its superclass.
- Reads
MaximumSeatsfrom the prepared CDS view entityZI_CABAPD_PASSENGERfor the specified plane type. - Assigns the result to
seats_max. - Raises
ZCX_C_ABAPD_NO_CONNECTIONif the required plane type cannot be found in the practice view.
Verification: Both global classes activate. A valid carrier/connection and supported plane type can be used to construct a passenger flight. An unknown connection raises the expected exception.
Test data
The original assessment suggests plane types A320-200, 737-800, and 747-400. Their availability in the prepared practice view depends on the records in your trial system. Use ADT Data Preview to confirm which plane types are present.
Task 4: Read a List of Flight Connections
Develop a method that returns all destinations reachable from one departure airport by either:
- A direct connection; or
- Exactly one change, using the same carrier for both legs.
A journey ending at the original departure airport is not an onward destination. A connection requiring a change of carrier is also excluded.
Example
Assume the following entries exist in /DMO/CONNECTION:
carrier_id | connection_id | airport_from_id | airport_to_id |
|---|---|---|---|
| LH | 400 | FRA | JFK |
| LH | 2010 | EDI | FRA |
| SQ | 299 | EDI | SIN |
| SQ | 300 | SIN | EDI |
| SQ | 30 | SIN | SYD |
| BA | 447 | EDI | LHR |
| AA | 12 | LHR | BOS |
For departure airport EDI, the method must produce these logical results (row order is not specified):
carrier_id | airport_from_id | airport_to_id | airport_via_id |
|---|---|---|---|
| LH | EDI | FRA | - |
| LH | EDI | JFK | FRA |
| SQ | EDI | SIN | - |
| SQ | EDI | SYD | SIN |
| BA | EDI | LHR | - |
This example defines the expected behavior; the actual data in your trial system may be different.
Development tasks
Create a global class
ZCL_####_CONNECTIONSinZABAP_####.Add a public instance method
get_connectionswith this exact signature:Direction Parameter Type Importing i_departure/DMO/AIRPORT_FROM_IDReturning r_connectionsZCERT_CONNECTIONSUse one or more ABAP SQL
SELECTstatements on/DMO/CONNECTIONto determine the required connections.For every returned row, populate
carrier_id,airport_from_id, andairport_to_id.Set
airport_via_idto'-'for a direct connection. For a one-change connection, set it to the transfer airport.Exclude connections that arrive back at
i_departure, and do not include journeys involving more than two legs or different carriers.
Verification: The class activates. Your method returns correct direct and one-change results for the sample logic and for the data available in your own system.
Task 5: Create a RAP Business Object
In this task, you will generate an ABAP RESTful Application Programming Model (RAP) business object for travel data. Each row represents a travel instance and includes dates and a status. The Status field must not be editable directly; a determination must set the initial status when the instance is first saved.
- Copy the prepared database table
ZABAPDTRAVELto the nameZZ####TRAVEL. Assign the copy to packageZABAP_####. Keep the two leadingZcharacters, and activate the copied table. - Open the context menu of
ZZ####TRAVELand choose Generate ABAP Repository Objects. Select the ABAP RESTful Application Programming Model: UI Service use case. Choose OData V4 – UI when prompted. Accept the naming proposals made by the wizard, and record the generated behavior definition and service binding names. - In the generated behavior definition, make the
Statusfield read-only. - Declare a determination named
setInitialStatus, triggered on save and only when an instance is created. - Implement the determination so that every new travel instance receives the status value
Nduring saving. - Activate all affected RAP artifacts. Publish the generated service binding and select Preview to test the application, if the trial allows the preview to run.
Verification: Creating a new travel record results in Status = 'N'. Users cannot change Status themselves through the generated UI. The determination does not reset the status merely because an existing instance is updated.
RAP wizard names
The original assessment refers to a behavior definition such as ZR_Z####TRAVEL and an OData V4 binding such as ZUI_Z####TRAVEL_O4. Generator proposals can vary with the installed ABAP/ADT version. Do not rename generated objects just to match an example; use the actual wizard proposals and document them.
Task 6: Create a CDS Access Control
You will protect agency data using a CDS access control. This task contains the main potential BTP-trial limitation: the original assessment supplies the authorization object /LRN/AGCY, whereas the independent practice system does not.
- Copy the prepared CDS view entity
ZC_ABAPD_AGENCYtoZ####_AGENCY, assign it to packageZABAP_####, and activate it. - Create a CDS access control with the name
Z####_AGENCYfor the new view entity. - Use a PFCG authorization aspect to map view element
agency_idto the agency authorization field, and require the authorization activity Display (03). - Save and activate the access control.
For the trial adaptation, the instructor or learner must first supply an authorization object called ZAGC#### with an agency authorization field ZAGF#### and standard field ACTVT. Both names contain the student's four-character practice ID (for example, ZAGCHP01 and ZAGFHP01 on the first attempt). Use those objects in place of the assessment-only authorization object /LRN/AGCY.
Verification: Where the trial allows creation and assignment of authorization objects, confirm that the CDS role activates and that data access reflects the assigned authorization. Activation alone does not prove effective row-level authorization.
Trial boundary — check before treating Task 6 as complete
SAP documents the PFCG-aspect/CDS authorization workflow, but its full authorization model tutorial specifies a licensed ABAP environment. We have not verified that creating the custom authorization object, setting up the necessary IAM roles, and testing authorization restrictions end-to-end all work in every current BTP trial. If this is blocked, retain Task 6 as a design-and-syntax exercise and mark runtime authorization testing not completed. A hard-coded CDS WHERE clause is not an equivalent replacement for aspect pfcg_auth.
Task 7: Add Exception Handling to a Method
The prepared global class ZCL_AGENCY_MODEL reads an agency from /DMO/AGENCY, but it does not explicitly report the case in which the requested agency is missing. Your task is to add class-based exception handling.
- Copy
ZCL_AGENCY_MODELtoZCL_####_AGENCY_MODELin packageZABAP_####. - Create a global exception class
ZCX_####_NO_AGENCY. - In the exception class, provide a text/message identifier for message
002from message classZC_ABAPD. Message002contains placeholder&1for the agency ID. Ensure the relevant agency ID is available to the exception object for message substitution. - In
ZCL_####_AGENCY_MODEL->GET_AGENCY( ), declare the exception in the method signature and raise it when the database query returns no record. - Activate the modified class and exception class.
Verification: Calling GET_AGENCY( ) with an existing agency ID returns that agency. An ID not present in /DMO/AGENCY raises ZCX_####_NO_AGENCY; the message identifies the requested agency.
Task 8: Create ABAP Dictionary Types
You need a structure type and a table type for records held in /DMO/CUSTOMER. The customer ID is unique. Assume the application fills the internal table once and performs many lookups by customer ID.
Create an ABAP Dictionary structure
Z####_CUSTOMERin packageZABAP_####, with these components:Component Required type CUSTOMER_IDSame data element as /DMO/CUSTOMER-CUSTOMER_IDFIRST_NAMESame data element as /DMO/CUSTOMER-FIRST_NAMELAST_NAMESame data element as /DMO/CUSTOMER-LAST_NAMESTREETSame data element as /DMO/CUSTOMER-STREETPOSTAL_CODESame data element as /DMO/CUSTOMER-POSTAL_CODECITYSame data element as /DMO/CUSTOMER-CITYCOUNTRY_CODESame data element as /DMO/CUSTOMER-COUNTRY_CODESet the enhancement category to
#EXTENSIBLE_CHARACTER_NUMERICand activate the structure.Create an ABAP Dictionary table type
Z####_T_CUST.Use
Z####_CUSTOMERas the row type.Specify a hashed table with a unique primary key based on the field that uniquely identifies each customer.
Activate the table type.
Verification: Both Dictionary objects activate. The table type allows efficient key-based lookup and does not accept duplicate customer IDs.
Completing Your Practice Assessment
There is no official submission button or SAP certification result for this independent practice.
Use the following checklist to verify your work:
If you have access to another learner's review or an instructor, compare object definitions, method signatures, and runtime behavior. A successful activation is necessary, but it is not proof that the required business behavior is correct.
Finished your attempt? Review the worked solutions and revisit the relevant lessons before trying again.
Practice-System Preparation (before the timed exercise)
This section is intended for instructors preparing a lab or individual learners building their own assessment practice environment. It is not part of the three-hour timed task. It creates the exam-like Z* dependencies missing from a standard trial system. None of these dependencies replaces /DMO/* flight reference tables.
Required before Task 3
The certification assessment provides special starter objects. In a trial account, check whether each of the following exists and create it if necessary. Keep the prepared objects separate from the objects students are expected to produce in Tasks 2–8. These examples are practice fixtures, not the original SAP assessment objects.
A. Flight constructor exception
Create a global exception class ZCX_C_ABAPD_NO_CONNECTION, derived from CX_STATIC_CHECK. It is used in Task 3. An exception text ID is optional for this particular practice fixture; the important part is that constructors can declare and raise this checked exception.
B. Passenger-capacity CDS view
Create CDS view entity ZI_CABAPD_PASSENGER. The original assessment supplies a view with a field named MaximumSeats; for trial practice, the following derived view uses the existing /DMO/FLIGHT data:
abap
@EndUserText.label: 'Practice: maximum seats by plane type'
@AccessControl.authorizationCheck: #NOT_REQUIRED
define view entity ZI_CABAPD_PASSENGER
as select from /dmo/flight
{
key plane_type_id as PlaneType,
max( seats_max ) as MaximumSeats
}
group by plane_type_idImportant difference: This is an aggregate over flight records, not a dedicated plane-type master-data source. It is sufficient to practice lookup and exception handling when matching records exist, but it is not guaranteed to contain every plane type. Open Data Preview before the timed exercise.
C. Connection return type
Create an ABAP Dictionary structure ZCERT_CONNECTION with these fields and data elements:
| Field | Data element |
|---|---|
carrier_id | /DMO/CARRIER_ID |
airport_from_id | /DMO/AIRPORT_FROM_ID |
airport_to_id | /DMO/AIRPORT_TO_ID |
airport_via_id | /DMO/AIRPORT_ID |
Then create an ABAP Dictionary table type ZCERT_CONNECTIONS with row type ZCERT_CONNECTION, access type Standard Table, and a non-unique key. This provides exactly the method return type requested in Task 4.
D. Travel table to be copied
Create and activate the practice database table ZABAPDTRAVEL. The following example includes the key, a status field, and the administrative fields used by the RAP repository object generator:
abap
@EndUserText.label : 'Practice travel template'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #RESTRICTED
define table zabapdtravel {
key client : abap.clnt not null;
key travel_uuid : sysuuid_x16 not null;
travel_id : /dmo/travel_id;
agency_id : /dmo/agency_id;
customer_id : /dmo/customer_id;
begin_date : /dmo/begin_date;
end_date : /dmo/end_date;
status : /dmo/overall_status;
local_created_by : abp_creation_user;
local_created_at : abp_creation_tstmpl;
local_last_changed_by : abp_locinst_lastchange_user;
local_last_changed_at : abp_locinst_lastchange_tstmpl;
last_changed_at : abp_lastchange_tstmpl;
}If your system's RAP generator requires additional fields or annotations, adjust this starter table and verify that you can generate an OData V4 UI service from a copy before distributing the exercise. SAP's RAP generator tutorial requires a client key of type abap.clnt and appropriate administrative fields.
E. Agency CDS view to be copied
Create and activate ZC_ABAPD_AGENCY:
abap
@EndUserText.label: 'Practice agency data'
@AccessControl.authorizationCheck: #CHECK
define view entity ZC_ABAPD_AGENCY
as select from /dmo/agency
{
key agency_id as agency_id,
name as name,
street as street,
postal_code as postal_code,
city as city,
country_code as country_code
}For Task 6, create/assign an authorization object ZAGC#### with agency authorization field ZAGF#### (based on data element /DMO/AGENCY_ID) plus standard field ACTVT, where permitted activity 03 means Display. This part is conditional on trial privileges. If the repository object creation or IAM assignment is unavailable, record the limitation; do not pretend that a fixed filter is an authorization check.
F. Agency starter class and message
Create message class ZC_ABAPD with message number 002, for example:
text
Travel agency &1 could not be found.Create and activate global class ZCL_AGENCY_MODEL, to be duplicated in Task 7:
abap
CLASS zcl_agency_model DEFINITION
PUBLIC
CREATE PUBLIC.
PUBLIC SECTION.
METHODS get_agency
IMPORTING i_agency_id TYPE /dmo/agency_id
RETURNING VALUE(r_agency) TYPE /dmo/agency.
ENDCLASS.
CLASS zcl_agency_model IMPLEMENTATION.
METHOD get_agency.
SELECT SINGLE *
FROM /dmo/agency
WHERE agency_id = @i_agency_id
INTO @r_agency.
ENDMETHOD.
ENDCLASS.The class intentionally has no explicit error handling. Students must add that behavior to their copies during Task 7. If your trial account does not permit creating or maintaining message classes, note that Task 7 cannot be reproduced exactly in that account; an alternative exception-text exercise would be a reduced-fidelity option.
G. Preparation verification
Before publishing the timed assessment, verify these prepared objects in ADT:
If a prerequisite is unavailable, tell learners before the timed assessment and identify which task is affected.
SAP References
The following SAP resources document the ABAP trial features and repository object workflows used in this practice:
- Create an ABAP Cloud Project
- Create Your First ABAP Console Application — package under
ZLOCAL - SAP ABAP Flight Reference Scenario
- Create Database Table and Generate UI Service
- Generate a RAP Business Service with the Wizard
- Enhance Business Object Behavior with Determinations
- Create an ABAP Table Type
- Defining Dictionary Table Types
- Create Authorization Model and App — licensed-environment prerequisite
Last content review: October 2026. This independent training resource is not affiliated with or endorsed by SAP.