Salesforce 开发整理(二)报表开发学习
Salesforce提供了强大的报表功能,支持表格、摘要、矩阵以及结合共四种形式,本文探讨在站在开发的角度要如何理解报表。
一:查询报表基本信息
报表在Sales force中是Report对象,基本的查询语句可以获取一些报表的基本信息
select id,Name,CreatedById,CreatedBy.Username,LastModifiedDate,FolderName from Report
二:在Apex类中运行报表
Salesforce分别提供了runReport(同步)以及runAsyncReport(异步)两种方式运行报表
//同步方法:
Reports.ReportResults results = Reports.ReportManager.runReport(reportId,true);
//异步方法
Reports.ReportInstance instance = Reports.ReportManager.runAsyncReport(m.id, true);
我们写一段静态代码来执行打印报表数据
String reportId = '报表id';
Reports.ReportResults results = Reports.ReportManager.runReport(reportId,true);
System.debug('===========报表运行结果========>>');
System.debug(results);
需要注意的有两点
- 没选中任何列的情况下运行报错
- 结合报表不支持
没有选中任何列的报表指的如下图所示
运行结果:reports.MetadataException: 无法运行报表,因为它尚未选择任何列。确保通过用户界面向报表添加字段作为列
至少需要添加一个字段到该报表,之后隐藏详细记录,即可实现同样的效果。
如果报表类型是结合报表,运行上述代码回提示错误
在避开上述两个易出现的问题后,就能成功用apex方法执行一个报表并得到它的返回值results了。
Results返回值是一个JSON串,ReportResults对象,包含属性
- allData:标识
- factMap:Map<坐标,数据>存放数据的map
- groupingsAcross:横向分组字段
- groupingsDown:纵向分组字段
- hasDetailRows:是否有数据
- reportExtendedMetadata:表头
- reportMetadata:其他信息
实际返回值结构如下
Reports.ReportResults[ //public Boolean getAllData()
//true, indicates that all report results are returned.
//false, indicates that results are returned for the same number of rows as in a report run in Salesforce.
allData=true,
//public MAP<String,Reports.ReportFact> getFactMap()
factMap={},//对象,无序键值对
//public Reports.Dimension getGroupingsAcross()
//Returns a collection of column groupings, keys, and values.
groupingsAcross=Reports.Dimension[],
//public Reports.Dimension getGroupingsDown()
//Returns a collection of row groupings, keys, and values
groupingsDown=Reports.Dimension[],
//public Boolean getHasDetailRows()
//Returns information about whether the fact map has detail rows
//true, indicates that the fact map returns values for summary-level and record-level data.
//false, indicates that the fact map returns summary values.
hasDetailRows=true,
//public Reports.ReportExtendedMetadata getReportExtendedMetadata()
//Returns additional, detailed metadata about the report, including data type and label information for groupings and summaries.
reportExtendedMetadata=Reports.ReportExtendedMetadata[],
//public Reports.ReportMetadata getReportMetadata()
//Returns metadata about the report, including grouping and summary information
reportMetadata=Reports.ReportMetadata[]
]
其中factMap以无序键值对的形式存储了所有报表数据,groupingsAcross和groupingsDown存储了报表的横纵字段信息,reportExtendedMetadata记录了包括报表横纵分组信息在内的相关信息,reportMetadata则记录了表格类型,分组长度等信息。
1.查看报表类型
Reports.ReportMetadata metadata = results.getReportMetadata();
String reportType = '' + metadata.getReportFormat();
if(reportType == 'TABULAR'){
System.debug('该报表为表格类型');
}
if(reportType == 'SUMMARY'){
System.debug('该报表为摘要类型');
}
if(reportType == 'MATRIX'){
System.debug('该报表为矩阵类型');
}
2.报表数据获取
factMap最多支持2*2的矩阵类型,在表格数据的展示上如上表所示,数据显示格式 *_*!*_*
其中,如果遇到小计/总计的数据,对应的点用T(Total)进行标识,比如最后横纵交汇的点就是T!T
3.报表分组信息的获取
Reports.ReportExtendedMetadata extended_metadata = results.getReportExtendedMetadata();
Reports.ReportExtendedMetadata[
//public MAP<String,Reports.AggregateColumn> getAggregateColumnInfo()
//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.
aggregateColumnInfo={},//汇总信息
//public MAP<String,Reports.DetailColumn> getDetailColumnInfo()
//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.
detailColumnInfo={},//详细信息
//public MAP<String,Reports.GroupingColumn> getGroupingColumnInfo()
//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.
groupingColumnInfo={}//分组字段
]
横纵向的两个分组字段信息可以从groupingColumInfo中获取,包括了字段的类型,名称,标签以及分组级别
4.每个分组下对应显示的字段
Reports.Dimension dim_Across = results.getGroupingsAcross();
List<Reports.GroupingValue> list_gr = dim_Across.getGroupings();
System.debug('横向' + list_gr);
Reports.Dimension dim_Down = results.getGroupingsDown();
List<Reports.GroupingValue> list_gr_down = dim_Down.getGroupings();
System.debug('纵向' + list_gr_down);
5.其他报表信息查询
Reports.ReportMetadata metadata = results.getReportMetadata();
Reports.ReportMetadata提供了关于报表的所有信息,比如报表的id,Name,报表类型,汇总字段,行列分组以及汇总信息依据。我们甚至可以用来修改报表的汇总信息条件。尤为重要的是其提供了groupingsAcross数组,从而能确定报表的分组排列方式,下面是我抽取的一段JSON数据,可以看到报表的分组形式横向分别是订单类型(ORDER_TYPE),订单所有人(ORDER_OWNER),纵向分组是订单状态(ORDER_STATUS),订单等级(Order.DeliveryLevel__c)。
groupingsAcross=(Reports.GroupingInfo[
dateGranularity=NONE,
name=ORDER_TYPE,
sortAggregate=null,
sortOrder=ASCENDING
],
Reports.GroupingInfo[
dateGranularity=NONE,
name=ORDER_OWNER,
sortAggregate=null,
sortOrder=ASCENDING
]),
groupingsDown=(Reports.GroupingInfo[
dateGranularity=NONE,
name=ORDER_STATUS,
sortAggregate=null,
sortOrder=ASCENDING
],
Reports.GroupingInfo[
dateGranularity=NONE,
name=Order.DeliveryLevel__c,
sortAggregate=null,
sortOrder=ASCENDING
]),
Salesforce提供了强大的报表功能,但是作为开发者也应该了解其内部的数据存储,希望本文对你能有所帮助。如有错漏,欢迎指正,有问题可以留言。
Salesforce 开发整理(二)报表开发学习的更多相关文章
- Solon Web 开发,二、开发知识准备
Solon Web 开发 一.开始 二.开发知识准备 三.打包与运行 四.请求上下文 五.数据访问.事务与缓存应用 六.过滤器.处理.拦截器 七.视图模板与Mvc注解 八.校验.及定制与扩展 九.跨域 ...
- java代码生成器 快速开发平台 二次开发 外包项目利器 springmvc SSM后台框架源码
. 权限管理:点开二级菜单进入三级菜单显示 角色(基础权限)和按钮权限 角色(基础权限): 分角色组和角色,独立分配菜单权限和增删改查权限. 按钮权限: 给角色分配按钮权限.2 ...
- Web报表工具FineReport二次开发JS之字符串
在报表开发过程中,有些需求可能无法通过现有的功能来实现,需要开发人员二次开发,以FineReport为例,可以使用网页脚本.API接口等进行深入的开发与控制. 考虑到JS脚本开发的使用较多,这里先先简 ...
- 最好最实用的PHP二次开发教程
◆二次开发 1.什么是二次开发? 二次开发,简单的说就是在现有的软件上进行定制修改,功能的扩展,然后达到自己想要的功能和效果,一般来说都不会改变原有系统的内核. 2.为什么要二次开发? 随着信息化技术 ...
- E8.Net 工作流二次开发架构平台
一. 产品简介 E8.Net工作流开发架构是基于微软.Net技术架构的工作流中间件产品,是国内商业流程管理(BPM)领域在.Net平台上的领先产品,是快速搭建流程管理解决方案的二次开 ...
- 3.NetDh框架之缓存操作类和二次开发模式简单设计(附源码和示例代码)
前言 NetDh框架适用于C/S.B/S的服务端框架,可用于项目开发和学习.目前包含以下四个模块 1.数据库操作层封装Dapper,支持多种数据库类型.多库实例,简单强大: 此部分具体说明可参考博客: ...
- magento二次开发的基本步骤分享
Magento后台添加新模块的体会 确定命名空间(Namespace)和模块(Modulename)的命名: 在app/etc/modules/ 路径下,创建 Namespace_Modulename ...
- discuz二次开发技巧
discuz二次开发技巧 二次开发大多时候知识设置和处理,如果能够获知模板文件获得的变量数组将大大提高我们的开发效率 获取页面已经定义的变量 <--{eval printf_r(get_defi ...
- Django开发笔记二
Django开发笔记一 Django开发笔记二 Django开发笔记三 Django开发笔记四 Django开发笔记五 Django开发笔记六 1.xadmin添加主题.修改标题页脚和收起左侧菜单 # ...
- JMeter 源码二次开发函数示例
JMeter 源码二次开发函数示例 一.JMeter 5.0 版本 实际测试中,依靠jmeter自带的函数已经无法满足我们需求,这个时候就需要二次开发.本次导入的是jmeter 5.0的源码进行实际的 ...
随机推荐
- JSONBuilder的用法
一.JSONBuilder可以向文件中写入写入json字符串.如下面的例子: 1 public class Test 2 { 3 public static void main(String args ...
- AWS云创建EC2与使用注意事项-踩坑记录
目录 AWS 一 创建 EC2(云服务器) 二.AWS 注意事项 三.AWS 申请 SSL 证书 四. 创建VPC AWS 文章 GitHub 地址: 点我 AWS云服务器价格计算器 AWS WEB ...
- Java学习之初识Maven
简介 功能特点 Maven主要作用类似于VS的包管理器,能够帮助开发者完成以下工作:构建.文档生成.报告.依赖.SCMs.发布.分发.邮件列表等. 详细请阅读:https://www.runoob.c ...
- table中td文字超出长度用省略号隐藏超出内容,鼠标点击内容全部显示
1,设置css样式 <style>table {width: 100%;float: left;table-layout:fixed;width:600px;border:1px soli ...
- css权重等级
1.问题起因(在一次偶然编写css发现的,.div2 p>.div1 p>.p1,然后做了测试并找查相关资料) 2.解决方案 首先看哪一级的权重高 1.!important,加在样式属性值 ...
- 我是如何一步步编码完成万仓网ERP系统的(十三)库存 2.加权平均价
https://www.cnblogs.com/smh188/p/11533668.html(我是如何一步步编码完成万仓网ERP系统的(一)系统架构) https://www.cnblogs.com/ ...
- 未能加载文件或程序集“Microsoft.Web.Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。系统找不到指定的文件。
网站部署到IIS提示Microsoft.Web.Infrastructure,未能加载 解决方案 使用nuget安装 Microsoft.Web.Infrastructure拷贝到bin目录下面
- C# abstract class Interface的介绍
1.基本概念介绍 抽象类: 1.抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法 2.抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类 3.具体 ...
- uni-app采坑记录
1. uni-app采坑记录 1.1. 前言 这里记录下uni-app实践中踩的坑 1.2. 坑点 1.2.1. 触发事件@longTap和@longpress 这两个都表示长按触发事件,那么这两个有 ...
- Shell 编程 文本处理工具 sed
本篇主要写一些shell脚本文本处理工具sed的使用. 概述 sed(Stream EDitor)是一个强大而简单的文本解析转换工具,可以读取文本,并根据指定的条件对文本内容进行编辑(删除.替换.添加 ...