Newer Version Available

This content describes an older version of this product. View Latest

Get Report Data

Get runtime report data for display on the user-interface.
Resource
1GET_REPORT_DATA
Available version
55.0
Request Parameters
Property Name Type Description Required or Optional
filters Map<String, Object> Specify filters for the report execution. For more information on the report filters, see Consumer Good Cloud Real Time Reporting Developer Guide. Required
reportName String Report name to execute. The Report name must exist on the target Sales org. Required
unZippedResponse String Report data without compressing the reponse. Always send true from APEX. Required
productIdsForApex Boolean Indicates whether the product IDs are in a format that can be used by Apex (true) or not (false). Always specify true. Required
Apex Request Example
1// Logical endpoint name
2String endpointName = 'GET_REPORT_DATA';
3
4// name of the salesorg for which the report should be executed
5String salesOrg = '0001';
6
7<namespace>.OffplatformCallout callout = new <namespace>.OffplatformCallout(endpointName,
8salesOrg);
9
10// Log Transaction Id
11String txId = <namespace>.TransactionHandler.getTransactionIdentifier();
12
13// Execute callout
14<namespace>.OffplatformCalloutResponse response = callout.execute(
15    txId,
16    new Map<String, String>(), // No URL Parameters
17    JSON.serialize(
18        new Map<String, Object> {
19            'unzippedresponse' => 'true', // Required
20            'productidsforapex' => true, // Required
21            'reportname' => 'Promotion Report', // Report to execute
22            'filters' => new Map<String, Object> { // Report filters. Filters are dependent on the report definition!
23                'periodmonth' => new Map<String, Object> {
24                    'start' => 0,
25                    'total' => 12,
26                    'year' => 2022
27                },
28                'accountsfids' => new List<String> {'001TC000000Ot6mYAC'},
29                'productsfids' => new List<String> {'01tTC0000001oHLYAY'},
30                'promo_templatesfid' => new List<String> {'a2UTC00000017Hd2AI', 'a2UTC00000017Hb2AI'},
31                'promo_phase' => new List<String> {
32                    'Planning',
33                    'Modeling',
34                    'Committed',
35                    'ForApproval'
36                },
37                'productlevel'=> 'product'
38            }
39            
40        }
41    )
42);
43
44if (response.status != 200) {
45    // Handle error and return error info to caller
46}
47
48// Deserialize Response
49Map<String, Object> report = (Map<String, Object>) JSON.deserializeUntyped(response.result);
50
51// The names of the components come from the uimapping section of the 
52// report definition. The UI components defined in the report definition will be present
53// in the result
54
55// ScoreCard component is represented by an array of decimals.
56// Each value matches the kpi defined in the report configuration inside the "scorecard"
57// KPI Group under attributes->kpidimension
58// the matching is index based (Kpi in first position is index 0)
59List<Object> scoreCard = (List<Object>) report.get('ScoreCard');
60
61// Flatlist components are represented by an object with a header and data property.
62// header property contains all the column headers
63// data property is an array of arrays. Each outer
64// array represents a row and inner array represent column values
65// The 3 first elements of each row are reserved
66// - Index 0 represent the row type. All row types can be mapped with the "rowTypeMapping"
67// Present in the response.
68// All product related ids use a shorter format. These product ids can be mapped
69// to SFDC Product2 ids by using the "internalIdToSfId" property of the reponse
70
71Map<String, Object> prodIdToSFIdMap = (Map<String, Object>) report.get('internalIdToSfId');
72
73Map<String, Object> flatlist = (Map<String, Object>) report.get('FlatList');
74List<Object> header = (List<Object>) flatlist.get('header');
75Map<String, Object> rowTypeMapping = (Map<String, Object>) flatlist.get('rowTypeMapping');
76List<Object> data = (List<Object>) flatlist.get('data');
77
78// extract header names
79List<String> headerNames = new List<String>();
80for (Object obj: header) {
81    Map<String, Object> casted = (Map<String, Object>) obj;
82    headerNames.add(String.valueOf(casted.get('name')));
83}
84
85// Print all the data
86for (Integer i = 0; i < data.size(); ++i) {
87    system.debug('Printing Row #' + i);
88    List<Object> dataRow = (List<Object>) data.get(i);
89
90    // print rowTypeMapping
91    System.debug('RowType: ' + String.valueOf(rowTypeMapping.get(String.valueOf(dataRow.get(1)))));
92
93    for (Integer j = 0; j < headerNames.size(); ++j) {
94        String headerName = headerNames.get(j);
95        Object dataCell = dataRow.get(j + 3); // Offset by 3
96        if (headerName.startsWith('productdimension') 
97            && dataCell != null
98            && prodIdToSFIdMap.containsKey(String.valueOf(dataCell))) {
99            dataCell = prodIdToSFIdMap.get(String.valueOf(dataCell));
100        }
101        System.debug(headerName + ': ' + dataCell);
102    }
103}