Help us improve
Share bugs, ideas, or general feedback.
From sap-abap-cds
Provides SAP ABAP CDS reference for data modeling, views, entities, annotations, associations, parameters, functions, CASE expressions, DCL access control, CURR/QUAN types, troubleshooting, ABAP querying, and SALV IDA. For ABAP 7.4+ to Cloud.
npx claudepluginhub secondsky/sap-skills --plugin sap-abap-cdsHow this skill is triggered — by the user, by Claude, or both
Slash command
/sap-abap-cds:sap-abap-cdsThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
- **sap-abap**: Use for ABAP programming patterns used with CDS or when implementing EML statements in ABAP
Guides CDS view entity development in ABAP Cloud: data modeling, annotations, associations, compositions, access controls, expressions, and input parameters.
Assists with ABAP code for SAP systems: internal tables, structures, ABAP SQL, OOP, RAP, CDS views, EML statements, ABAP Cloud, strings, dynamic programming, RTTI/RTTC, field symbols, data references, exceptions, unit testing.
Guides SAP CAP development using Capire: CDS models/services, HANA/SQLite/PostgreSQL databases, Node.js/Java runtimes, Fiori UIs, BTP Cloud Foundry/Kyma deployment, auth/multitenancy, OData.
Share bugs, ideas, or general feedback.
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
This skill covers CDS features from 7.40 SP8 through ABAP Cloud. Key version boundaries:
| Feature | 7.40 SP8 | 7.50 | 7.51 | 7.55+ |
|---|---|---|---|---|
CDS View (DEFINE VIEW) | x | x | x | x |
| CDS associations, parameters, built-in functions | x | x | x | x |
CDS Table Functions (DEFINE TABLE FUNCTION) | x | x | x | |
| CDS Access Control (DEFINE ROLE / pfcg_auth) | x | x | x | x |
| CDS Access Control (implicit evaluation) | x | x | x | |
Session variables ($session.user/client/system_language) | x | x | x | x |
@Environment.systemField annotation | x | x | x | |
UPPER/LOWER functions | x | x | ||
$session.system_date | x | x | ||
CDS Metadata Extensions (ANNOTATE VIEW) | x | x | ||
| Cross Join in CDS | x | x | ||
CDS View Entity (DEFINE VIEW ENTITY) | x | |||
New cardinality syntax (to one/to many) | 7.57+ |
On a 7.40 system: Use DEFINE VIEW (not DEFINE VIEW ENTITY). CDS table functions
are not available before 7.50. Basic DCL (DEFINE ROLE with pfcg_auth) is available
from 7.40 SP08, but implicit role evaluation in ABAP SQL requires 7.50+.
$session.user/client/system_language are available from 7.40 SP08.
The templates in templates/ include both classic CDS View and View Entity variants.
| 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.
@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
}
@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.
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 extensionsComplete Reference: See references/annotations-reference.md for 50+ annotations with examples.
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.lineItem: [{ position: 10 }]
@UI.identification: [{ position: 10 }]
@UI.selectionField: [{ position: 10 }]
field1,
@UI.hidden: true
internal_field
@Consumption.valueHelpDefinition: [{
entity: { name: 'I_Currency', element: 'Currency' }
}]
waers
For complete annotation reference, see references/annotations-reference.md.
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
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.
quantity * price as TotalAmount,
amount / 100 as Percentage,
-amount as NegatedAmount
Available system variables (SY fields equivalent):
$session.user (SY-UNAME) - Current user [7.40 SP08+]$session.client (SY-MANDT) - Client [7.40 SP08+]$session.system_language (SY-LANGU) - Language [7.40 SP08+]$session.system_date (SY-DATUM) - Current date [7.51+]Note:
$session.user/client/system_languageare available from 7.40 SP08.$session.system_daterequires 7.51+.@Environment.systemFieldrequires 7.50+.
Complete Reference: See references/expressions-reference.md for all system variables.
$session.user as CurrentUser,
$session.system_date as Today
CDS provides comprehensive built-in functions for string, numeric, and date operations.
Note:
upper()andlower()in CDS require 7.51+. On 7.40/7.50, case conversion must be performed in ABAP after selecting (there is no CDS equivalent).
Complete Reference: See references/functions-reference.md for all 50+ functions with 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) -- [7.51+]
right outer join mvke as v on m.matnr = v.matnr
-- CROSS JOIN (cartesian product) -- [7.51+]
cross join t001 as co
Associations define relationships between entities (join-on-demand):
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
}
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.
association to one _Customer on ... -- [0..1]
association to many _Items on ... -- [0..*]
-- Expose for consumer use
_Customer,
-- Ad-hoc field access (triggers join)
_Customer.name as CustomerName
-- Filter with cardinality indicator
_Items[1: Status = 'A'].ItemNo
For complete association reference, see references/associations-reference.md.
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
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).
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
@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');
}
Available values:
#NOT_REQUIRED - No authorization check#CHECK - Warning if no DCL exists#MANDATORY - Error if no DCL exists#NOT_ALLOWED - DCL ignored if existsComplete Reference: See references/access-control-reference.md for detailed DCL patterns.
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.
SELECT * FROM zcds_example
WHERE field1 = @lv_value
INTO TABLE @DATA(lt_result).
cl_salv_gui_table_ida=>create_for_cds_view(
CONV #( 'ZCDS_EXAMPLE' )
)->fullscreen( )->display( ).
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
}
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.
CL_DD_DDL_ANNOTATION_SERVICE - Programmatic annotation access:
get_annos() - Get all annotationsget_label_4_element() - Get @EndUserText.labelFor 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 solutionsFor templates, see templates/:
basic-view.md - Standard CDS view templateparameterized-view.md - View with input parametersdcl-template.md - Access control definitionUpdate this skill by checking:
Last Verified: 2026-04-02