zoukankan      html  css  js  c++  java
  • Salesforce 报表开发

    Salesforce提供了强大的报表功能,支持表格、摘要、矩阵以及结合共四种形式,本文探讨在站在开发的角度要如何理解报表。

    一:查询报表基本信息
    报表在Sales force中是Report对象,基本的查询语句可以获取一些报表的基本信息

    1 select id,Name,CreatedById,CreatedBy.Username,LastModifiedDate,FolderName from Report

    二:在Apex类中运行报表

    Salesforce分别提供了runReport(同步)以及runAsyncReport(异步)两种方式运行报表

    1 //同步方法:
    2 Reports.ReportResults results = Reports.ReportManager.runReport(reportId,true);
    3 //异步方法
    4 Reports.ReportInstance instance = Reports.ReportManager.runAsyncReport(m.id, true);

    我们写一段静态代码来执行打印报表数据

    1 String reportId = '报表id';
    2 Reports.ReportResults  results = Reports.ReportManager.runReport(reportId,true);
    3 System.debug('===========报表运行结果========>>');
    4 System.debug(results);

    需要注意的有两点

    • 没选中任何列的情况下运行报错
    • 结合报表不支持

    没有选中任何列的报表指的如下图所示

    运行结果:reports.MetadataException: 无法运行报表,因为它尚未选择任何列。确保通过用户界面向报表添加字段作为列

    至少需要添加一个字段到该报表,之后隐藏详细记录,即可实现同样的效果。

    如果报表类型是结合报表,运行上述代码回提示错误

    在避开上述两个易出现的问题后,就能成功用apex方法执行一个报表并得到它的返回值results了。

    Results返回值是一个JSON串,ReportResults对象,包含属性

    • allData:标识
    • factMap:Map<坐标,数据>存放数据的map
    • groupingsAcross:横向分组字段
    • groupingsDown:纵向分组字段
    • hasDetailRows:是否有数据
    • reportExtendedMetadata:表头
    • reportMetadata:其他信息

    实际返回值结构如下

     1 Reports.ReportResults[ 2         //public Boolean getAllData()
     3         //true, indicates that all report results are returned.
     4         //false, indicates that results are returned for the same number of rows as in a report run in Salesforce.
     5         allData=true,
     6         //public MAP<String,Reports.ReportFact> getFactMap()
     7         factMap={},//对象,无序键值对
     8         //public Reports.Dimension getGroupingsAcross()
     9         //Returns a collection of column groupings, keys, and values.
    10         groupingsAcross=Reports.Dimension[],
    11         //public Reports.Dimension getGroupingsDown()
    12         //Returns a collection of row groupings, keys, and values
    13         groupingsDown=Reports.Dimension[],
    14         //public Boolean getHasDetailRows()
    15         //Returns information about whether the fact map has detail rows
    16         //true, indicates that the fact map returns values for summary-level and record-level data.
    17         //false, indicates that the fact map returns summary values.
    18         hasDetailRows=true,
    19         //public Reports.ReportExtendedMetadata getReportExtendedMetadata()
    20         //Returns additional, detailed metadata about the report, including data type and label information for groupings and summaries.
    21         reportExtendedMetadata=Reports.ReportExtendedMetadata[],
    22         //public Reports.ReportMetadata getReportMetadata()
    23         //Returns metadata about the report, including grouping and summary information
    24         reportMetadata=Reports.ReportMetadata[]
    25     ]

    其中factMap以无序键值对的形式存储了所有报表数据,groupingsAcross和groupingsDown存储了报表的横纵字段信息,reportExtendedMetadata记录了包括报表横纵分组信息在内的相关信息,reportMetadata则记录了表格类型,分组长度等信息。

    1.查看报表类型

     1 Reports.ReportMetadata metadata = results.getReportMetadata();
     2 String reportType = '' + metadata.getReportFormat();
     3 if(reportType == 'TABULAR'){
     4      System.debug('该报表为表格类型');
     5 }
     6 if(reportType == 'SUMMARY'){
     7      System.debug('该报表为摘要类型');
     8 }
     9 if(reportType == 'MATRIX'){
    10      System.debug('该报表为矩阵类型');
    11 }

    2.报表数据获取

    factMap最多支持2*2的矩阵类型,在表格数据的展示上如上表所示,数据显示格式  *_*!*_*

    其中,如果遇到小计/总计的数据,对应的点用T(Total)进行标识,比如最后横纵交汇的点就是T!T

    3.报表分组信息的获取

    1 Reports.ReportExtendedMetadata extended_metadata = results.getReportExtendedMetadata();
     1 Reports.ReportExtendedMetadata[
     2     //public MAP<String,Reports.AggregateColumn> getAggregateColumnInfo()
     3     //Returns all report summaries such as Record Count, Sum, Average, Max, Min, and custom summary formulas. Contains values for each summary that is listed in the report metadata.
     4     aggregateColumnInfo={},//汇总信息
     5     //public MAP<String,Reports.DetailColumn> getDetailColumnInfo()
     6     //Returns a map of two properties for each field that has detailed data identified by its unique API name. The detailed data fields are also listed in the report metadata.
     7     detailColumnInfo={},//详细信息
     8     //public MAP<String,Reports.GroupingColumn> getGroupingColumnInfo()
     9     //Returns a map of each row or column grouping to its metadata. Contains values for each grouping that is identified in the groupingsDown and groupingsAcross lists.
    10     groupingColumnInfo={}//分组字段
    11 ]

    横纵向的两个分组字段信息可以从groupingColumInfo中获取,包括了字段的类型,名称,标签以及分组级别

    4.每个分组下对应显示的字段

    1 Reports.Dimension dim_Across = results.getGroupingsAcross();
    2 List<Reports.GroupingValue> list_gr = dim_Across.getGroupings();
    3 System.debug('横向' + list_gr);
    4 Reports.Dimension dim_Down = results.getGroupingsDown();
    5 List<Reports.GroupingValue> list_gr_down = dim_Down.getGroupings();
    6 System.debug('纵向' + list_gr_down);

    5.其他报表信息查询

    1 Reports.ReportMetadata metadata = results.getReportMetadata();

    Reports.ReportMetadata提供了关于报表的所有信息,比如报表的id,Name,报表类型,汇总字段,行列分组以及汇总信息依据。我们甚至可以用来修改报表的汇总信息条件。尤为重要的是其提供了groupingsAcross数组,从而能确定报表的分组排列方式,下面是我抽取的一段JSON数据,可以看到报表的分组形式横向分别是订单类型(ORDER_TYPE),订单所有人(ORDER_OWNER),纵向分组是订单状态(ORDER_STATUS),订单等级(Order.DeliveryLevel__c)。

     1  groupingsAcross=(Reports.GroupingInfo[
     2         dateGranularity=NONE,
     3         name=ORDER_TYPE,
     4         sortAggregate=null,
     5         sortOrder=ASCENDING
     6     ],
     7     Reports.GroupingInfo[
     8         dateGranularity=NONE,
     9         name=ORDER_OWNER,
    10         sortAggregate=null,
    11         sortOrder=ASCENDING
    12     ]),
    13     groupingsDown=(Reports.GroupingInfo[
    14         dateGranularity=NONE,
    15         name=ORDER_STATUS,
    16         sortAggregate=null,
    17         sortOrder=ASCENDING
    18     ],
    19     Reports.GroupingInfo[
    20         dateGranularity=NONE,
    21         name=Order.DeliveryLevel__c,
    22         sortAggregate=null,
    23         sortOrder=ASCENDING
    24     ]),

    Salesforce提供了强大的报表功能,但是作为开发者也应该了解其内部的数据存储,希望本文对你能有所帮助。如有错漏,欢迎指正,有问题可以留言。 

  • 相关阅读:
    数组实现队列
    qsort用法 (转)
    枚举法
    HDU 2293
    bfs 街道赛跑
    漫谈二分查找Binary Search (转)
    qsort 结构体二级排序实例
    优化枚举法
    10项比较重要的.NET技术
    ADO.NET SQL Provider 和 ADO.NET OLE DB Provider 和 ADO.NET ODBC Provider 性能对比。
  • 原文地址:https://www.cnblogs.com/luqinghua/p/9056529.html
Copyright © 2011-2022 走看看