Chapter 20 · Capstone Project
Capstone — Build a Complete App
Consolidate everything from Chapters 1–19 into one working SAP application — and turn it into the portfolio piece that gets you hired.
You have reached the final chapter. Over the last 19 chapters, you have learned classic ABAP, modern ABAP, RAP, CDS Views, Fiori, debugging, performance tuning, and interfaces. That is a lot of knowledge — but knowledge alone does not get you hired. Proof of skill does.
This chapter is where you turn everything into one working application — a capstone project that demonstrates what you can actually do. Not a tutorial exercise. Not a copy-paste from a book. Your own business scenario, your own design, your own code, your own app.
And at the end, you will have something to show recruiters, hiring managers, and interviewers — a link they can click, screenshots they can review, and a story you can tell.
🎯 What You Will Achieve in This Chapter
- A complete, working, end-to-end SAP application on your own system
- A GitHub repository with your source code exported via abapGit
- A README document explaining your design and architecture
- Screenshots and a demo of the working Fiori app
- A prepared interview presentation (5-10 minutes)
- A polished portfolio entry for your resume, LinkedIn, and blog
- Confidence that you can build real SAP applications independently
📘 What is a Capstone Project?
A capstone project is a self-designed, self-built, end-to-end application that demonstrates your skills. Unlike a tutorial (where you follow steps someone else wrote), a capstone is your own project — you choose the scenario, design the solution, and implement it.
Why capstone projects matter for SAP careers
| Without a Capstone | With a Capstone |
|---|---|
| “I completed some tutorials.” | “I built this app from scratch.” |
| No proof of independent capability | Working code the recruiter can review |
| Generic resume | Portfolio link that stands out |
| Vague answers to “what have you built?” | Concrete story with screenshots and architecture |
| Competes with 100s of other beginners | Diffs itself from beginners who only followed tutorials |
🎬 Step 1 — Choose Your Business Scenario
Do not try to build something huge. Choose a scenario that is small enough to finish but real enough to be meaningful. The Travel scenario from Chapter 17 is a great default. Here are three options.
Option A — Travel Management (Recommended)
An app for managing business trips. Fields: Travel ID, Employee, Destination, Start Date, End Date, Cost, Currency, Status. Actions: Submit, Approve, Cancel.
Option B — Employee Leave Requests
An app for HR to manage employee leave. Fields: Request ID, Employee, Leave Type, Start Date, End Date, Days, Status. Actions: Approve, Reject.
Option C — Purchase Requisition Tracking
An app for procurement to track internal purchase requests. Fields: PR Number, Requester, Department, Item, Amount, Status. Actions: Submit, Approve.
🏗️ Step 2 — Design the Data Model
Every capstone starts with a table. What data does your scenario need? Write the fields down on paper first — then build.
Example — Travel table (ZTRVL_HEADER)
| Field | Type | Purpose |
|---|---|---|
| MANDT | CLNT(3) | Client — always the first field |
| TRAVEL_ID | NUMC(10) | Unique travel record number (primary key) |
| EMPLOYEE_ID | CHAR(10) | Who is travelling |
| DESTINATION | CHAR(40) | Where they are going |
| START_DATE | DATS(8) | Travel start |
| END_DATE | DATS(8) | Travel end |
| COST | CURR(15,2) | Total cost |
| CURRENCY | CUKY(5) | Currency for the cost field |
| STATUS | CHAR(1) | N = New, A = Approved, R = Rejected |
| CREATED_BY | CHAR(12) | User who created it |
| CREATED_AT | DEC(15) | Timestamp |
Build the table
Right-click your package → New → Other ABAP Repository Object → Dictionary → Database Table. Name it ZTRVL_HEADER. Use a delivery class of A (application table) and data class APPL0 (master data).
Add each field from the table above. Mark MANDT and TRAVEL_ID as key fields.
Save and activate the table. You now have a place to store your data.
⚙️ Step 3 — Build the RAP Business Object
This is the heart of your capstone. You will create six objects that work together.
| Object | Name Example | Purpose |
|---|---|---|
| Interface View | ZI_Travel | Reads data from ZTRVL_HEADER |
| Consumption View | ZC_Travel | Adds UI annotations for Fiori |
| Behavior Definition | ZI_Travel (BDEF) | Declares operations, validations, determinations |
| Behavior Implementation | ZBP_Travel | Implements the business logic |
| Service Definition | ZUI_TRAVEL | Exposes the entities as OData |
| Service Binding | ZUI_TRAVEL_O4 | OData V4 endpoint for Fiori |
Step 3a — Create the Interface View
@AbapCatalog.sqlViewName: 'ZITRAVEL'
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Travel Interface View'
define view ZI_Travel as select from ztrvl_header
{
key travel_id as TravelId,
employee_id as EmployeeId,
destination as Destination,
start_date as StartDate,
end_date as EndDate,
cost as Cost,
currency as Currency,
status as Status,
created_by as CreatedBy,
created_at as CreatedAt
}
Step 3b — Create the Consumption View with UI Annotations
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Travel App'
@UI.headerInfo: {
typeName: 'Travel',
typeNamePlural: 'Travels',
title: { type: #STANDARD, value: 'TravelId' }
}
define view entity ZC_Travel
as select from ZI_Travel
{
@UI.lineItem: [{ position: 10 }]
@UI.identification: [{ position: 10 }]
key TravelId,
@UI.lineItem: [{ position: 20 }]
@UI.selectionField: [{ position: 10 }]
EmployeeId,
@UI.lineItem: [{ position: 30 }]
Destination,
@UI.lineItem: [{ position: 40 }]
StartDate,
@UI.lineItem: [{ position: 50 }]
EndDate,
@UI.lineItem: [{ position: 60 }]
@Semantics.amount.currencyCode: 'Currency'
Cost,
@Semantics.currencyCode: true
Currency,
@UI.lineItem: [{ position: 70 }]
Status
}
Step 3c — Create the Behavior Definition
managed implementation in class ZBP_Travel unique;
define behavior for ZI_Travel
persistent table ztrvl_header
lock master
authorization master ( global )
{
create;
update;
delete;
field ( readonly ) TravelId;
validation validateDates on save { field StartDate, EndDate; }
validation validateCost on save { field Cost; }
determination setInitialStatus on modify { field Status; }
determination setCreatedInfo on save { field CreatedBy, CreatedAt; }
action ( features : instance ) approve;
action ( features : instance ) reject;
}
Step 3d — Implement the Behavior
The class ZBP_Travel is generated automatically when you activate the BDEF. Open it and implement the methods you declared:
- validateDates — check that EndDate is not before StartDate
- validateCost — check that Cost is not negative
- setInitialStatus — set Status to ‘N’ if empty
- setCreatedInfo — fill CreatedBy and CreatedAt from sy-uname and sy-datum
- approve — set Status to ‘A’
- reject — set Status to ‘R’
create to populate it from a number range object.
Step 3e — Create the Service Definition and Binding
@EndUserText.label: 'Travel Service Definition'
define service ZUI_TRAVEL {
expose ZC_Travel as Travel;
}
Then create a Service Binding named ZUI_TRAVEL_O4 with type OData V4 – UI, activate it, and click Preview.
✅ Step 4 — Test and Polish
Before you publish, verify your app works end to end. Here is a testing checklist.
Functional testing
| Test | What to Verify |
|---|---|
| Create | Add a new Travel record with valid data. It should save. |
| Read | List report shows all records. Object page opens on row click. |
| Update | Edit a field and save. Change persists. |
| Delete | Delete a row. It disappears from the list. |
| Validation | Enter EndDate before StartDate. Save should be blocked. |
| Determination | Create a new Travel without Status. It should default to ‘N’. |
| Action | Click Approve. Status changes to ‘A’. |
| Filter | Use selection field to filter by EmployeeId. |
Edge cases to test
- What happens with an empty filter?
- What happens with a very long destination name?
- What happens on simultaneous saves (lock conflicts)?
- What happens if you enter a Cost of 0 or negative?
📄 Step 5 — Document Your Project
A working app without documentation is invisible to recruiters. Write a README that explains your design.
README structure
# Travel Management App — ABAP RAP Capstone
## Business Scenario
A Travel Management app for HR to create, approve,
and track business travel requests.
## Architecture
- Database Table: ZTRVL_HEADER
- CDS Interface View: ZI_Travel
- CDS Consumption View: ZC_Travel
- Behavior Definition: ZI_Travel
- Behavior Implementation: ZBP_Travel
- Service Definition: ZUI_TRAVEL
- Service Binding: ZUI_TRAVEL_O4 (OData V4)
## Key Features
- Full CRUD operations on Travel records
- Validation: End date must be >= Start date
- Validation: Cost must be positive
- Determination: Status defaults to 'N' on creation
- Determination: CreatedBy and CreatedAt filled on save
- Action: Approve / Reject
## Screenshots
- List Report view
- Object Page view
- Validation error example
- Success message after approval
## Tech Stack
- SAP BTP ABAP Environment (or S/4HANA 2020+)
- ABAP RESTful Application Programming Model (RAP)
- OData V4
- Fiori Elements
## How to Run
1. Import the objects into your ABAP system
2. Activate in this order: Table → CDS Views → BDEF → ZBP → Service Def → Binding
3. Open Service Binding → Preview
## Author
[Your Name] — [Your LinkedIn / GitHub]
🎤 Step 7 — Present in an Interview
When an interviewer asks “tell me about a project you’ve built” — this is your moment.
The 5-minute presentation structure
| Time | What to Cover |
|---|---|
| 30 sec | The scenario — what problem does the app solve? |
| 1 min | The architecture — table, CDS, BDEF, service, UI |
| 2 min | The demo — walk through create, validation, action, approve |
| 1 min | The challenges — what broke, how you fixed it |
| 30 sec | The link — GitHub repo, blog post, LinkedIn |
🚀 What’s Next After the Capstone
You have finished the series. But your learning is only beginning. Here is what comes next.
Build a second capstone
Two projects are better than one. Pick a different scenario — HR Leave Requests, Procurement, or Sales — and build the same RAP pattern. This time faster, because you already know the workflow.
Deepen your knowledge
| Topic | Where to Go Next |
|---|---|
| Draft Handling in RAP | Add draft-enabled editing to your capstone |
| Analytical CDS Views | Build KPI tiles for Fiori Overview Page |
| SAP Fiori Freestyle | Learn SAPUI5 to build custom UIs |
| ABAP Unit Testing | Write unit tests for your Behavior Implementation |
| SAP BTP Deployment | Deploy your app on SAP BTP ABAP Environment |
| Clean Core Concepts | Understand released APIs and upgrade safety |
Apply for jobs
You are ready. Your resume should include:
- Your capstone project (with GitHub link)
- Your blog posts from this series
- Your LinkedIn with the project pinned
- Interview practice on the 165 Q&A across all 20 chapters
- A working ABAP Cloud environment
- Classic ABAP fundamentals
- Real-world skills (debugging, enhancements, interfaces, forms, performance)
- Modern ABAP (CDS Views, RAP, EML, Fiori, OData)
- A complete capstone project in your portfolio
- 165+ interview questions answered
📝 Final Chapter Summary
- Capstone projects prove skill — a working app beats a certificate or a tutorial.
- Choose a small, real scenario — Travel, Leave, or Procurement.
- Build the data model first — a table, then CDS Views, then RAP.
- Use Managed RAP + OData V4 + Fiori Elements — the modern standard.
- Add validations, determinations, and actions — this is where real business logic lives.
- Test thoroughly — create, read, update, delete, edge cases.
- Document with a README — scenario, architecture, features, screenshots.
- Publish with abapGit — get your code on GitHub.
- Share on LinkedIn and your blog — make it visible.
- Present in 5 minutes — scenario, architecture, demo, challenges, link.
- Build a second project — two capstones doubles your credibility.
🎤 Interview Questions & Answers
These are the questions you will face about your capstone project. Prepare your answers with your specific project details.
Use the 5-minute structure: scenario, architecture, demo, challenges, link. Pick a specific project — the capstone you built — and walk through it as a story. Focus on what you designed and what broke, not on tutorials you followed.
Managed RAP handles CRUD, transactional consistency, and draft automatically. My business logic was standard create/update/delete with validations — no need for the full control of Unmanaged. Managed gave me a working app faster and with less code to maintain. If I had needed to wrap a legacy BAPI, I would have used Unmanaged.
I used the standard three-layer pattern: a Basic Interface View (ZI_Travel) that reads from the table, and a Consumption View (ZC_Travel) that adds UI annotations and exposes the entity for the Service Definition. This separation lets me change the UI without touching the data model, and vice versa.
I implemented two validations. The first checks that End Date is not before Start Date — a travel cannot end before it starts. The second checks that Cost is not negative. Both are declared on save in the Behavior Definition and implemented in ZBP_Travel. They return error messages via the REPORTED parameter and block the save if the rule fails.
I used a Determination declared on save. When the record is saved, the framework calls setCreatedInfo, which fills CreatedBy from sy-uname and CreatedAt from sy-datum plus sy-uzeit. The user never sees these fields as input — they are auto-filled.
Be honest. Common answers: getting the number range to generate Travel IDs correctly, or figuring out why the Fiori app did not show the Approve button (because the action was not declared correctly in the BDEF). Whatever it actually was — describe the problem, what you tried, and how you solved it. Interviewers love this because it shows real debugging skills.
I would add: draft handling so users can save incomplete work, a second entity (Travel Items) to represent sub-records, an analytical CDS View for reporting, and integration with the HR system for employee validation. I would also add authorization checks with DCL for row-level security based on department.
I used OData V4 because it is the modern standard and fully supported by RAP. V4 is REST-native, supports cleaner batch operations, and works out of the box with the latest Fiori Elements. V2 is legacy and should not be used for new development.
Have a GitHub link ready. “The source code is on GitHub at [URL]. You can see the CDS Views, Behavior Definition, implementation class, and the Service Definition. The README explains the architecture and includes screenshots.” This is your moment to look professional.
This is a maturity question. Good answer: “I would define the data model more carefully upfront — I changed the table structure twice, which meant re-doing the CDS Views. Next time I would spend more time on design before coding. I would also add unit tests earlier instead of after everything worked.”
🛠 Final Capstone Checklist
Work through this checklist. When every box is ticked, your capstone is complete.
Build
- ☐ Database table created and activated
- ☐ Interface CDS View created
- ☐ Consumption CDS View with UI annotations
- ☐ Behavior Definition declared
- ☐ Behavior Implementation class with validations
- ☐ At least one determination implemented
- ☐ At least two actions (e.g., Approve, Reject)
- ☐ Service Definition created
- ☐ Service Binding activated (OData V4)
Test
- ☐ Created a new record successfully
- ☐ Updated a record successfully
- ☐ Deleted a record successfully
- ☐ Triggered a validation error
- ☐ Triggered a determination
- ☐ Triggered a custom action
- ☐ Verified Fiori app preview works
Document
- ☐ README written with scenario and architecture
- ☐ Screenshots of the working app
- ☐ Code pushed to GitHub via abapGit
- ☐ Blog post published (optional)
- ☐ LinkedIn post shared
- ☐ Resume updated with project link
Test: Kon Banega Crorepati?
5 questions. ₹1 Crore. Prove you understood the capstone project. No pressure — restart anytime.
Explore Our Instructor-Led SAP & IT Courses
Self-study works. But if you want guided training, real project practice, and placement support — here are the courses we offer. Book a free demo before you decide.
WhatsApp us