https://developer.salesforce.com
Inhaltsverzeichnis
Möglichkeiten
- Programmatischer Zugriff auf die Report-Daten, per Report-Builder vordefiniert
- Unterstützt die Integration von Report-Daten in Web- or Mobile Apps innerhalb und außerhalb von Salesforce (z.B. man triggert einen Chatter Post mit einer Datenübersicht)
- Visualisierung von Daten
- Integrieren von Report-Daten in Custom Objects
- Integrieren von Report-Daten umfangreiche Übersichten zum Animieren der Daten
- Erstellen von Custom-Dashboards
- Automatisieren von Report-Aufgaben
- Die API-Ressourcen ermöglichen das Suchen und Filtern der Report-Daten
- Ausführen von tabellarischen, zusammengefassten oder Matrix-Reports
- Sofortiges Filtern von spezifischen Daten
- Suchen von Report-Daten und Metadaten
Voraussetzungen und Einschränkungen
Voraussetzungen
- Organization = API enabled
Einschränkungen bei Reports und Dashboards API + allge. API-Einschränkungen
- Nicht unterstützt Filterarten bei Datenfiltern
- Kreuzfilter (Cross-Filter)
- Standard-Report-Filter
- Filtern Anhand des Zeilenlimits
- Tracking-Reports zur Nachverfolgung nur in Matrix-Reports
- Keine Abonnements für Tracking-Reports
- verarbeitet nur report mit min. 100 Feldern als Spalten
- max. 200 zuletzt angezeigten Reports
- Org unterstützt max. 500 synchrone Report-Aufrufe pro Stunde
- Die API unterstützt max. 20 synchrone Report-Aufrufe gleichzeitig
- Rückgabe einer Liste von bis zu 2000 Instanzen eines asynchron ausgeführten Reports
- API unterstützt max. 200 Anfragen gleichzeitig für Ergebnisse von asynchronen Report-Durchläufen
- Org unterstützt max. 1200 asynchrone Anfragen pro Stunde
- Ergebnisse aus asynchronen Report-Durchläufen sind max. 24 Stunden verfügbar
- API gibt bis zu 2000 Zeilen zurück
- bis zu 20 Custom-Field-Filter pro Report-Durchlauf
- Aufrufe nicht in Apex Triggern unterstützt (synchron und asynchron)
- keine APex-Methode für kürzlich aufgerufen reports
- Grenzwerte für die Anzahl der Zeilen pro abgerufen per SOQL beträgt 50.000 pro Transaktion eines synchron aufgerufenen reports
- Apex Tests,
- ignorieren immer die SeeAllData-Notation.
- Report-Daten enthalten bestehende Daten, welche nicht durch den Test erstellt wurden
- asynchrone Reports werden nur nach Aufruf von Test.stopTest ausgeführt
Report ausführen
Reports können synchron oder asynchron ausgeführt werden. Empfohlen wird aber asynchron weil:
- Umfangreiche Reports können asynchron die Timeout-Grenze nicht erreichen
- die 2-minütige Timeout gilt nicht für asynchrone jobs
- die API kann eine höhere Anzahl an gleichzeitigen asynchronen Jobs verwalten
- Daten aus asynchronen Jobs stehen nach Ausführung 24 Std. zur Verfügung
Vorbereitung
Für das Ausführen von Report per API wird die Report-ID benötigt. Die kann direkt der Ausführung angegeben werden oder per SOQL und dem “Developer-Name” des Reports ermittelt werden.
DeveloperName oder ID direkt können per Workbench ermittelt werden.
https://workbench.developerforce.com/
- An Org anmelden.
- Jump to: Metadata Types & Components
- Report auswählen
Unter “Components” sind alle Report-Folder mit den enthaltenen Report-DeveloperNames aufgeführt.
Synchrones Ausführen (Snippet)
Report ID abrufen = function .get().get(‘Id’)
List <Report> reportList = [SELECT Id,DeveloperName FROM Report where
DeveloperName = 'Closed_Sales_This_Quarter'];
String reportId = (String)reportList.get(0).get('Id');
Report aufrufen = function runReport()
Reports.ReportResults results = Reports.ReportManager.runReport(reportId, true);
System.debug('Synchronous results: ' + results);
Metadaten abrufen
Report-Metadaten abrufen = function getReportMetaData()
Reports.ReportMetadata rm = results.getReportMetadata();
System.debug('Name: ' + rm.getName());
System.debug('ID: ' + rm.getId());
System.debug('Currency code: ' + rm.getCurrencyCode());
System.debug('Developer name: ' + rm.getDeveloperName());
Gruppierungsinfos zur ersten Gruppierung abrufen = function getGroupingsDown()[]
Reports.GroupingInfo gInfo = rm.getGroupingsDown()[0];
System.debug('Grouping name: ' + gInfo.getName());
System.debug('Grouping sort order: ' + gInfo.getSortOrder());
System.debug('Grouping date granularity: ' + gInfo.getDateGranularity())
Aggregate abrufen = function getAggregates()[]
System.debug('First aggregate: ' + rm.getAggregates()[0]);
System.debug('Second aggregate: ' + rm.getAggregates()[1])
Zeilen-Details abrufen = function getDetailColumn
System.debug('Detail columns: ' + rm.getDetailColumns());
Report-Format abrufen = function getReportFormat()
System.debug('Report format: ' + rm.getReportFormat());
Report-Daten holen
Erste Untergruppierung ermitteln = function getGroupingsDown();
Reports.Dimension dim = results.getGroupingsDown();
Reports.GroupingValue groupingVal = dim.getGroupings()[0];
System.debug('Key: ' + groupingVal.getKey());
System.debug('Label: ' + groupingVal.getLabel());
System.debug('Value: ' + groupingVal.getValue());
Fact-Map anhand des Gruppen-Schlüssels erstellen
String factMapKey = groupingVal.getKey() + '!T';
Abrufen Fact-Map aus dem Reportergebnissen
Reports.ReportFactWithDetails factDetails =(Reports.ReportFactWithDetails)results.getFactMap().get(factMapKey);
Ersten Summen-Wert aus der Fact-Map holen
Reports.SummaryValue sumVal = factDetails.getAggregates()[0];
System.debug('Summary Value: ' + sumVal.getLabel());
Feldwert aus der ersten Daten-Zelle der ersten Spalte des Reports holen
Reports.ReportDetailRow detailRow = factDetails.getRows()[0];
System.debug(detailRow.getDataCells()[0].getLabel());
Asynchrones Ausführen (Snippet)
- bis zu 2000 Instanzen eines Reports asynchron ausgeführt
Report-Liste abrufen
Report-ID abrufen
List <Report> reportList = [SELECT Id,DeveloperName FROM Report where
DeveloperName = 'Closed_Sales_This_Quarter'];
String reportId = (String)reportList.get(0).get('Id')
Report aufrufen
Reports.ReportInstance instance = Reports.ReportManager.runAsyncReport(reportId, true);
System.debug('Asynchronous instance: ' + instance);
Liste zu den asynchronen Durchläufen abrufen
System.debug('List of asynchronous runs:
Reports.ReportManager.getReportInstances(reportId));
Reports filtern
Vor dem Filtern des Reports einige :
- ReportTypeColumn.getFilterable = some fields can be filtered?
- ReportTypeColumn.filterValues = return all filter values for a field
- ReportManager.dataTypeFilterOperatorMap = field list of data types for using filtering
- ReportMetadata.getReportFilters = filters exist in the report
Report ID ermitteln
List <Report> reportList = [SELECT Id,DeveloperName FROM Report where
DeveloperName = 'Closed_Sales_This_Quarter'];
String reportId = (String)reportList.get(0).get('Id');
Report Metadaten ermitteln
Reports.ReportDescribeResult describe = Reports.ReportManager.describeReport(reportId);
Reports.ReportMetadata reportMd = describe.getReportMetadata();
Filter überschreiben und Report aufrufen
Reports.ReportFilter filter = reportMd.getReportFilters()[0];
filter.setValue('2013-11-01');
Reports.ReportResults results = Reports.ReportManager.runReport(reportId, reportMd);
Reports.ReportFactWithSummaries factSum =
(Reports.ReportFactWithSummaries)results.getFactMap().get('T!T');
System.debug('Value for November: ' + factSum.getAggregates()[0].getLabel());
Erneut Filter überschreiben und Report aufrufen
filter = reportMd.getReportFilters()[0];
filter.setValue('2013-10-01');
results = Reports.ReportManager.runReport(reportId, reportMd);
factSum = (Reports.ReportFactWithSummaries)results.getFactMap().get('T!T');
System.debug('Value for October: ' + factSum.getAggregates()[0].getLabel());
Entschlüsseln der Fakten-Mappe
Die Fakten-Mappe beinhaltet alle Zusammenfassungen und Werte auf Datensatzebene.
- Fakten-Mappe im Ergebnis nach Aufruf eines Reports
- kann nur Zusammenfassung enthalten
- kann Zusammenfassung und detaillierte Daten enthalten
- Werte der Schlüssel-Ausdrücke variieren je nach Report-Format
| Report Format | Fakten-Mappe Muster-Schlüssel | Beschreibung |
| Tabelle | T!T | Gesamtsumme des Reports. Datensatzwerte und Gesamtsumme werden dargestellt. |
| Zusammenfassung | 1_0_3!T | Zeilengruppe der 1. Ebene und das 2. Element_ Zeilengruppe der 2. Ebene und das 1. Element_ Zeilengruppe der 3. Ebene und das 4. Element !T |
| Matrix | 1_0_3!1_0_2 | Zeilengruppe der 1. Ebene und das 2. Element_ Zeilengruppe der 2. Ebene und das 1. Element_ Zeilengruppe der 3. Ebene und das 4. Element !Spaltengruppe der 1. Ebene und das 2. Element_ Spaltengruppe der 2. Ebene und das 1. Element_ Spaltengruppe der 3. Ebene und das 4. Element |
Mehr Informationen hier.

Die Kommentare sind geschlossen.