SAP ABAP CDS (Core Data Services)
Related Skills
- •sap-abap: Use for ABAP programming patterns used with CDS or when implementing EML statements in ABAP
- •sap-btp-cloud-platform: Use for CDS deployment scenarios on BTP or ABAP Environment configurations
- •sap-fiori-tools: Use when building Fiori Elements applications that consume CDS views or working with UI annotations
- •sap-cap-capire: Use for comparing CDS syntax between ABAP and CAP or when integrating ABAP CDS with CAP services
- •sap-api-style: Use when documenting CDS-based OData services or following API documentation standards
Quick Reference: https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/abencds.html | SAP Cheat Sheets: https://github.com/SAP-samples/abap-cheat-sheets/blob/main/15_CDS_View_Entities.md
Table of Contents
- •1. CDS View Fundamentals
- •2. Essential Annotations
- •3. Expressions and Operations
- •4. Built-in Functions
- •5. Joins
- •6. Associations
- •7. Input Parameters
- •8. Aggregate Expressions
- •9. Access Control (DCL)
- •10. Data Retrieval from ABAP
- •11. Common Errors and Solutions
- •12. Useful Transactions and Tables
- •Bundled Resources
- •Source Documentation
1. CDS View Fundamentals
View Types
| Type | Syntax | Database View | Since |
|---|---|---|---|
| CDS View | DEFINE VIEW | Yes | 7.4 SP8 |
| CDS View Entity | DEFINE VIEW ENTITY | No | 7.55 |
Recommendation: Use CDS View Entities for new development.
Basic CDS View Syntax
@AbapCatalog.sqlViewName: 'ZCDS_EXAMPLE_V'
@AbapCatalog.compiler.CompareFilter: true
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Example CDS View'
define view ZCDS_EXAMPLE
as select from db_table as t
{
key t.field1,
t.field2,
t.field3 as AliasName
}
CDS View Entity Syntax (7.55+)
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'Example View Entity'
define view entity Z_CDS_EXAMPLE
as select from db_table as t
{
key t.field1,
t.field2,
t.field3 as AliasName
}
Key Difference: View entities omit @AbapCatalog.sqlViewName - no SQL view generated.
Eclipse ADT Setup
- •File → New → Other → Core Data Services → Data Definition
- •Enter name, description, and package
- •Select template (view, view entity, etc.)
2. Essential Annotations
Core Annotations
Essential annotations for CDS development:
- •
@AbapCatalog.sqlViewName- SQL view name (max 16 chars) - •
@AbapCatalog.compiler.CompareFilter- Optimize WHERE clauses - •
@AccessControl.authorizationCheck- Set to #NOT_REQUIRED, #CHECK, #MANDATORY, or #NOT_ALLOWED - •
@EndUserText.label- User-facing description - •
@Metadata.allowExtensions- Allow view extensions
Complete Reference: See references/annotations-reference.md for 50+ annotations with examples.
Semantics Annotations (Currency/Quantity)
Required for CURR and QUAN data types to avoid error SD_CDS_ENTITY105:
-- Currency fields @Semantics.currencyCode: true waers, @Semantics.amount.currencyCode: 'waers' amount, -- Quantity fields @Semantics.unitOfMeasure: true meins, @Semantics.quantity.unitOfMeasure: 'meins' quantity
UI Annotations (Fiori Elements)
@UI.lineItem: [{ position: 10 }]
@UI.identification: [{ position: 10 }]
@UI.selectionField: [{ position: 10 }]
field1,
@UI.hidden: true
internal_field
Consumption Annotations (Value Help)
@Consumption.valueHelpDefinition: [{
entity: { name: 'I_Currency', element: 'Currency' }
}]
waers
For complete annotation reference, see references/annotations-reference.md.
3. Expressions and Operations
CASE Expressions
Simple CASE (single variable comparison):
case status when 'A' then 'Active' when 'I' then 'Inactive' else 'Unknown' end as StatusText
Searched CASE (multiple conditions):
case when amount > 1000 then 'High' when amount > 100 then 'Medium' else 'Low' end as AmountCategory
Comparison Operators
Standard operators: =, <>, <, >, <=, >=
Special operators: BETWEEN x AND y, LIKE, IS NULL, IS NOT NULL
Complete Reference: See references/expressions-reference.md for all operators and expressions.
Arithmetic Operations
quantity * price as TotalAmount, amount / 100 as Percentage, -amount as NegatedAmount
Session Variables
Available system variables (SY fields equivalent):
- •
$session.user(SY-UNAME) - Current user - •
$session.client(SY-MANDT) - Client - •
$session.system_language(SY-LANGU) - Language - •
$session.system_date(SY-DATUM) - Current date
Complete Reference: See references/expressions-reference.md for all system variables.
$session.user as CurrentUser, $session.system_date as Today
4. Built-in Functions
CDS provides comprehensive built-in functions for string, numeric, and date operations.
Key Function Categories
- •String Functions: concat(), length(), substring(), upper(), lower(), replace()
- •Numeric Functions: abs(), ceil(), floor(), round(), division()
- •Date Functions: dats_add_days(), dats_add_months(), dats_days_between()
- •CAST Expression: Convert between ABAP data types
Complete Reference: See references/functions-reference.md for all 50+ functions with examples.
Quick Examples
-- String operations concat(first_name, last_name) as FullName, upper(name) as UpperName, substring(description, 1, 10) as ShortDesc -- Numeric operations abs(amount) as AbsoluteAmount, round(value, 2) as RoundedValue, division(10, 3, 2) as PreciseDivision -- Date operations dats_add_days(current_date, 7) as NextWeek, dats_days_between(start_date, end_date) as Duration -- Type conversion cast(field as abap.char(10)) as TextField, cast(amount as abap.curr(15,2)) as CurrencyField **ABAP Types**: `abap.char()`, `abap.numc()`, `abap.int4`, `abap.dats`, `abap.tims`, `abap.curr()`, `abap.cuky`, `abap.quan()`, `abap.unit()` --- ## 5. Joins ### Join Types ```sql -- INNER JOIN (matching rows only) inner join makt as t on m.matnr = t.matnr -- LEFT OUTER JOIN (all from left, matching from right) left outer join marc as c on m.matnr = c.matnr -- RIGHT OUTER JOIN (all from right, matching from left) right outer join mvke as v on m.matnr = v.matnr -- CROSS JOIN (cartesian product) cross join t001 as co
6. Associations
Associations define relationships between entities (join-on-demand):
Defining Associations
define view Z_ASSOC_EXAMPLE as select from scarr as c
association [1..*] to spfli as _Flights
on $projection.carrid = _Flights.carrid
association [0..1] to sairport as _Airport
on $projection.hub = _Airport.id
{
key c.carrid,
c.carrname,
c.hub,
// Expose associations
_Flights,
_Airport
}
Cardinality Notation
Syntax mapping:
- •
[0..1]or[1]→association to one(LEFT OUTER MANY TO ONE) - •
[1..1]→association to one(exact match) - •
[0..*]or[*]→association to many(LEFT OUTER MANY TO MANY) - •
[1..*]→association to many(one or more)
Complete Reference: See references/associations-reference.md for detailed cardinality guide.
New Cardinality Syntax (Release 2302+)
association to one _Customer on ... -- [0..1] association to many _Items on ... -- [0..*]
Using Associations
-- Expose for consumer use _Customer, -- Ad-hoc field access (triggers join) _Customer.name as CustomerName
Path Expressions with Filter
-- Filter with cardinality indicator _Items[1: Status = 'A'].ItemNo
For complete association reference, see references/associations-reference.md.
7. Input Parameters
Defining Parameters
define view Z_PARAM_EXAMPLE
with parameters
p_date_from : dats,
p_date_to : dats,
@Environment.systemField: #SYSTEM_LANGUAGE
p_langu : spras
as select from vbak as v
{
key v.vbeln,
v.erdat,
v.erzet
}
where v.erdat between :p_date_from and :p_date_to
Parameter Reference
Use colon notation :p_date_from or $parameters.p_date_from
Calling from ABAP:
SELECT * FROM z_param_example( p_date_from = '20240101', p_date_to = '20241231', p_langu = @sy-langu ) INTO TABLE @DATA(lt_result).
8. Aggregate Expressions
Aggregate Functions
define view Z_AGG_EXAMPLE as select from vbap as i
{
i.vbeln,
sum(i.netwr) as TotalAmount,
avg(i.netwr) as AvgAmount,
max(i.netwr) as MaxAmount,
min(i.netwr) as MinAmount,
count(*) as ItemCount
}
group by i.vbeln
having sum(i.netwr) > 1000
9. Access Control (DCL)
Basic DCL Structure
@MappingRole: true
define role Z_CDS_EXAMPLE_DCL {
grant select on Z_CDS_EXAMPLE
where (bukrs) = aspect pfcg_auth(F_BKPF_BUK, BUKRS, ACTVT = '03');
}
Authorization Check Options
Available values:
- •
#NOT_REQUIRED- No authorization check - •
#CHECK- Warning if no DCL exists - •
#MANDATORY- Error if no DCL exists - •
#NOT_ALLOWED- DCL ignored if exists
Complete Reference: See references/access-control-reference.md for detailed DCL patterns.
Condition Types
PFCG Authorization: where (field) = aspect pfcg_auth(AUTH_OBJECT, AUTH_FIELD, ACTVT = '03')
Literal Condition: where status <> 'DELETED'
User Aspect: where created_by ?= aspect user
Combined: where (bukrs) = aspect pfcg_auth(...) and status = 'ACTIVE'
For complete access control reference, see references/access-control-reference.md.
10. Data Retrieval from ABAP
Standard SELECT
SELECT * FROM zcds_example WHERE field1 = @lv_value INTO TABLE @DATA(lt_result).
SALV IDA (Integrated Data Access)
cl_salv_gui_table_ida=>create_for_cds_view( CONV #( 'ZCDS_EXAMPLE' ) )->fullscreen( )->display( ).
11. Common Errors and Solutions
SD_CDS_ENTITY105: Missing Reference Information
Problem: CURR/QUAN fields without reference
Solution: Add semantics annotations
@Semantics.currencyCode: true waers, @Semantics.amount.currencyCode: 'waers' netwr
Or import currency from related table:
inner join t001 as c on ...
{
c.waers,
@Semantics.amount.currencyCode: 'waers'
v.amount
}
Cardinality Warnings
Problem: Cardinality doesn't match actual data
Solution: Define cardinality matching data model
association [0..1] to ... -- Use for optional relationships association [1..*] to ... -- Use for required one-to-many
For complete troubleshooting guide, see references/troubleshooting.md.
12. Useful Transactions and Tables
Key Transactions
- •SDDLAR - Display/repair DDL structures
- •RSRTS_ODP_DIS - TransientProvider preview
- •RSRTS_QUERY_CHECK - CDS query metadata validation
- •SE63 - Translation (EndUserText)
- •SE11 - ABAP Dictionary
- •SU21 - Authorization objects
Important Tables
- •DDHEADANNO - Header-level annotations
- •CDSVIEWANNOPOS - CDS view header annotations
- •CDS_FIELD_ANNOTATION - Field-level annotations
- •ABDOC_CDS_ANNOS - SAP annotation definitions
API Class
CL_DD_DDL_ANNOTATION_SERVICE - Programmatic annotation access:
- •
get_annos()- Get all annotations - •
get_label_4_element()- Get @EndUserText.label
Bundled Resources
Reference Documentation
For detailed guidance, see the reference files in references/:
- •
annotations-reference.md- Complete annotation catalog - •
functions-reference.md- All built-in functions with examples - •
associations-reference.md- Associations and cardinality guide - •
access-control-reference.md- DCL and authorization patterns - •
expressions-reference.md- Expressions and operators - •
troubleshooting.md- Common errors and solutions
Templates
For templates, see templates/:
- •
basic-view.md- Standard CDS view template - •
parameterized-view.md- View with input parameters - •
dcl-template.md- Access control definition
Source Documentation
Update this skill by checking:
- •https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/abencds.html (ABAP Cloud)
- •https://help.sap.com/docs/SAP_NETWEAVER_AS_ABAP_752/f2e545608079437ab165c105649b89db/7c078765ec6d4e6b88b71bdaf8a2bd9f.html (NetWeaver 7.52 User Guide)
- •https://github.com/SAP-samples/abap-cheat-sheets
- •https://community.sap.com/t5/tag/CDS%20Views/tg-p
Last Verified: 2025-11-23