Appearance
Project 1 — Travel Booking Inspector
When to start: after ABAP Foundations and Lesson 5 of ABAP SQL, CDS & RAP.
Approximate duration: one working day
Project overview
Build a Travel Booking Inspector that combines your ABAP foundation with the data-modeling concepts from Lessons 1–5.
The application receives a Travel ID and displays useful information about:
text
the travel
the customer
the bookings
the carrier for each booking
the flight connection for each bookingYou will also calculate a small summary in ABAP.
Use only concepts learned through Lesson 5 of ABAP SQL, CDS & RAP.
1. Learning objectives
By the end of the project, you should have used:
text
Object-Oriented ABAP
ABAP SQL
CDS View Entities
calculated elements
CASE expressions
filters
joins
associations
path expressions2. Business scenario
Given a Travel ID, your application should display:
text
Travel information
Customer information
Booking information
Carrier information
Connection information
A small trip summaryExample output shape:
text
Travel 00000123
Customer:
John Smith
Dates:
2026-05-10 -> 2026-05-20
Bookings: 3
Different carriers: 2
1. Lufthansa
FRA -> JFK
Departure: 10:30
Arrival: 13:15
2. United Airlines
JFK -> SFO
Departure: 15:00
Arrival: 18:10
3. Lufthansa
SFO -> FRA
Departure: 19:30
Arrival: 14:20The exact output format is up to you.
3. Required architecture
Your solution must follow this general architecture:
text
/DMO data
↓
CDS View Entities
↓
Reader class
↓
Runner classThe Runner should not contain direct SQL against /DMO/* database tables.
The Reader should consume your CDS entities.
The CDS layer should own reusable data modeling and relationships.
4. Objects to create
Use your own student/group suffix in place of ###.
Create at least:
text
2 CDS View Entities
1 Reader class
1 Runner classSuggested naming:
text
ZI_PROJECT_TRAVEL_###
ZI_PROJECT_BOOKING_###
ZCL_PROJECT_READER_###
ZCL_PROJECT_RUNNER_###You may choose different names if they are clear and consistent.
5. Suggested development sequence
A sensible order is:
text
1. Inspect the /DMO sources
2. Draw the relationships
3. Build Travel CDS
4. Preview Travel CDS
5. Build Booking CDS
6. Add associations
7. Verify Follow Association
8. Add calculated element
9. Preview and test CDS
10. Build Reader
11. Test Reader methods
12. Build Runner
13. Add summary logic
14. Test edge cases
15. Clean up names/output
16. Write architecture explanationYou do not have to follow this exact order, but avoid trying to build the entire application at once.
6. Data sources
Use SAP Flight Reference Scenario data.
Your project should use data from objects such as:
text
/DMO/TRAVEL
/DMO/BOOKING
/DMO/I_CUSTOMER
/DMO/I_CARRIER
/DMO/I_CONNECTIONYou may inspect related /DMO/* objects where necessary.
Do not create or modify objects in the /DMO/ namespace.
7. Travel CDS requirements
Create a CDS View Entity representing one travel record.
It should expose enough information to support the application.
At minimum, include fields equivalent to:
text
TravelId
CustomerId
CustomerName
BeginDate
EndDate
BookingFee
TotalPrice
CurrencyCode
TravelStatusYour exact field names may differ.
Required relationship
The travel model must use at least one CDS association.
A natural relationship is:
text
Travel -> CustomerUse an appropriate target CDS entity from the SAP Flight Reference Scenario.
The customer name should be obtained through the association or a path expression rather than by performing a separate lookup in the Runner.
8. Booking CDS requirements
Create a second CDS View Entity representing bookings belonging to a travel.
At minimum, expose fields equivalent to:
text
TravelId
BookingId
CarrierId
CarrierName
ConnectionId
FlightDate
DepartureAirportId
DestinationAirportId
DepartureTime
ArrivalTime
FlightPrice
CurrencyCodeYour exact field names may differ.
9. Required associations
Across the project, use at least three CDS associations.
The project should include relationships comparable to:
text
Travel -> Customer
Booking -> Carrier
Booking -> ConnectionYou may add more if they improve your model.
10. Composite-key requirement
At least one association must use a composite-key relationship.
Your Booking -> Connection relationship is a good candidate.
Before writing the association:
- inspect the key of the target connection entity;
- identify all source fields required to match that target;
- use the complete relationship in the
ONcondition.
Do not assume that ConnectionId by itself uniquely identifies a connection.
11. Association exposure
Expose at least one association in a CDS element list.
Then use ADT Data Preview to verify it with:
text
Follow AssociationRecord which association you followed and what target data you inspected.
Example:
text
Association followed: _Carrier
Target checked: /DMO/I_CARRIER12. Calculated CDS requirement
Create at least one calculated CDS element.
Choose something useful to the project.
Examples:
text
RouteCode
DeparturePeriod
CustomerDisplayName
TravelDurationCategoryPossible examples:
text
FRA -> JFKor:
text
Morning
Afternoon
EveningUse techniques from Lesson 3 such as:
text
CASE
CONCAT_WITH_SPACE
typed literalsDo not calculate the same value again in the Runner if it already belongs to the CDS model.
13. Reader class requirements
Create one Reader class for the project.
Suggested name:
text
ZCL_PROJECT_READER_###The Reader should expose at least these two operations:
text
GET_TRAVEL
GET_BOOKINGSGET_TRAVEL
Input:
text
Travel IDOutput:
text
one travel result
found/not-found informationYou may use a Boolean result or another clear mechanism to indicate whether the travel exists.
GET_BOOKINGS
Input:
text
Travel IDOutput:
text
all bookings belonging to that travelSort the result in a meaningful order.
For example:
text
BookingIdor:
text
FlightDate + DepartureTime14. Reader constraints
The Reader must:
- select from your CDS entities;
- use ABAP SQL;
- use host variables where appropriate;
- keep SQL out of the Runner;
- return clearly typed results;
- use deterministic ordering where output order matters.
The Reader must not:
- perform direct
/DMO/*database-table lookups from the Runner; - duplicate relationship logic that already belongs in CDS;
- use a separate Reader for every associated object merely to simulate joins manually.
15. Runner requirements
Create an executable console class.
Suggested name:
text
ZCL_PROJECT_RUNNER_###Implement:
text
IF_OO_ADT_CLASSRUNUse one Travel ID as the input for the project run.
Example:
abap
DATA travel_id TYPE /dmo/travel-travel_id VALUE '00000123'.Use a Travel ID that exists in your system for your successful test case.
16. Runner responsibilities
The Runner should:
- instantiate the Reader;
- request the Travel record;
- handle the not-found case;
- request all bookings for the Travel;
- print the Travel/customer information;
- print the Booking details;
- calculate and display the required summary.
The Runner should not:
- contain direct SQL against
/DMO/*tables; - reproduce CDS association logic;
- repeat calculations that already belong to CDS.
17. Required ABAP summary logic
The Runner must calculate at least these two values in ABAP:
text
Number of bookings
Number of different carriersExample:
text
Bookings: 4
Different carriers: 2The purpose of this requirement is to keep some genuine application logic in ABAP rather than placing everything in CDS.
You may use:
text
internal tables
LOOP
READ TABLE
table expressions
sorted/hashed helper tablesChoose a solution that is clear and appropriate.
18. Required success case
Test with a Travel ID that exists and has at least one Booking.
Your output should include:
text
Travel ID
Customer name
Travel dates
Booking count
Different-carrier count
Booking detailsFor each booking, display at least:
text
Carrier name
Route
Flight date
Departure time
Arrival time19. Required not-found case
Test with a Travel ID that does not exist.
Expected behavior should be similar to:
text
Travel 99999999 was not found.Do not let the application continue as if a valid Travel had been loaded.
20. Required no-bookings case
If your demo data contains a Travel with no bookings, test it.
Expected behavior:
text
Travel found.
No bookings exist for this travel.If your system does not contain such a Travel, explain how your application would behave in that case.
21. Required test cases
Document at least three test cases.
Test 1 — Existing Travel with bookings
text
Travel ID:
Expected result:
Actual result:Test 2 — Unknown Travel
text
Travel ID:
Expected result:
Actual result:Test 3 — Additional case
Choose one:
text
Travel with multiple carriers
Travel with one carrier
Travel with many bookings
Travel with no bookingsRecord:
text
Travel ID:
Scenario:
Expected result:
Actual result:22. Architecture and design questions
Include a short explanation of your final architecture.
Use a diagram similar to:
text
Runner
↓
Reader
↓
Travel CDS + Booking CDS
↓
Associations
↓
SAP /DMO dataThen explain your architecture and design decisions:
Why does the Runner not query the database directly?
Why are Customer, Carrier, and Connection relationships modeled in CDS?
Which logic belongs in CDS?
Which logic belongs in ABAP?
Why did you create two CDS entities instead of one very large entity?
Why is Booking -> Connection modeled with a composite ON condition?
Why is the calculated element defined in CDS?
Why are booking count and distinct-carrier count calculated in ABAP?
Why is the Reader still useful when CDS already models the data?
23. Technical constraints
Your submitted solution must:
- use modern
define view entitysyntax; - use ABAP SQL, not obsolete Open SQL terminology/syntax;
- use meaningful CDS aliases;
- use explicit CDS element lists;
- use at least three associations;
- expose at least one association;
- use at least one path expression;
- use at least one composite-key association condition;
- use at least one calculated CDS element;
- use one Reader class;
- use one Runner class;
- keep direct SQL out of the Runner;
- keep the project read-only.
Do not implement:
text
INSERT
UPDATE
DELETE
RAP
OData
Service Definitions
Service Bindings
Fiori Elements
UI annotationsThose topics belong later in the course.
24. What is not part of the project
Do not add concepts that have not yet been taught merely to make the project appear more advanced.
This project does not require:
text
CDS aggregation
GROUP BY
HAVING
RAP behavior
transactional writes
OData
UI annotations
Fiori Elements
custom persistence tablesThe challenge is to combine the concepts you already know correctly.
25. Stretch goals
These are optional.
Complete them only after the mandatory requirements work.
Stretch goal 1 — Departure period
Add:
text
Morning
Afternoon
Eveningbased on departure time.
Stretch goal 2 — First and last flight
Calculate in ABAP:
text
earliest departure
latest arrivalfor the selected Travel.
Stretch goal 3 — Carrier summary
Display each carrier used by the Travel exactly once.
Example:
text
Carriers used:
Lufthansa
United AirlinesStretch goal 4 — Country enrichment
Extend the booking model so the route output contains country information for departure and destination airports.
Use CDS relationships rather than Runner-side lookups.
Stretch goal 5 — Compare JOIN and ASSOCIATION designs
Create a temporary alternative implementation for one relationship using an explicit join.
Write a short comparison:
text
JOIN version
ASSOCIATION versionExplain which design you prefer for the reusable relationship and why.
26. Deliverables
Submit:
text
Travel CDS View Entity
Booking CDS View Entity
Reader class
Runner class
Architecture diagram/explanation
Test-case resultsAlso include the names of all objects you created.
Example:
text
ZI_PROJECT_TRAVEL_017
ZI_PROJECT_BOOKING_017
ZCL_PROJECT_READER_017
ZCL_PROJECT_RUNNER_01727. Submission checklist
CDS
Reader
Runner
Documentation
28. Evaluation criteria
The project should be evaluated primarily on correctness and design rather than code volume.
Suggested weighting:
| Area | Weight |
|---|---|
| CDS modeling and relationships | 30% |
| Association/cardinality/key correctness | 20% |
| Reader/Runner architecture | 20% |
| ABAP summary logic | 10% |
| Error handling and testing | 10% |
| Code clarity and explanation | 10% |
A smaller, clean solution is preferable to a larger solution with duplicated logic or incorrect relationships.
29. Useful ADT shortcuts
| Action | Shortcut |
|---|---|
| Open ABAP Development Object | Ctrl + Shift + A |
| Code completion | Ctrl + Space |
| Syntax check | Ctrl + F2 |
| Activate current object | Ctrl + F3 |
| Activate inactive objects | Ctrl + Shift + F3 |
| CDS Data Preview | F8 |
| Run console class | F9 |
| Format source | Shift + F1 |
30. Final goal
By the end of the project, you should be able to explain your application from top to bottom:
text
What data is stored?
What does CDS model?
Which relationships are associations?
What does the Reader retrieve?
What does the Runner calculate?
How are missing results handled?The project is complete when the application works and you can explain why the solution is structured the way it is.