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:

Layer

Description

View Type

Basic

One-to-one with database table (RAW data)

@VDM.viewType: #BASIC

Composite

Joins, calculations, associations, logic

@VDM.viewType: #COMPOSITE

Consumption

Final view for UI/reporting/OData usage

@VDM.viewType: #CONSUMPTION


๐Ÿงฑ 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:

View Type

Annotation

Purpose

Basic View

@VDM.viewType: #BASIC

1:1 with a DB table, raw fields

Composite

@VDM.viewType: #COMPOSITE

Joins/Associations/Logic

Consumption

@VDM.viewType: #CONSUMPTION

Final exposed view (UI/OData)


๐Ÿ“Š 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:

  1. Set @Analytics.query: true in Consumption View.

  2. Run T-Code: RSRT

  3. Choose Mode = SAP HANA

  4. Enter the SQL View name (e.g., ZV_SALES_ANALYT)

  5. 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

Layer

CDS Name

Description

Basic View

ZI_SalesOrderBasic

Raw data from VBAK table

Basic View

ZI_SalesOrderItemBasic

Raw data from VBAP table

Composite

ZC_SalesOrderWithItemDetails

Join VBAK + VBAP

Consumption

ZC_SalesOrderAnalytics

UI/reporting-ready with annotations


๐Ÿงฑ 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

  1. Activate All CDS Views in order (Basic → Composite → Consumption).

  2. Open transaction RSRT.

  3. Test the analytical query using the technical name 2C_ZCSALESORDERANALYTICS.

  4. Use Fiori Preview (Ctrl + 6 in ADT) or OData Exposure for front-end.


✅ Key Concepts Demonstrated

Concept

View Name

Basic CDS View

ZI_SalesOrderBasic, ZI_SalesOrderItemBasic

Composite CDS View

ZC_SalesOrderWithItemDetails

Consumption CDS View

ZC_SalesOrderAnalytics

Analytics Enablement

@Analytics.query: true

Currency & Unit Handling

@Semantics.currencyCode, @Semantics.unitOfMeasure

Layered VDM

All 3 layers model (Basic → Composite → Consumption)





Next Topic


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

Popular posts from this blog

Day 1: Introduction to ABAP on HANA

Day 3: CDS Intermediate – Filters & Expressions

Day 2: CDS View Basics