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)
Basic Interface Views: ZI_SalesOrderHeader, ZI_SalesOrderItem
Composite View: ZC_SalesOrderFulfillment
Consumption View: ZC_SalesOrderFulfillmentConsumption
Table Function + AMDP: ZTF_SalesOrderStatus, zcl_amdp_so_status
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
Activate OData:
Use /IWFND/MAINT_SERVICE
Add service ZC_SALESORDERFULFILLMENTCONSUMPTION_CDS
Browser Test:
$metadata → .../sap/opu/odata/sap/ZC_SALESORDERFULFILLMENTCONSUMPTION_CDS/$metadata
$filter=status eq 'Open'
$expand not needed unless nested views
✅ Summary
๐งช Test Scenarios
Check if data restricted by vkorg via DCL.
Load URL in browser to see Fiori output.
Check sorting, filters, search from annotations.
Enable Fiori tile/report for display in Launchpad.
Comments
Post a Comment