Our subscription analytics dashboard in Fiori is not showing renewal status for contracts that are up for renewal in the next 90 days. The dashboard displays active subscriptions correctly, but the renewal tracking section remains empty even though we have 47 contracts expiring soon.
I suspect the issue is in our custom CDS view that joins subscription data with renewal tracking. Here’s the relevant join:
left outer join ZI_RenewalStatus as _Renewal
on Contract.ContractID = _Renewal.ContractID
The dashboard configuration uses @ObjectModel.association for navigation, but I’m not sure if the annotation is correctly set up for the renewal relationship. The data exists in the renewal status table - I can query it directly in SE16 - but it’s not appearing in the analytics dashboard.
Has anyone experienced issues with CDS join conditions not populating dashboard tiles correctly? Is there a specific ObjectModel annotation pattern needed for time-based filtering in analytics scenarios?
I’d look at the ObjectModel.association annotation more carefully. For renewal tracking, you probably need @ObjectModel.association.type: [#TO_COMPOSITION_CHILD] or similar, depending on your data model. Also ensure that the renewal status table has proper filtering annotations like @Consumption.filter.mandatory if date ranges are required. The dashboard might be failing silently if required filter parameters aren’t provided.
Your join looks syntactically correct, but left outer joins in analytical CDS views can behave differently than in regular views. Make sure ZI_RenewalStatus is also an analytical view with proper @Analytics annotations. If it’s a basic view, the association might not work correctly in the analytics context. The view type matters for dashboard consumption.
Check if your left outer join is actually returning rows. Sometimes the join condition looks correct but there’s a data type mismatch or leading zeros issue between ContractID fields. Run the CDS view in data preview (F8 in ADT) and check if renewal records appear there before troubleshooting the dashboard layer.
Dashboard data refresh is critical here. Even if your CDS view is correct, Fiori dashboards cache data and don’t always refresh in real-time. Check your dashboard tile configuration - specifically the refresh interval and whether it’s set to auto-refresh. Also verify that the KPI definition in the dashboard is pointing to the correct CDS view fields. I’ve seen cases where the dashboard tile was configured before the CDS view was updated, and it kept using stale metadata.
Found and fixed the issue! It was a combination of problems with the CDS join condition, ObjectModel annotation, and dashboard data refresh timing.
1. CDS Join Condition Problem:
The left outer join was correct syntactically, but the renewal status table uses a compound key (ContractID + RenewalPeriod), not just ContractID. My join was only matching on ContractID, which caused multiple rows per contract or no match when the period wasn’t specified. Fixed join:
left outer join ZI_RenewalStatus as _Renewal
on Contract.ContractID = _Renewal.ContractID
and _Renewal.RenewalPeriod = 'CURRENT'
The ‘CURRENT’ filter ensures we only get active renewal tracking records.
2. ObjectModel Annotation Fix:
I was missing proper association metadata. Added this to the CDS view:
@ObjectModel.association.type: [#TO_COMPOSITION_CHILD]
association [0..1] to ZI_RenewalStatus as _Renewal
on $projection.ContractID = _Renewal.ContractID
The [0..1] cardinality is important - it tells the analytics framework that each contract has at most one current renewal status. Without this, the dashboard aggregation logic was confused about how to handle the relationship.
3. Dashboard Data Refresh Configuration:
The dashboard was using a cached dataset that only refreshed nightly. I updated the tile configuration in the Fiori launchpad designer to use real-time data refresh:
Changed refresh mode from ‘scheduled’ to ‘on-load’
Set the cache duration to 0 (no caching for renewal data)
Added date parameter binding to ensure the 90-day filter is applied at query time
I also had to regenerate the OData service metadata after changing the CDS view annotations. Used transaction /IWFND/MAINT_SERVICE to clear the service cache.
The renewal tracking section now displays all 47 contracts correctly. The key learning was that dashboard associations need explicit cardinality and association type annotations - the analytics framework doesn’t infer these automatically like it does for regular CDS view consumption.
One additional fix: I added @Analytics.query: true to the parent view to ensure it’s properly registered as an analytical query. This improved dashboard performance significantly because it enables proper aggregation at the database level rather than in the application layer.