Day 4: CDS Advanced – Consumption Views & VDM
Day 4: CDS Advanced – Consumption Views & VDM
Consumption view layering
Virtual Data Model (Basic/Composite/Consumption views)
Analytical views: @Analytics.query
Currency/Unit annotations
Tasks:
Create a 3-layered VDM model
Enable for analytical reporting in RSRT
๐ฆ 1. What is a Consumption View?
A Consumption View is the top layer in the CDS Virtual Data Model (VDM) used in SAP S/4HANA. It’s meant for final consumption by UI, analytical tools, or OData services. It is often designed for Fiori apps, analytics queries, or custom reports.
✅ Purpose:
Define exactly what should be exposed to the UI or report
Add semantics: labels, filters, fields, annotations
Bind to a UI framework (Fiori Elements, Smart Filters, etc.)
✅ Example: Simple Consumption View
@AbapCatalog.sqlViewName: 'ZV_SALESORD_C'
@EndUserText.label: 'Sales Order Consumption View'
@UI.chart: [ { qualifier: 'SalesChart', chartType: #BAR, dimensions: ['SalesOrg'], measures: ['NetAmount'] } ]
@Analytics.query: true
define view ZC_SalesOrder
as select from ZI_SalesOrder // Composite view
{
key SalesOrder,
SalesOrg,
CustomerName,
NetAmount,
Currency
}
๐จ 2. Consumption View Layering in CDS
SAP recommends a 3-layered VDM architecture:
๐งฑ 3-Layered VDM Example:
Let’s break it down in full code.
๐ 1. Basic View – ZI_CustomerBasic
@AbapCatalog.sqlViewName: 'ZV_CUST_BASIC'
@EndUserText.label: 'Basic Customer View'
@VDM.viewType: #BASIC
define view entity ZI_CustomerBasic
as select from kna1
{
key kunnr as Customer,
name1 as CustomerName,
land1 as Country
}
๐ 2. Composite View – ZI_CustomerComposite
@AbapCatalog.sqlViewName: 'ZV_CUST_COMP'
@EndUserText.label: 'Composite Customer View'
@VDM.viewType: #COMPOSITE
define view entity ZI_CustomerComposite
as select from ZI_CustomerBasic
association [0..1] to I_Country as _Country
on $projection.Country = _Country.Country
{
key Customer,
CustomerName,
Country,
_Country.CountryName
}
๐ 3. Consumption View – ZC_Customer
@AbapCatalog.sqlViewName: 'ZV_CUST_CONS'
@EndUserText.label: 'Customer Consumption View'
@VDM.viewType: #CONSUMPTION
@UI.selectionField: [{ position: 10, element: 'Country' }]
@UI.headerInfo: {
typeName: 'Customer',
typeNamePlural: 'Customers',
title: { type: #STANDARD, value: 'CustomerName' }
}
define view entity ZC_Customer
as select from ZI_CustomerComposite
{
key Customer,
CustomerName,
Country,
_Country.CountryName
}
✅ This layering ensures separation of concerns and maximum reusability.
๐ฉ 3. What is Virtual Data Model (VDM)?
The VDM is SAP’s layered approach to CDS modeling in S/4HANA. It represents a semantic data model over raw database tables using CDS views.
๐ Types of Views in VDM:
๐ 4. Analytical Views with @Analytics.query
To create a view suitable for embedded analytics in tools like RSRT, Fiori Analytical Apps, you mark the view as a query:
@Analytics.query: true
@AbapCatalog.sqlViewName: 'ZV_SALES_ANALYT'
define view ZC_SalesAnalytics
as select from ZI_SalesOrder
{
key SalesOrg,
Product,
sum(Amount) as TotalAmount,
Currency
}
group by SalesOrg, Product, Currency
Use @Analytics.query: true only in consumption views meant for analytical reporting.
Steps to enable cds view for reporting RSRT:
Set @Analytics.query: true in Consumption View.
Run T-Code: RSRT
Choose Mode = SAP HANA
Enter the SQL View name (e.g., ZV_SALES_ANALYT)
Execute → You’ll see the analytical report!
๐ฑ 5. Currency / Unit Annotations
To correctly interpret currency and unit fields in analytical views:
@Semantics.amount.currencyCode: 'Currency'
NetAmount,
@Semantics.quantity.unitOfMeasure: 'Unit'
Quantity
✅ Example:
@EndUserText.label: 'Sales Order Analytics'
@Analytics.query: true
define view entity ZC_SalesAnalysis
as select from ZI_SalesOrder
{
key SalesOrder,
NetAmount,
@Semantics.amount.currencyCode: 'Currency'
NetAmount,
Currency
}
These annotations help the UI and tools understand that NetAmount is measured in Currency.
๐ท Real Time Scenario: Simple Sales Order Analytics Model
We’ll build a 3-layered VDM using a real-world scenario: Analysing Sales Orders and Items by value, quantity, and country.covering:
Consumption View
Layered VDM (Basic → Composite → Consumption)
@Analytics.query for reporting
Currency/Unit annotations
Real-world example: Sales Order Analytics
๐ก Project Structure and Naming Conventions
๐งฑ 1. Basic View: Sales Order Header
@AbapCatalog.sqlViewName: 'ZVBAKBASIC'
@EndUserText.label: 'Sales Order Header Basic View'
define view entity ZI_SalesOrderBasic
as select from vbak
{
key vbeln as SalesOrder,
erdat as CreatedOn,
auart as SalesOrderType,
vkorg as SalesOrg,
kunnr as Customer,
waerk as Currency
}
๐งฑ 2. Basic View: Sales Order Item
@AbapCatalog.sqlViewName: 'ZVBAPBASIC'
@EndUserText.label: 'Sales Order Item Basic View'
define view entity ZI_SalesOrderItemBasic
as select from vbap
{
key vbeln as SalesOrder,
key posnr as Item,
matnr as Material,
arktx as MaterialDesc,
netwr as NetValue,
waerk as Currency,
vrkme as SalesUnit,
kwmeng as OrderQty
}
๐งฉ 3. Composite View: Header + Items
@AbapCatalog.sqlViewName: 'ZVCOMPOSITE'
@EndUserText.label: 'Sales Order with Items'
define view entity ZC_SalesOrderWithItemDetails
as select from ZI_SalesOrderBasic as Header
inner join ZI_SalesOrderItemBasic as Item
on Header.SalesOrder = Item.SalesOrder
{
key Header.SalesOrder,
Header.CreatedOn,
Header.SalesOrderType,
Header.SalesOrg,
Header.Customer,
Item.Item,
Item.Material,
Item.MaterialDesc,
Item.OrderQty,
Item.NetValue,
Item.Currency,
Item.SalesUnit
}
๐ 4. Consumption View (Analytics Enabled)
@AbapCatalog.sqlViewName: 'ZVSOANALYTICS'
@EndUserText.label: 'Sales Order Analytics Consumption View'
@Analytics.query: true
@UI.headerInfo: {
typeName: 'Sales Order',
typeNamePlural: 'Sales Orders',
title: { type: #STANDARD, value: 'SalesOrder' }
}
define view entity ZC_SalesOrderAnalytics
as select from ZC_SalesOrderWithItemDetails
{
key SalesOrder,
CreatedOn,
SalesOrderType,
SalesOrg,
Customer,
Material,
MaterialDesc,
@Semantics.amount. unitOfMeasure: 'SalesUnit'
OrderQty,
@Semantics.amount.currencyCode: 'Currency'
NetValue,
@Semantics.currencyCode: true
Currency,
@Semantics.unitOfMeasure: true
SalesUnit
}
๐ How Currency/Unit Annotations Work
@Semantics.currencyCode: true => Indicates that 'Currency' is a currency code
@Semantics.amount.currencyCode: 'Currency' => Tells system which field holds the currency for NetValue
These annotations allow proper formatting, conversions, and aggregation in tools like Fiori or SAP Analytics Cloud.
๐งช Testing Steps
Activate All CDS Views in order (Basic → Composite → Consumption).
Open transaction RSRT.
Test the analytical query using the technical name 2C_ZCSALESORDERANALYTICS.
Use Fiori Preview (Ctrl + 6 in ADT) or OData Exposure for front-end.
✅ Key Concepts Demonstrated
Day 5: CDS UI Annotations (Fiori-ready CDS)
UI annotations: @UI.lineItem, @UI.selectionField
Field Groups and Facets
Search annotations, Smart Filter setup
Hands-on:
Build CDS with Smart Filter support
Test in WebIDE or Business Application Studio
Comments
Post a Comment