S/4 HANA Cloud 2105 – Custom Analytics Aging Report for Professional Services – Part1
This blog provides detailed steps to enhance the standard S/4 HANA Cloud aging report and create a complex customized aging report for professional services within very short time scales. Please note that we can create embedded SAC stories on top of this custom analytic report but that is out of the scope of the current blog as we need to build a cost-efficient report within a very short time scale. However, we can always create a SAC user story if required on top of the custom analytic report.
Tips and Tricks for Creating SAP S/4 HANA Cloud Essentials Reports
There are many ways to create reports in SAP S/4 HANA Cloud Essentials but the below table provides a guideline on when we need to choose what technology to build SAP S/4 HANA Cloud Essentials Reports. I like to thank Hector Andres for pulling these guidelines together from the lessons we had learned on SAP S/4 HANA Cloud Essentials Projects.
- Define parameters at the lowest level; Parameters are inherited across the CDS view workflow, if added to the lowest level view (primary source), data gets restricted earlier, improving performance.
- The filter expression editor is not very user-friendly; Recommended to write the code externally and then paste it into the editor.
- Do not try nested associations; If you need to associate view B to view A, but you also need view C to be associated to view B, create a CDS view containing view B as the primary source and associate view C to it. Then associate this view to the primary CDS view, A.
- Associations are nothing but left outer joins; If you need to restrict data on CDS view A based on data on CDS View B (for example, get timesheet entries (view A) only for German Employees (view B)), you cannot achieve it by simply associating view B to A. You need to create another view (C) on top of it and then filter by any column from view B different to NULL (timesheets for non-German Employees will have NULL output on associated view B fields since this only contains German employees).
- Define your source views as “Standard” and the top view as “Analytical Cube” unless you need to apply aggregation in between.
- Don’t use associations in your top view (cube), other than master data views, text views and value help views; It’s good practice to keep complex logic in standard views and as low as possible and use the cube to enrich the model semantically.
Custom Aging High Level Requirements
The customer wants to slice the Accounts receivable aging report by project, WBS, and customer hierarchy data and also classify amounts into 8 different aging buckets. Although many of the features of the SAP-delivered Total Receivables and Overdue Receivables are applicable to customer’s businesses, these reports do not provide enough functionality to meet the business requirements. Please note that SAP S/4 HANA Cloud Essentials doesn’t support custom hierarchies and hence we enabled it using the custom business objects.
|Company Code||Company Code Name||Project Manager Name||Project Partner Name||Project Name||WBS Name||Invoice Numbers||Customer No||Customer Name||Customer Hierarchy 1||Customer Hierarchy 2||Amount in Transaction Currency|
|Amount in EURO||Amount in USD||Amount in Company Code Currency||Amount in Transaction Currency||Days Aged||<0 Days||0-30 Days||31-60 Days||61-90 Days||91-120 Days||121-150 Days||151-180 Days||181+ Days||Totals|
The solution architecture to deliver the above requirement using SAP S/4 HANA Cloud Essentials is depicted below:
After identifying the right solution architecture, the next step is to identify the CDS view navigation properties and join conditions that we need to use to fulfill the requirement. It is very tricky to find the right CDS views as there are many CDS views provided by SAP but without reference to our old ABAP Tables. We have identified the right CDS views after some investigation.
Custom BO CDS View
The story is not over yet as we faced few more hurdles, we will explain how we overcome those hurdles in Part 2 of this blog.