sap-abap-cds
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 annotationsget_label_4_element()- Get @EndUserText.label
Bundled Resources
Reference Documentation
For detailed guidance, see the reference files in references/:
annotations-reference.md- Complete annotation catalogfunctions-reference.md- All built-in functions with examplesassociations-reference.md- Associations and cardinality guideaccess-control-reference.md- DCL and authorization patternsexpressions-reference.md- Expressions and operatorstroubleshooting.md- Common errors and solutions
Templates
For templates, see templates/:
basic-view.md- Standard CDS view templateparameterized-view.md- View with input parametersdcl-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