Day 13: Real-Time Project Practice

Day 12: Performance & Optimization 



Day 13: Real-Time Project Practice

  • Full detailed project with line by line explanation using - CDS + TF + AMDP + UI annotations + DCL + OData publish with dashboard output









Let’s build a complete real-time project using:

 ✅ CDS Views (3-layered VDM)
✅ Table Function (CDS + SQLScript)
✅ AMDP Logic
✅ DCL (Authorization Control)
✅ UI Annotations (Fiori ready)
✅ OData Publishing
✅ Dashboard Output
✅ Fully working, deployable in ADT


๐Ÿ’ผ Project Scenario: Sales Order Fulfillment Dashboard

Goal:
Create a Fiori-ready dashboard to track Sales Orders with Delivery and Billing Status, using optimized CDS, AMDP logic for backend calculation, table function for complex joins, authorization control, and Fiori annotations.


๐Ÿ”น Project Overview

We're building a Sales Order Fulfillment Dashboard that shows:

  • Sales Order Header & Item details

  • Fulfillment status (Open, Partially Delivered, Fully Delivered)

  • Authorization-restricted data by Sales Org

  • Fiori-ready UI via annotations

  • OData-ready consumption


๐Ÿ“‚ VDM Architecture Summary (3-Layered)

  1. Basic Interface Views: ZI_SalesOrderHeader, ZI_SalesOrderItem

  2. Composite View: ZC_SalesOrderFulfillment

  3. Consumption View: ZC_SalesOrderFulfillmentConsumption

  4. Table Function + AMDP: ZTF_SalesOrderStatus, zcl_amdp_so_status 

  5. Authorization (DCL): ZC_SalesOrderFulfillmentConsumption.dcl


๐Ÿ“˜ Step-by-Step Explanation


1️⃣ Basic View – Sales Order Header


@AbapCatalog.sqlViewName: 'ZVSOHDR'

@AbapCatalog.compiler.compareFilter: true

@AccessControl.authorizationCheck: #CHECK

@EndUserText.label: 'Sales Order Header'

define view entity ZI_SalesOrderHeader

  as select from vbak

{

  key vbeln,

  erdat,

  auart,

  vkorg,

  vtweg,

  spart,

  kunnr,

  netwr,

  waerk

}

Explanation:

  • @AbapCatalog.sqlViewName: SQL view for runtime.

  • @AccessControl.authorizationCheck: #CHECK: Enforce DCL.

  • Selecting header fields from VBAK.


2️⃣ Basic View – Sales Order Item


@AbapCatalog.sqlViewName: 'ZVSOITM'

@EndUserText.label: 'Sales Order Item'

define view entity ZI_SalesOrderItem

  as select from vbap

{

  key vbeln,

  key posnr,

  matnr,

  arktx,

  kwmeng,

  vrkme,

  netwr,

  waerk,

  werks,

  lgort

}

Explanation:

  • This view represents item-level data from VBAP.


3️⃣ Table Function – Get Fulfillment Status


@EndUserText.label: 'Sales Order Fulfillment Status TF'

define table function ZTF_SalesOrderStatus

  with parameters iv_vkorg: vkorg

  returns {

    vbeln: vbeln,

    posnr: posnr,

    status: abap.char(20)

  }

implemented by method zcl_amdp_so_status=>get_status.


Explanation:

  • TF accepts Sales Org as parameter (iv_vkorg)

  • Returns fulfillment status (e.g. Fully Delivered)


4️⃣ AMDP Class – Fulfillment Status Logic


CLASS zcl_amdp_so_status DEFINITION

  PUBLIC

  FINAL

  CREATE PUBLIC .


  PUBLIC SECTION.

    INTERFACES: if_amdp_marker_hdb.


    CLASS-METHODS get_status

      FOR TABLE FUNCTION ZTF_SalesOrderStatus

      IMPORTING iv_vkorg TYPE vkorg.

ENDCLASS.


CLASS zcl_amdp_so_status IMPLEMENTATION.

  METHOD get_status BY DATABASE FUNCTION

                   FOR HDB LANGUAGE SQLSCRIPT

                   OPTIONS READ-ONLY

                   USING vbap vbak likp lips.


    RETURN SELECT

      a.vbeln,

      a.posnr,

      CASE

        WHEN b.vbeln IS NULL THEN 'Open'

        WHEN c.vbeln IS NULL THEN 'Partially Delivered'

        ELSE 'Fully Delivered'

      END AS status

    FROM vbap AS a

    LEFT JOIN vbak AS h ON a.vbeln = h.vbeln

    LEFT JOIN lips AS b ON a.vbeln = b.vgbel AND a.posnr = b.vgpos

    LEFT JOIN likp AS c ON b.vbeln = c.vbeln

    WHERE h.vkorg = :iv_vkorg;


  ENDMETHOD.

ENDCLASS.


Explanation:

  • Uses SQLScript to determine delivery status.

  • Logic:

    • No delivery = Open

    • Some delivery = Partially Delivered

    • Full delivery = Fully Delivered


5️⃣ Composite View – Combine All


@AccessControl.authorizationCheck: #CHECK

@EndUserText.label: 'Sales Order Fulfillment Composite View'

define view entity ZC_SalesOrderFulfillment

  as select from ZI_SalesOrderHeader as Header

  inner join ZI_SalesOrderItem as Item

    on Header.vbeln = Item.vbeln


  left outer join ZTF_SalesOrderStatus(iv_vkorg: Header.vkorg) as Status

    on Status.vbeln = Item.vbeln and Status.posnr = Item.posnr


{

  key Header.vbeln,

  key Item.posnr,

  Header.kunnr,

  Header.erdat,

  Item.matnr,

  Item.arktx,

  Status.status

}


Explanation:

  • Joins Header + Item + Fulfillment Status

  • Authorization is checked on vkorg

  • Exposes delivery status via TF


6️⃣ Consumption View – UI & OData Ready


@EndUserText.label: 'Sales Order Fulfillment Consumption View'

@UI.headerInfo: { typeName: 'Sales Order', typeNamePlural: 'Sales Orders', title: { value: 'vbeln' } }

@UI.selectionPresentationVariant: [ { qualifier: 'Default', text: 'Default Filter' } ]

@Search.searchable: true

@OData.publish: true

define view entity ZC_SalesOrderFulfillmentConsumption

  as select from ZC_SalesOrderFulfillment

{

  @UI.lineItem: [{ position: 10 }]

  key vbeln,


  @UI.lineItem: [{ position: 20 }]

  posnr,


  @UI.lineItem: [{ position: 30 }]

  kunnr,


  @UI.lineItem: [{ position: 40 }]

  matnr,


  @UI.lineItem: [{ position: 50 }]

  arktx,


  @UI.lineItem: [{ position: 60 }]

  status

}

Explanation:

  • Publishes CDS as OData service.

  • Adds UI annotations for List Report.


7️⃣ DCL – Authorization by Sales Org


@EndUserText.label: 'DCL for Sales Org Authorization'

define role ZR_SALES_ORG_AUTH {

  grant select on ZC_SalesOrderFulfillment

    where vkorg = aspect pfcg_auth(vkorg);

}


Explanation:

  • Restricts data based on user’s vkorg authorization.


8️⃣ Testing via OData

  1. Activate OData:

    • Use /IWFND/MAINT_SERVICE

    • Add service ZC_SALESORDERFULFILLMENTCONSUMPTION_CDS

  2. Browser Test:

    • $metadata.../sap/opu/odata/sap/ZC_SALESORDERFULFILLMENTCONSUMPTION_CDS/$metadata

    • $filter=status eq 'Open'

    • $expand not needed unless nested views


✅ Summary

Layer

Object

Basic

ZI_SalesOrderHeader, ZI_SalesOrderItem

TF + AMDP

ZTF_SalesOrderStatus, zcl_amdp_so_status

Composite

ZC_SalesOrderFulfillment

Consumption

ZC_SalesOrderFulfillmentConsumption

DCL

ZR_SALES_ORG_AUTH

UI & OData

@UI.*, @OData.publish: true


๐Ÿงช Test Scenarios

  1. Check if data restricted by vkorg via DCL.

  2. Load URL in browser to see Fiori output.

  3. Check sorting, filters, search from annotations.

  4. Enable Fiori tile/report for display in Launchpad.


Comments

Popular posts from this blog

Day 1: Introduction to ABAP on HANA

Day 3: CDS Intermediate – Filters & Expressions

Day 2: CDS View Basics