Prev Next

SAP / SAP Mid Level (3 to 8 yrs) Interview questions

1. What is SAP HANA and why is it described as an in-memory database? 2. How does in-memory processing improve performance compared to traditional disk-based databases? 3. Explain the difference between row store and column store in HANA? 4. Why does HANA favor columnar storage for analytical workloads? 5. What is code-to-data pushdown in the context of HANA? 6. Why should business logic be pushed down to the database layer in HANA-based applications? 7. What is the difference between OLTP and OLAP workloads, and how does HANA handle both? 8. Explain the internal working of HANA's in-memory computing engine? 9. What is columnar storage and how does it differ from row-based storage? 10. When is column store preferred over row store in HANA? 11. How does data compression work in HANA's columnar storage? 12. Explain how columnar storage improves aggregation query performance? 13. What is a delta store in HANA's columnar storage architecture? 14. How does HANA merge delta store data into the main store? 15. What are CDS Views in SAP? 16. Why are CDS Views considered a shift from classical ABAP data modeling? 17. What is the difference between a CDS View and a classical ABAP view? 18. Explain the concept of code pushdown in CDS Views? 19. What are associations in CDS Views? 20. What is the difference between an association and a JOIN in CDS Views? 21. What are annotations in CDS Views and why are they important? 22. How do you expose a CDS View as an OData service? 23. What is the difference between a basic/interface CDS View and a consumption CDS View? 24. How do you troubleshoot performance issues in a CDS View? 25. What is the RAP (RESTful ABAP Programming) model? 26. What is the difference between RAP and the classical ABAP programming model? 27. What is a behavior definition in RAP? 28. What is the difference between managed and unmanaged RAP scenarios? 29. What is the CAP (Cloud Application Programming) model? 30. What is the difference between RAP and CAP? 31. Explain the architecture of a typical RAP-based Fiori application? 32. How do you implement validations and determinations in RAP? 33. What is OData and why is it used in SAP? 34. Explain the difference between OData V2 and OData V4? 35. What is an OData service in the context of SAP Fiori/Gateway? 36. How do you expose backend data as an OData service? 37. What is the role of SAP Gateway in OData service implementation? 38. Explain the CRUD operations supported by OData services? 39. How do you troubleshoot a failing OData service call? 40. What is metadata in an OData service and why does it matter? 41. What is SAP Fiori and how does it differ from classical SAP GUI? 42. What are Fiori design principles? 43. What is the difference between SAPUI5 and Fiori? 44. How do you debug a SAP Fiori application? 45. What is SAP Activate methodology? 46. What are the Explore and Realize phases in SAP Activate? 47. How does SAP Activate differ from the classical ASAP methodology? 48. What is a fit-to-standard workshop in the Explore phase?
Could not find what you were looking for? send us the question and we would be happy to answer your question.

1. What is SAP HANA and why is it described as an in-memory database?

SAP HANA (High-performance ANalytic Appliance) is SAP's proprietary database platform that keeps the primary copy of data resident in RAM rather than treating disk as the main storage medium the way traditional databases do — disk is still used for persistence (so data survives a restart), but the data actively being read and written lives in memory.

flowchart LR
    A[Application query] --> B[HANA in-memory engine - data resident in RAM]
    B --> C[Result returned, typically in milliseconds]
    B -.persisted asynchronously.-> D[Disk - for durability/restart]

Since RAM access is orders of magnitude faster than disk I/O, this eliminates the traditional bottleneck of waiting on disk reads for every query, which is what lets HANA run complex analytical queries against large datasets in near real time — a workload that would require pre-aggregated reporting tables or overnight batch jobs on a disk-based system.

Where does SAP HANA keep the primary, actively-used copy of data?
What traditional bottleneck does in-memory processing eliminate?

2. How does in-memory processing improve performance compared to traditional disk-based databases?

Disk I/O, even on fast SSDs, is dramatically slower than RAM access — often by two to three orders of magnitude. A traditional disk-based database mitigates this with caching, indexes, and pre-aggregated summary tables to avoid hitting disk on every query, but those techniques add complexity and can still fall behind disk when data isn't already cached.

-- traditional approach: rely on a pre-built aggregate table
SELECT * FROM sales_summary_by_month;   -- fast, but requires overnight batch job to build

-- HANA approach: aggregate on the fly, directly against live transactional data
SELECT region, SUM(amount) FROM sales_transactions GROUP BY region;   -- fast even without pre-aggregation

Because HANA's data already lives in memory, it can compute aggregations and complex joins directly against live, current data on every query, without needing pre-built summary tables refreshed on a schedule — collapsing the traditional separation between "fast reporting on stale, pre-aggregated data" and "slow reporting on live, current data" into one system that does both.

Roughly how does RAM access speed compare to disk I/O?
What traditional technique does in-memory processing reduce the need for?

3. Explain the difference between row store and column store in HANA?

HANA supports both storage layouts, and choosing between them matters for performance depending on how data is typically queried.

Row StoreColumn Store
Data physically stored row by row, all fields of a row together. Data physically stored column by column, all values of one field together.
Efficient for retrieving/writing a whole record at once (OLTP-style). Efficient for scanning/aggregating one or a few columns across many rows (OLAP-style).
Better fit for small, transactional tables. Better fit for large tables with analytical, aggregate-heavy queries.
-- column store shines here: scanning just the `amount` and `region` columns
-- across millions of rows, ignoring every other field entirely
SELECT region, SUM(amount) FROM sales_transactions GROUP BY region;

HANA's default and predominant storage for most business tables is column store, since analytical, aggregate-style access patterns are extremely common in ERP reporting, but row store remains available and appropriate for specific tables where whole-row access dominates.

How is data physically organized in column store, compared to row store?
Which storage layout is generally better for aggregate-heavy analytical queries?

4. Why does HANA favor columnar storage for analytical workloads?

An analytical query like SUM(amount) GROUP BY region only needs two of a table's many columns. In row store, the database still has to read every full row from disk/memory (including every column it doesn't need) just to extract those two fields, since a row's data is stored together as one contiguous unit. In column store, only the specific columns actually referenced by the query need to be touched at all — the rest of the table's data isn't read.

flowchart TD
    A[Query needs region, amount only] --> B{Row Store}
    A --> C{Column Store}
    B --> D[Reads every column of every row, discards unneeded ones]
    C --> E[Reads only the region and amount columns directly]

This selective column access, combined with columnar data's tendency to compress extremely well (since values within one column are often repetitive — the same region name appearing thousands of times, for instance), is what gives column store its major performance advantage specifically for the aggregate-heavy, few-columns-many-rows access pattern typical of analytical reporting.

What does column store avoid reading that row store cannot avoid for a query needing only two columns?
Why does columnar data tend to compress especially well?

5. What is code-to-data pushdown in the context of HANA?

Code-to-data pushdown means moving data-intensive processing logic (filtering, aggregation, joins) into the database layer itself — executing it as SQL or HANA-native logic close to where the data actually lives — rather than pulling large volumes of raw data up to the application layer and processing it there in ABAP.

"  anti-pattern: pull everything, aggregate in ABAP
SELECT * FROM sales_transactions INTO TABLE @DATA(lt_all).
LOOP AT lt_all INTO DATA(ls_row).
  " manually accumulate totals per region in ABAP
ENDLOOP.

"  pushdown: let the database do the aggregation
SELECT region, SUM( amount ) AS total
  FROM sales_transactions
  GROUP BY region
  INTO TABLE @DATA(lt_totals).

Since HANA's in-memory engine can aggregate and filter enormous datasets extremely fast, and network/data transfer between the database and application layers is comparatively slow, pushdown avoids moving far more data than necessary across that boundary — a core principle behind modern ABAP development (CDS Views, AMDP) built specifically to encourage this pattern rather than the older habit of pulling data into internal tables for processing.

What does code-to-data pushdown move closer to the database?
Why is pushdown preferred over pulling large datasets into ABAP internal tables for processing?

6. Why should business logic be pushed down to the database layer in HANA-based applications?

Beyond the raw performance benefit of avoiding unnecessary data transfer, pushdown takes advantage of HANA's massively parallel, in-memory computation engine, which is architecturally built to process large volumes of data far faster than row-by-row ABAP processing on the application server ever could.

flowchart LR
    A[Without pushdown] --> B[Millions of rows transferred to app server]
    B --> C[ABAP loops row-by-row: slow]

    D[With pushdown] --> E[Aggregation/filtering runs inside HANA]
    E --> F[Only the small final result set transferred]

Practically, this means favoring CDS Views, native SQL aggregation, and AMDP (ABAP Managed Database Procedures) for computation-heavy logic, over classical patterns that read wide swaths of data into internal tables and loop through them in ABAP. It's a genuine architectural shift in mindset for developers coming from classical ABAP: the database is no longer just "dumb storage" to fetch from, but an active computation engine that should be doing as much of the heavy lifting as possible.

What computational advantage does HANA's engine have over row-by-row ABAP processing?
What mindset shift does pushdown represent for developers used to classical ABAP?

7. What is the difference between OLTP and OLAP workloads, and how does HANA handle both?

OLTP (Online Transaction Processing) workloads are characterized by many small, frequent read/write operations on individual records — creating a sales order, updating a stock level. OLAP (Online Analytical Processing) workloads involve fewer, larger queries that scan and aggregate across huge volumes of data — a quarterly sales report across every region and product line.

OLTPOLAP
Many small transactions on individual rows. Fewer, large aggregate queries across many rows.
Traditionally favors row store.Traditionally favors column store.
Example: creating a sales order.Example: quarterly sales report by region.

Traditional architectures typically needed a separate data warehouse for OLAP, fed by nightly batch loads from the OLTP system, since the two workloads had conflicting performance characteristics. HANA's speed and columnar storage let it handle both directly against the same live data, which is the foundation of SAP's pitch for S/4HANA eliminating the need for a separate reporting/warehouse system for many use cases.

What characterizes an OLTP workload?
What traditionally required a separate data warehouse fed by nightly batch loads?

8. Explain the internal working of HANA's in-memory computing engine?

HANA's engine keeps table data resident in RAM, organized primarily in columnar format, and distributes query processing across multiple CPU cores in parallel — a single large aggregation query can be split into pieces, each processed by a different core simultaneously, then combined into the final result.

flowchart TD
    A[Query received] --> B[Query optimizer builds execution plan]
    B --> C[Work split across multiple CPU cores in parallel]
    C --> D[Each core processes its portion of in-memory columnar data]
    D --> E[Partial results combined into final result set]

Persistence is handled asynchronously: changes are written to a redo log immediately (for durability against a crash) and periodically checkpointed to disk in the background, but the actual working data a query touches stays resident in RAM rather than being fetched from disk on demand. This combination — in-memory data, columnar organization, and massively parallel execution across cores — is what lets HANA process queries that would take minutes on a traditional database in a fraction of a second.

How does HANA typically process a large aggregation query across multiple CPU cores?
How is durability against a crash achieved, given data lives in memory?

9. What is columnar storage and how does it differ from row-based storage?

Columnar storage physically groups all values belonging to one column together on disk/in memory, rather than grouping all fields of one row together the way row-based storage does — a fundamental reordering of how the same logical table data is laid out physically.

flowchart TD
    subgraph RowStore["Row Store"]
    R1[Row1: id=1,name=Ada,age=34]
    R2[Row2: id=2,name=Grace,age=41]
    end
    subgraph ColStore["Column Store"]
    C1[id column: 1,2]
    C2[name column: Ada,Grace]
    C3[age column: 34,41]
    end

The practical consequence: a query needing only the age column can read just that one contiguous block of data in column store, while row store would need to touch every row's full data to extract that same single field. This reordering is specifically optimized for read-heavy, few-columns-many-rows analytical access, at some cost to the efficiency of writing or reading one complete row at a time.

What does columnar storage group together physically?
What access pattern is columnar storage specifically optimized for?

10. When is column store preferred over row store in HANA?

Column store is the right default for large tables where queries typically aggregate or filter across a subset of columns spanning many rows — the classic reporting and analytics pattern. Row store remains preferable for smaller tables, or tables where the typical access pattern reads or writes an entire row's worth of fields at once, since row store avoids the overhead of reconstructing a full row from separately stored columns.

Favor Column StoreFavor Row Store
Large tables with analytical/aggregate queries. Small, frequently whole-row-accessed tables.
Queries typically touch a subset of columns. Queries typically need every field of a row together.
Reporting, dashboards, mass data scans. System/configuration tables, small lookup tables.

In practice, most business data tables in S/4HANA default to column store, since that pattern dominates modern SAP applications, with row store reserved for a smaller set of specific tables where its characteristics are genuinely a better fit.

What kind of table is column store best suited for?
Why might row store be preferable for certain small system/configuration tables?

11. How does data compression work in HANA's columnar storage?

Because a single column typically contains many repeated or similar values (a country code column with only a few dozen distinct values across millions of rows, for instance), HANA applies compression techniques like dictionary encoding: each distinct value is stored once in a compact dictionary, and the actual column data is stored as short numeric references into that dictionary rather than repeating the full value every time.

flowchart LR
    A[Column values: US, US, DE, US, DE] --> B[Dictionary: 0=US, 1=DE]
    B --> C[Compressed column stored as: 0,0,1,0,1]

This dramatically shrinks the memory footprint of columns with low cardinality (few distinct values), which both reduces the total RAM needed to hold a table and speeds up scans, since less data actually needs to be read and processed for the same logical column. Columns with high cardinality (like a unique ID) compress less dramatically, but HANA applies other techniques (like run-length encoding for sorted or repeated sequences) depending on the column's actual data characteristics.

What compression technique replaces repeated values with short references into a dictionary?
Which type of column compresses most dramatically with dictionary encoding?

12. Explain how columnar storage improves aggregation query performance?

An aggregation like SUM(amount) GROUP BY region only needs to touch two columns: amount and region. Because columnar storage keeps each column's values contiguous and separate from every other column, HANA can scan just those two columns directly, entirely skipping every other field the table might have (customer notes, timestamps, addresses, whatever else exists), which a row-oriented layout couldn't avoid reading.

flowchart TD
    A[GROUP BY region, SUM amount] --> B[Scan only 'region' column - contiguous block]
    A --> C[Scan only 'amount' column - contiguous block]
    B --> D[Combine and aggregate per group]
    C --> D

Combined with compression (scanning a compressed column is both less data to read and faster to process) and parallel execution across CPU cores, this selective-column-scan advantage is the core reason columnar storage dramatically outperforms row storage specifically for the aggregate-heavy, wide-table, few-columns pattern typical of business reporting and analytics.

What does columnar storage let an aggregation query avoid reading entirely?
What two additional factors compound with selective-column-scanning to boost aggregation performance?

13. What is a delta store in HANA's columnar storage architecture?

HANA's columnar format is highly optimized for reads but comparatively expensive to update in place — inserting a single row into a compressed, dictionary-encoded column would require re-encoding potentially the whole column. To avoid that cost on every write, HANA maintains a separate, smaller delta store that accepts new writes quickly (in a simpler, less heavily compressed row-oriented structure), while the bulk of the table's data remains in the heavily optimized, read-efficient main store.

flowchart LR
    A[New INSERT/UPDATE] --> B[Delta store - fast writes, less compressed]
    C[Main store - heavily compressed, read-optimized] --> D[Query reads both stores together]
    B --> D

Queries transparently read from both the main store and the delta store together to produce a complete, current result, so this split is invisible to application code — it's purely an internal performance optimization that lets HANA offer both fast writes and fast, heavily-compressed reads without those two goals directly conflicting on the same physical structure.

Why does HANA maintain a separate delta store rather than writing new data directly into the main store?
Do queries need to explicitly account for the delta store separately from the main store?

14. How does HANA merge delta store data into the main store?

A background process called the delta merge periodically takes the accumulated data in the delta store and folds it into the main store, re-applying the main store's heavier compression and columnar optimization to that newly merged data, then clearing the delta store to start accumulating fresh writes again.

flowchart TD
    A[Delta store accumulates writes] --> B{Merge threshold reached?}
    B -->|Yes| C[Delta merge: fold data into main store, re-compress]
    C --> D[Delta store cleared, ready for new writes]
    D --> A

This merge can be triggered automatically (based on delta store size or a time interval) or manually via MERGE DELTA OF <table>. It's a resource-intensive operation (since it involves rebuilding compressed column structures), so it's typically scheduled during lower-activity periods for very large, heavily-written tables, balancing keeping the delta store small (for fast reads) against the cost of running merges too frequently.

What does the delta merge process do?
Why is delta merge frequency a balancing act?

15. What are CDS Views in SAP?

Core Data Services (CDS) Views are a modern way of defining data models directly in the database layer, written in a SQL-like, declarative definition language, and compiled into database views — letting you define business semantics (associations, calculated fields, annotations for UI behavior) alongside the raw data structure itself, rather than only in application-layer ABAP code.

@AbapCatalog.sqlViewName: 'ZCUSTOMERVIEW'
define view Z_Customer as select from kna1 {
    key kunnr as CustomerId,
    name1     as CustomerName,
    land1     as Country
}

Unlike a classical ABAP view (which had limited expressiveness and ran purely in the ABAP layer), a CDS View is a genuine database view, letting queries against it benefit from full pushdown to HANA's engine — a core building block behind modern SAP development, from Fiori app backends to analytical reporting.

What language style are CDS Views written in?
What does a CDS View compile into?

16. Why are CDS Views considered a shift from classical ABAP data modeling?

Classical ABAP development typically pulled raw data from database tables into internal tables and applied business logic, calculations, and joins entirely in ABAP code on the application server — the opposite of the code-to-data pushdown principle HANA is built around. CDS Views flip that: business semantics (joins via associations, calculated fields, filtering logic) are defined once, at the data model level, and pushed down to run inside the database itself.

flowchart LR
    A[Classical ABAP] --> B[Pull raw data to app server] --> C[Business logic in ABAP loops]
    D[CDS View approach] --> E[Business semantics defined in the data model] --> F[Logic pushed down, executed in HANA]

This shift also means the same underlying CDS View can be reused consistently across many different consumers — a Fiori app, an analytical report, another CDS View built on top of it — all getting the same consistent business logic and calculated fields, rather than each consumer reimplementing similar logic separately in their own ABAP code.

What does classical ABAP data modeling typically do that conflicts with pushdown principles?
What reuse benefit does defining business semantics once in a CDS View provide?

17. What is the difference between a CDS View and a classical ABAP view?

A classical ABAP view (defined in transaction SE11) is a fairly limited database view construct, typically supporting only simple inner joins between tables with restricted expressiveness. CDS Views are far more capable: they support associations (lazy, reusable joins), calculated and derived fields, annotations driving UI and OData behavior, extensibility, and a rich expression language.

Classical ABAP ViewCDS View
Limited to simple inner joins.Rich associations, outer joins, unions, calculated fields.
No metadata for UI/OData generation. Annotations drive Fiori UI rendering and OData service exposure directly.
Defined via SE11 UI.Defined as code (DDL source), version-controllable like any ABAP object.

For modern SAP development, CDS Views have essentially superseded classical ABAP views as the recommended way to define reusable, semantically-rich data models, particularly for anything that needs to be exposed via Fiori or OData.

What join capability do CDS Views support that classical ABAP views are limited on?
What can CDS View annotations drive that classical ABAP views cannot?

18. Explain the concept of code pushdown in CDS Views?

A CDS View's logic — joins, filters, calculated fields, aggregations — is compiled into an actual database view, meaning when an application queries it via Open SQL, that entire logic executes inside HANA's engine, not in the ABAP application layer. The application only receives the final, already-processed result set.

define view Z_SalesSummary as select from sales_transactions {
    region,
    sum( amount ) as TotalAmount
} group by region

"  ABAP code just selects the already-aggregated result:
SELECT * FROM z_salessummary INTO TABLE @DATA(lt_summary).
"  the SUM/GROUP BY logic ran inside HANA, not in this ABAP loop

This is the concrete mechanism behind the "push logic to the data" principle discussed elsewhere: rather than an ABAP program fetching raw rows and computing the sum itself in a loop, the CDS View's definition ensures that computation happens where the data lives, and only the small, final result crosses the boundary back to the application layer.

Where does a CDS View's join/aggregation logic actually execute?
What does the ABAP layer receive when querying a CDS View that performs aggregation?

19. What are associations in CDS Views?

An association defines a reusable relationship between one CDS View (or table) and another — declared once in the view's definition — that can then be "followed" in a query using path expressions, without needing to write out the join condition again every time.

define view Z_SalesOrder as select from vbak
  association [0..1] to Z_Customer as _Customer
    on $projection.CustomerId = _Customer.CustomerId
{
    key vbeln as SalesOrderId,
    kunnr    as CustomerId,
    _Customer.CustomerName    "  follow the association to pull in a field
}

Crucially, an association is lazy — the actual join only happens if a query explicitly follows that association's path to request a field from the associated entity. If nothing references _Customer, no join is performed at all, which avoids paying the cost of a join the query doesn't actually need, unlike a join hardcoded directly into the view's FROM clause.

What does an association define in a CDS View?
What does it mean that an association is 'lazy'?

20. What is the difference between an association and a JOIN in CDS Views?

A plain JOIN written directly in a CDS View's FROM clause is evaluated unconditionally every time the view is queried — the join always happens, whether or not the query actually needs any fields from the joined entity. An association is declared but not automatically executed; it only triggers a join if a query's field selection or filter path actually follows it.

JOINAssociation
Always executed when the view is queried. Only executed (lazily) if a query path actually follows it.
Fixed as part of the view's core query. Reusable, can be followed differently by different consumers.
Simpler for a truly always-needed relationship. Better for optional, conditionally-needed relationships.

This makes associations the better default for optional or "might be needed" relationships, since they avoid the performance cost of an unnecessary join for consumers that don't need that related data, something a hardcoded JOIN can't offer.

When does a plain JOIN in a CDS View's FROM clause execute?
Why is an association often the better default for an optional relationship?

21. What are annotations in CDS Views and why are they important?

Annotations are metadata tags (starting with @) attached to a CDS View or its fields, declaring how that view or field should behave or be treated by other SAP tools — from database catalog settings, to OData/UI rendering hints, to analytical semantics — without writing any procedural code.

@AbapCatalog.sqlViewName: 'ZCUSTVIEW'
@UI.headerInfo: { typeName: 'Customer' }
define view Z_Customer as select from kna1 {
    key kunnr as CustomerId,
    @UI.lineItem: [{ position: 10 }]
    name1     as CustomerName
}

This is what makes CDS Views so central to modern SAP development: the same view definition that describes the data also describes how a Fiori list report should render it, or how an OData service should expose it — declarative metadata driving actual application behavior, rather than needing separate, hand-written UI or service configuration layered on top.

What do CDS View annotations declare?
Why are annotations central to modern SAP development?

22. How do you expose a CDS View as an OData service?

A consumption-level CDS View annotated with @OData.publish: true (in classical service generation) or exposed via a service definition and service binding (in the newer RAP-based approach) can be directly published as an OData service, without hand-writing the service's data-fetching logic separately.

@OData.publish: true
define view entity Z_C_CustomerList as select from Z_I_Customer {
    key CustomerId,
    CustomerName,
    Country
}

"  or, in the RAP-based approach:
define service Z_CUSTOMER_SRV {
    expose Z_C_CustomerList as CustomerList;
}

Once activated, this automatically generates a working OData service that Fiori apps (or any OData consumer) can call — the service's structure, field names, and basic CRUD behavior are all derived directly from the CDS View's own definition, dramatically reducing the manual service-implementation work compared to older approaches that required separately coding the service's data access logic by hand.

What does @OData.publish: true (or a service definition/binding) let you do with a CDS View?
What does the generated OData service's structure derive from?

23. What is the difference between a basic/interface CDS View and a consumption CDS View?

SAP's recommended CDS View layering separates views by purpose, typically into several tiers rather than one flat set of views.

Basic/Interface ViewComposite ViewConsumption View
Close to a single database table; minimal logic. Combines multiple basic views via associations/joins. Adds UI/OData-specific annotations for direct consumption by an app.
Reusable building block.Business-entity-level combination. Tailored to a specific consumer's needs.
Z_I_Customer       "  interface view: close to KNA1
  -> Z_C_CustomerOrders  "  composite: joins customer + sales orders
    -> Z_C_CustomerList  "  consumption: exposed via OData, UI annotations for Fiori

This layering promotes reuse: several different consumption views (for different Fiori apps, say) can be built on top of the same shared interface and composite views, rather than each app's view duplicating the same base data-access logic independently.

What is a basic/interface CDS View typically close to?
What is the benefit of layering views this way (interface -> composite -> consumption)?

24. How do you troubleshoot performance issues in a CDS View?

Diagnosing a slow CDS View follows a similar approach to tuning any database query, using SAP-specific tools to see exactly what's happening at the database level.

  1. Check the SQL execution plan via transaction ST05 (SQL trace) or HANA's own EXPLAIN PLAN, to see whether the underlying generated SQL is using indexes effectively or doing unnecessary full scans.
  2. Look for unnecessarily "eager" associations being followed when they aren't actually needed by the consumer, forcing unneeded joins.
  3. Check for CDS Views stacked many layers deep — excessive nesting of composite/consumption views can sometimes generate a surprisingly complex final SQL statement that the database optimizer struggles with.
  4. Verify appropriate filtering happens as early as possible in the view chain, rather than filtering only at the very end after joining in unnecessary data.

Because CDS Views ultimately compile down to SQL, most standard SQL/HANA performance tuning knowledge (index usage, join order, selective filtering) applies directly, just approached through CDS-specific tooling and the view's declarative definition rather than hand-written SQL.

What SAP transaction helps you see the underlying SQL execution plan for a CDS View's query?
What is a common CDS-specific cause of unexpected performance issues?

25. What is the RAP (RESTful ABAP Programming) model?

RAP is SAP's modern framework for building business applications (particularly Fiori apps and OData services) with a standardized, metadata-driven architecture — combining CDS Views (data modeling), behavior definitions (business logic like create/update/delete rules, validations), and service definitions/bindings (exposing everything as OData) into one coherent development model.

flowchart LR
    A[CDS View - data model] --> B[Behavior Definition - business logic]
    B --> C[Service Definition/Binding - OData exposure]
    C --> D[Fiori App consumes the service]

It's the successor to older approaches (like classical BAPI-based development or the earlier draft of OData service generation) for building new, cloud-ready SAP applications, designed to work consistently whether the target is an on-premise S/4HANA system or SAP BTP — a deliberate architectural convergence so developers aren't learning entirely separate models depending on deployment target.

What does RAP combine into one coherent development model?
What deployment targets is RAP designed to work consistently across?

26. What is the difference between RAP and the classical ABAP programming model?

The classical model typically meant hand-writing a BAPI or function module for business logic, a separate SAP Gateway service implementation class for OData exposure, and manually wiring the two together — a lot of custom, imperative code for functionality that follows largely the same repetitive pattern (create, read, update, delete, plus validations) across many different business objects.

Classical ModelRAP
Hand-written BAPI/function module + separate Gateway service class. Declarative behavior definition + CDS View + generated service.
A lot of repetitive, imperative boilerplate per object. Common CRUD/validation patterns handled by the framework itself.
Two separately maintained layers (business logic, service exposure) to keep in sync. Unified, metadata-driven model reducing that duplication.

RAP's declarative approach means a lot of standard behavior (basic CRUD, draft handling, standard validations) comes largely "for free" from the framework, letting developers focus custom code specifically on the genuinely unique business logic rather than repetitive plumbing.

What did the classical model typically require developers to hand-write separately?
What does RAP's declarative approach reduce for developers?

27. What is a behavior definition in RAP?

A behavior definition is where you declare a business object's actual behavior within the RAP model — which operations are allowed (create, update, delete), what validations and determinations should run, and how the object relates to other objects — written in a dedicated behavior definition language, separate from but linked to the object's CDS View data model.

managed implementation in class zbp_i_salesorder unique;
strict(2);

define behavior for Z_I_SalesOrder alias SalesOrder
persistent table zsalesorder
{
    create;
    update;
    delete;

    field ( readonly ) SalesOrderId;

    validation validateAmount on save { field Amount; }
}

The actual implementation of custom validations, determinations, and actions goes into an ABAP class (referenced by implementation in class), but the behavior definition itself declares what operations exist and what rules apply, giving the framework enough structure to handle the standard mechanics (locking, buffering, transactional consistency) automatically.

What does a behavior definition declare for a business object?
Where does the actual implementation code for custom validations go?

28. What is the difference between managed and unmanaged RAP scenarios?

In a managed RAP scenario, the framework itself handles standard persistence operations (insert, update, delete against the underlying database table) automatically, based on the behavior definition — you only write custom code for validations, determinations, and business logic beyond basic CRUD. In an unmanaged scenario, you write the actual persistence logic yourself (often wrapping an existing BAPI or custom logic), with RAP providing the framework structure around it rather than handling persistence for you.

ManagedUnmanaged
Framework handles standard CRUD persistence automatically. Developer implements persistence logic explicitly.
Best for new development with a clean underlying table. Best for wrapping existing complex logic (e.g. an existing BAPI).
Less code to write for standard scenarios. More control, more code, for scenarios standard CRUD doesn't fit.

Managed is the recommended default for new development where the underlying persistence is straightforward; unmanaged remains necessary when integrating with existing complex business logic that doesn't map cleanly onto simple table CRUD.

In a managed RAP scenario, what does the framework handle automatically?
When is an unmanaged scenario typically necessary?

29. What is the CAP (Cloud Application Programming) model?

CAP is SAP's framework for building cloud-native business applications on SAP BTP, using open, standard technologies (Node.js or Java, with CDS as a shared data-modeling language) rather than ABAP — a deliberately different technology stack from RAP's ABAP-based approach, aimed at applications built primarily for the cloud from the ground up.

// CAP: CDS data model (same conceptual approach as ABAP CDS, different syntax context)
entity Customers {
    key ID : UUID;
    name   : String;
    country: String;
}

Despite the different implementation language, CAP shares CDS as a common conceptual and syntactic foundation with RAP's ABAP CDS Views — both express data models, associations, and annotations in a similar declarative style, which is a deliberate design choice by SAP to keep the modeling paradigm consistent even as the actual runtime technology differs between an ABAP-based (RAP) and a Node.js/Java-based (CAP) implementation.

What programming languages does CAP typically use, unlike RAP's ABAP?
What conceptual foundation do CAP and RAP share despite their different runtime technologies?

30. What is the difference between RAP and CAP?

Both are SAP's modern application development models, sharing CDS-based data modeling as a conceptual foundation, but they target different runtime environments and technology stacks.

RAPCAP
ABAP-based; runs on SAP's ABAP application server (on-premise or BTP ABAP Environment). Node.js/Java-based; runs on SAP BTP's Cloud Foundry/Kyma environments.
Natural fit for extending existing ABAP/S/4HANA systems. Natural fit for greenfield, cloud-native applications and services.
Business logic in ABAP behavior implementations. Business logic in JavaScript/Java service handlers.

The choice between them typically comes down to context: an organization extending an existing S/4HANA system with ABAP skills in-house often reaches for RAP, while a genuinely new, cloud-native microservice-style application, especially one built by teams already comfortable with Node.js/Java, more naturally fits CAP.

What runtime environment does RAP target, compared to CAP?
What context typically favors choosing RAP over CAP?

31. Explain the architecture of a typical RAP-based Fiori application?

A RAP-based Fiori app is built from several distinct, connected layers, each with a specific responsibility, working together to deliver data from the database to the user's screen.

flowchart TD
    A[SAPUI5/Fiori Elements frontend] --> B[OData Service - generated from Service Binding]
    B --> C[Service Definition - exposes selected CDS Views]
    C --> D[Behavior Definition - business logic, validations]
    D --> E[CDS View - data model]
    E --> F[Underlying database table]

Data and requests flow down through these layers (a save request from the UI eventually triggers behavior definition logic, which persists via the CDS View's underlying table), while query results flow back up. This layered structure is exactly what lets RAP separate concerns cleanly: UI logic in the frontend, business rules in the behavior implementation, and data structure in the CDS View, each independently maintainable without tightly coupling all the logic into one monolithic layer.

What triggers a RAP application's behavior definition logic?
What benefit does this layered RAP architecture provide?

32. How do you implement validations and determinations in RAP?

Validations and determinations are both declared in the behavior definition and implemented in the corresponding ABAP behavior implementation class, but they serve different purposes: a validation checks whether data is valid and can raise an error blocking the operation; a determination automatically derives or sets a field's value based on other data, without blocking anything.

"  behavior definition
validation validateAmount on save { field Amount; }
determination setStatus on save { field Status; }

"  behavior implementation class
METHOD validateAmount.
  LOOP AT keys INTO DATA(ls_key).
    IF ls_key-%data-Amount < 0.
      APPEND VALUE #( %key = ls_key-%key %msg = ... ) TO failed-salesorder.
    ENDIF.
  ENDLOOP.
ENDMETHOD.

METHOD setStatus.
  " automatically set Status field based on other data, e.g. Amount
ENDMETHOD.

Both run automatically at defined trigger points (like on save) declared in the behavior definition, without the consuming Fiori app needing to explicitly call them — the framework invokes them at the right moment as part of the standard save/transaction sequence.

What is the key difference between a validation and a determination in RAP?
Does the consuming Fiori app need to explicitly call a validation or determination?

33. What is OData and why is it used in SAP?

OData (Open Data Protocol) is a standardized, RESTful protocol for exposing and consuming data over HTTP, built on top of standard web technologies (JSON or XML payloads, standard HTTP verbs). SAP adopted it as the primary protocol connecting Fiori apps (and other external clients) to backend SAP data, replacing older, SAP-specific remote communication approaches for this purpose.

GET /sap/opu/odata/sap/Z_CUSTOMER_SRV/CustomerList?$filter=Country eq 'US'
Accept: application/json

Using an open, standard protocol (rather than a proprietary SAP-only interface) means any client capable of making an HTTP request — a Fiori app, a mobile app, a third-party integration — can consume SAP data consistently, without needing SAP-specific client libraries or protocols, which is central to SAP's strategy of making backend data broadly and consistently accessible.

What is OData built on top of?
Why does SAP favor an open standard protocol like OData for exposing data?

34. Explain the difference between OData V2 and OData V4?

OData V4 is the more recent, standardized-by-OASIS version of the protocol, with a cleaner specification and several improvements over V2, though SAP systems (and existing Fiori apps) still widely use both depending on when they were built and what framework generated the service.

OData V2OData V4
Older, SAP Gateway's traditional default for many years. Newer, OASIS-standardized version; default for RAP-generated services.
Slightly more verbose metadata and payload format. More streamlined payloads, improved batch/query capabilities.
Still very widely used in existing Fiori apps. Increasingly the default for new SAP development (RAP, CAP).

For a mid-level developer, the practical implication is knowing which version a given service uses, since the request/response format and certain query syntax details differ — new RAP-based services typically default to V4, while a lot of existing, older Fiori apps and services still run on V2.

Which OData version is typically the default for new RAP-generated services?
Why does a mid-level developer need to know which OData version a service uses?

35. What is an OData service in the context of SAP Fiori/Gateway?

An OData service is the actual runtime endpoint that exposes a defined set of entities (data) and operations (CRUD, actions) over HTTP, following the OData protocol — the bridge a Fiori app actually calls to read and write backend SAP data, generated either through classical SAP Gateway service implementation or, in newer development, directly from a RAP service definition/binding.

/sap/opu/odata/sap/Z_CUSTOMER_SRV/
    $metadata            "  describes the service's structure
    CustomerList         "  the actual data entity set
    CustomerList('123')  "  a single entity by key

Each service has a defined base URL, a metadata document describing its entities and their fields, and individual entity sets that support the standard OData operations (GET, POST, PUT/PATCH, DELETE) mapped to create/read/update/delete against the underlying business data.

What does an OData service expose over HTTP?
What does the $metadata endpoint of an OData service describe?

36. How do you expose backend data as an OData service?

There are two main paths, reflecting the classical and modern (RAP) approaches: classical SAP Gateway service generation from a CDS View or manual service implementation, or the newer RAP approach using a service definition and service binding.

"  RAP approach: define which CDS Views a service exposes
define service Z_CUSTOMER_SRV {
    expose Z_C_CustomerList as CustomerList;
}
"  then activate a service binding (e.g. OData V4, UI) to make it callable

In the classical approach, a CDS View annotated @OData.publish: true auto-generates a basic service, or a developer manually implements a Gateway service class handling the CRUD logic explicitly. In the RAP approach, the service definition declares which CDS entities to expose, and a service binding activates a specific protocol version (like OData V4) against that definition — the currently recommended, more structured approach for new development.

What does a RAP service definition declare?
What does a service binding do in the RAP approach?

37. What is the role of SAP Gateway in OData service implementation?

SAP Gateway is the technical component/framework responsible for translating between the OData protocol (HTTP requests/responses) and SAP's backend business logic — handling the protocol-level details (parsing query options like $filter, formatting responses as JSON/XML) so developers implementing a service focus on the actual business logic rather than HTTP/OData mechanics themselves.

flowchart LR
    A[Fiori app: HTTP OData request] --> B[SAP Gateway: parses OData request]
    B --> C[Service implementation: business logic executes]
    C --> D[SAP Gateway: formats response as OData/JSON]
    D --> A

In classical development, this meant implementing specific methods (like GET_ENTITYSET) in a Gateway service class that Gateway calls at the right moment during request processing. In RAP-based development, this translation happens more automatically based on the CDS View and behavior definition, with Gateway's role largely handled transparently by the framework rather than requiring explicit implementation classes for basic scenarios.

What is SAP Gateway responsible for?
How does Gateway's role differ between classical and RAP-based development?

38. Explain the CRUD operations supported by OData services?

OData maps standard HTTP verbs directly onto the classic CRUD (Create, Read, Update, Delete) operations against a service's exposed entities, giving a consistent, predictable interface regardless of what business object is actually behind the service.

HTTP VerbCRUD Operation
GETRead (a single entity or a collection).
POSTCreate a new entity.
PUT / PATCHUpdate an existing entity (full replace vs. partial update).
DELETEDelete an entity.
POST /Z_CUSTOMER_SRV/CustomerList
Content-Type: application/json
{ "CustomerName": "New Customer", "Country": "US" }

Whether all four operations are actually available on a given entity depends on how the underlying service (and, in RAP, its behavior definition) is configured — a read-only reporting entity, for example, might only support GET, while a fully editable business object supports the complete CRUD set.

What HTTP verb corresponds to reading data from an OData entity set?
Does every OData entity necessarily support all four CRUD operations?

39. How do you troubleshoot a failing OData service call?

Diagnosing a failing OData call typically starts by isolating whether the problem is in the request itself, the service implementation, or something deeper in the underlying business logic.

  1. Check the HTTP status code and error message in the response body — OData errors typically include a structured message explaining what went wrong (e.g. a validation failure vs. an authorization issue).
  2. Use transaction /IWFND/ERROR_LOG (classical Gateway) to inspect detailed backend error logs for a failed request.
  3. Test the service directly outside the Fiori app — via the service's metadata/entity URLs directly in a browser, or a tool like Postman — to isolate whether the issue is in the frontend or the backend service itself.
  4. Check authorizations — a common cause of failures that look like bugs is actually missing authorization for the calling user on the underlying business object.
  5. For RAP services, check the behavior implementation's validations/determinations for logic that might be rejecting the request unexpectedly.
What transaction helps inspect detailed backend error logs for failed classical Gateway requests?
Why is it useful to test an OData service directly, outside the Fiori app?

40. What is metadata in an OData service and why does it matter?

The $metadata document is an OData service's self-describing schema — an XML document listing every entity type, its fields (with data types), relationships between entities, and supported operations. Any OData-aware client (Fiori Elements apps in particular) reads this metadata to know how to render UI, build requests, and validate data, without needing that structure hardcoded separately in the client itself.

GET /Z_CUSTOMER_SRV/$metadata

<EntityType Name="CustomerList">
  <Property Name="CustomerId" Type="Edm.String"/>
  <Property Name="CustomerName" Type="Edm.String"/>
</EntityType>

This is exactly what enables Fiori Elements' metadata-driven UI generation: since the CDS View's annotations (field labels, which fields to show in a list, which are editable) flow through into the OData service's metadata, a Fiori Elements app can render a fully functional list/detail screen automatically just by pointing at the service, without hand-coding the UI layout for each field.

What does an OData service's $metadata document describe?
How does metadata enable Fiori Elements' automatic UI generation?

41. What is SAP Fiori and how does it differ from classical SAP GUI?

SAP Fiori is SAP's modern, browser-based (and mobile-responsive) user experience design system and set of applications, built around consistent design principles and running on standard web technologies (SAPUI5/HTML5), replacing the older, more rigid screen-and-field SAP GUI transactions for many use cases.

SAP GUISAP Fiori
Desktop client application; dense, transaction-oriented screens. Browser-based, responsive; role-based, task-focused apps.
Built primarily on classical dynpro screen technology. Built on SAPUI5/HTML5, often backed by OData services.
Optimized for expert users running many transactions. Optimized for simplicity, mobile access, and specific tasks.

Fiori apps typically consume OData services (frequently RAP-generated) as their data source, making it the natural frontend counterpart to the CDS View/RAP backend architecture covered elsewhere — the two are usually discussed together since a modern SAP feature typically spans both the Fiori frontend and the CDS/RAP/OData backend that powers it.

What technology is SAP Fiori primarily built on, compared to SAP GUI's dynpro screens?
What backend data source do Fiori apps typically consume?

42. What are Fiori design principles?

SAP Fiori's design language is built around five core principles guiding how every Fiori app should behave and feel, regardless of which specific business function it serves.

  • Role-based — an app is tailored to what a specific user role actually needs to do, not a generic, do-everything screen.
  • Responsive — the same app adapts across desktop, tablet, and mobile without separate versions.
  • Simple — focused on one task at a time, avoiding the dense, all-fields-visible clutter of classical SAP GUI transactions.
  • Coherent — consistent visual language and interaction patterns across every Fiori app, so learning one app transfers to others.
  • Delightful — genuinely pleasant, modern UX, not merely functional.

These principles directly shape practical development decisions — for example, favoring Fiori Elements (which generates a consistent, standard UI automatically from CDS/OData metadata) over hand-built custom UIs whenever a standard pattern (list report, object page) fits, since that consistency is central to the "coherent" principle.

What does 'role-based' mean as a Fiori design principle?
How do these principles influence a practical development decision like choosing Fiori Elements?

43. What is the difference between SAPUI5 and Fiori?

SAPUI5 is the underlying JavaScript UI framework (built on web standards, conceptually similar to frameworks like Angular or React in spirit) that provides the actual reusable UI controls, data binding, and application runtime. Fiori is the design language and set of UX principles/patterns — a Fiori app is typically built with SAPUI5, but SAPUI5 itself is just the toolkit; Fiori is the design standard that toolkit is used to implement.

SAPUI5Fiori
A JavaScript UI framework/toolkit.A design language and UX principle set.
Provides controls, data binding, MVC structure. Defines how apps should look, feel, and behave.
Could theoretically build a non-Fiori-styled app with it. Achieved by following Fiori guidelines, typically using SAPUI5 (or Fiori Elements) to build it.

A useful analogy: SAPUI5 is like a programming language/toolkit, while Fiori is the style guide dictating how apps built with that toolkit should be designed — you could technically build something that doesn't follow Fiori's design principles using SAPUI5, but a proper "Fiori app" means following both.

What is SAPUI5?
What is the relationship between SAPUI5 and Fiori?

44. How do you debug a SAP Fiori application?

Since a Fiori app runs as a JavaScript application in the browser, debugging combines standard web development tools with SAP-specific diagnostics for the backend OData layer it talks to.

  1. Browser developer tools (F12) — inspect network requests to see the actual OData calls being made and their responses, set JavaScript breakpoints in the SAPUI5 controller code, and check the console for client-side errors.
  2. UI5 diagnostics tool (built into SAPUI5, accessible via a keyboard shortcut) — shows technical details about the running app, including loaded libraries, control tree, and OData model state.
  3. Backend-side debugging — if the issue is actually in the OData service or underlying business logic (not the frontend), the ABAP debugger (with an external/session breakpoint set on the relevant service implementation or behavior definition method) lets you step through what happens when the Fiori app's request reaches the backend.

A common troubleshooting sequence is checking the browser's network tab first to see the actual request/ response, which usually reveals whether the problem is a frontend logic issue or something the backend service itself is returning incorrectly — pointing you toward which of the above tools to reach for next.

What browser tool lets you inspect the actual OData requests a Fiori app makes?
When would you use the ABAP debugger for a Fiori app issue?

45. What is SAP Activate methodology?

SAP Activate is SAP's current implementation methodology for S/4HANA projects, succeeding the older ASAP methodology — combining ready-to-run best-practice business processes, guided configuration tools, and an Agile-influenced project methodology, structured around six phases: Discover, Prepare, Explore, Realize, Deploy, and Run.

flowchart LR
    A[Discover] --> B[Prepare]
    B --> C[Explore]
    C --> D[Realize]
    D --> E[Deploy]
    E --> F[Run]

Compared to ASAP's more strictly linear Waterfall structure, Activate incorporates iterative, sprint-like cycles specifically within the Explore and Realize phases — reviewing pre-configured standard processes against actual business needs, then iteratively configuring and testing in short cycles — reflecting SAP's broader shift toward faster, more adaptable implementation approaches for cloud-based S/4HANA rollouts.

What methodology did SAP Activate succeed?
What are the six phases of SAP Activate?

46. What are the Explore and Realize phases in SAP Activate?

The Explore phase is where the project team validates pre-configured, standard S/4HANA business processes against the organization's actual requirements — typically through fit-to-standard workshops — identifying where the standard fits as-is and where genuine gaps or customization needs exist. The Realize phase is where the system is actually configured, developed, and tested based on what was confirmed in Explore, executed in iterative sprints rather than one large upfront build.

flowchart LR
    A[Explore: fit-to-standard workshops, identify gaps] --> B[Realize: iterative configuration + build + test sprints]
    B --> C[Deploy phase follows]

This Explore-then-Realize sequence is a deliberate shift from older methodologies that spent much more upfront time on exhaustive, document-heavy blueprinting before any configuration began — Activate front-loads validation against SAP's pre-built best-practice content, aiming to reduce how much genuinely custom design work is needed before Realize can start.

What happens during the Explore phase?
How does Realize typically execute its configuration/development work?

47. How does SAP Activate differ from the classical ASAP methodology?

ASAP followed a strictly sequential, Waterfall-style structure (Project Preparation, Business Blueprint, Realization, Final Preparation, Go-Live & Support), with each phase's deliverables largely finalized before the next began. Activate restructures this around SAP's pre-built best-practice content and incorporates Agile-influenced iteration specifically within its Explore and Realize phases.

ASAPSAP Activate
Strictly sequential Waterfall phases. Iterative, sprint-based work within Explore/Realize.
Blueprint built largely from scratch via extensive documentation. Starts from SAP's pre-configured best-practice processes, validated via fit-to-standard workshops.
Designed for classical on-premise SAP ERP rollouts. Designed specifically for S/4HANA, including cloud deployments.

The underlying philosophy shift is significant: ASAP assumed you'd design most of the solution from a blank slate, while Activate assumes you start from SAP's proven standard processes and only customize where a genuine gap exists, aiming for faster, more predictable implementations.

What structural approach does ASAP follow, compared to Activate?
What is the underlying philosophy shift from ASAP to Activate?

48. What is a fit-to-standard workshop in the Explore phase?

A fit-to-standard workshop is a structured session where the project team walks business stakeholders through SAP's pre-configured, standard best-practice process for a specific business area (like order-to-cash or procure-to-pay), directly in a demo/sandbox system, to determine whether that standard process meets the organization's actual needs as-is, or whether a genuine gap requiring customization exists.

flowchart LR
    A[Demo standard SAP process to stakeholders] --> B{Does it fit business needs?}
    B -->|Yes| C[Adopt standard process as-is]
    B -->|No| D[Document as a gap requiring further design/customization]

The name reflects the underlying philosophy: rather than starting with "what do we need, from scratch," the question becomes "does the pre-built standard fit, and if not, what's genuinely different about our requirement" — a deliberate strategy to minimize unnecessary customization by defaulting to SAP's proven standard processes unless a real business need justifies deviating from them.

What is the core purpose of a fit-to-standard workshop?
What underlying philosophy does the 'fit-to-standard' name reflect?
«
»

Comments & Discussions