自定义开发report的官网学习链接:
1.常用方法介绍:
Reports.ReportDescribeResult describe = Reports.ReportManager.describeReport(reportId);//通过reportId,获取当前report实例,reportId是通过reportName用sql查出即可。
Reports.ReportMetadata reportMd = describe.getReportMetadata();//获取report元数据
List<Reports.ReportFilter> FiltersList = reportMd.getReportFilters();//获取report中的筛选器
Reports.ReportFilter filter = reportMd.getReportFilters()[0];//获取筛选器集合中的第一个筛选器
// System.debug('fields:'+ filter.getColumn()+',公式:'+filter.getOperator()+',value:'+filter.getValue());
filter.setValue(regionCode);//设置筛选器的值
filter.getColumn();//获取筛选器的字段
filter.getOperator();//获取筛选器的公式
filter.getValue()//获取筛选器的值
Reports.reportResults results = Reports.ReportManager.runReport(reportId, reportMd,true);//运行report
Reports.ReportFactWithDetails factDetails = (Reports.ReportFactWithDetails)results.getFactMap().get('0!T');//根据report type获取运行结果
List<Reports.ReportDetailRow> reportRows = factDetails.getRows();//获取report data的集合
Reports.ReportExtendedMetadata extended_metadata = results.getReportExtendedMetadata();
Map<String,reports.DetailColumn> infoMap = extended_metadata.getDetailColumnInfo(); //获取report字段集合
2.如果系统中report原本就有逻辑筛选器:
如果我们直接设置筛选器或添加筛选器,并不会覆盖原有的report逻辑筛选器,而是直接报错。
我们在开发的时候,就需要先把原有report的筛选器查出来,然后再把自定义的筛选器和查出的筛选器,全部设置进筛选器,再设置逻辑方法:例如reportMd.setReportBooleanFilter(’(1 OR 2) AND 3’);
List<Reports.ReportFilter> lstFilters = new List<Reports.ReportFilter>();
Reports.ReportDescribeResult describe = Reports.ReportManager.describeReport(reportId);//通过reportId,获取当前report实例,reportId是通过reportName用sql查出即可。
Reports.ReportMetadata reportMd = describe.getReportMetadata();//获取report元数据
List<Reports.ReportFilter> FiltersList = reportMd.getReportFilters();//获取report中的筛选器
//ReportFilter(String a ,String b,String c);//参数1:筛选条件的字段,参数2:比较符,参数3:比较的值
Reports.ReportFilter reportFilter1 = new Reports.ReportFilter('Lead.Assigned_Region__c','equals','164');//比较符:greaterOrEqual、lessOrEqual
lstFilters.addAll(FiltersList);
lstFilters.add(reportFilter1);
//如果遇到有筛选逻辑的report,比如and 、OR,那么就需要我们设置逻辑处理
//假设ReportFilter中有三个筛选器,那么我们可以通过下面的方法设置逻辑处理
reportMd.setReportBooleanFilter('(1 OR 2) AND 3');
3.对于系统中的report原本就没有逻辑筛选器(只有普通筛选器):
这个时候我们可以直接设置筛选器,但是要注意:如果设置筛选器,那么会把系统中原有的普通筛选器给覆盖掉,如果不想覆盖原有的筛选器,就需要先把原有的筛选器查出来,然后再把自己定义的筛选器和查出的筛选器,全部设置进筛选器中,
List<Reports.ReportFilter> lstFilters = new List<Reports.ReportFilter>();
Reports.ReportDescribeResult describe = Reports.ReportManager.describeReport(reportId);//通过reportId,获取当前report实例,reportId是通过reportName用sql查出即可。
Reports.ReportMetadata reportMd = describe.getReportMetadata();//获取report元数据
List<Reports.ReportFilter> FiltersList = reportMd.getReportFilters();//获取report中的筛选器
//ReportFilter(String a ,String b,String c);//参数1:筛选条件的字段,参数2:比较符,参数3:比较的值
Reports.ReportFilter reportFilter1 = new Reports.ReportFilter('Lead.Assigned_Region__c','equals','164');//比较符:greaterOrEqual、lessOrEqual
lstFilters.addAll(FiltersList);
lstFilters.add(reportFilter1);
4 添加自定义条件运行report并将运行结果写入CSV文件,放入email附件中的功能实现
@Future(callout=true) // export only the details rows, excluding the report header, groupings and filter settings.
public static void emailReportToRD() {
//List<Region_Contact__c> regionContactList = getActiveRegionContactList();
List<Report> reportList = getLeadAssignmentDailyReport(LEAD_ASSIGNMENT_DAILY_REPORT_RD);
//if (reportList.size() > 0 && regionContactList.size() > 0) {
String reportId = (String) reportList.get(0).get('Id');
string reportName = (String) reportList.get(0).get('Name');
String reportDeveloperName = (String) reportList.get(0).get('DeveloperName');
List<Messaging.SingleEmailMessage> messageList = new List<Messaging.SingleEmailMessage>();
String regionCode = '125';
String regionName = 'Region_Name';
List<Reports.ReportFilter> lstFilters = new List<Reports.ReportFilter>();
Reports.ReportDescribeResult describe = Reports.ReportManager.describeReport(reportId);
Reports.ReportMetadata reportMd = describe.getReportMetadata();
// Override filter and run report
Reports.ReportFilter reportFilter1 = new Reports.ReportFilter('Lead.Assigned_Region__c','equals','125');// greaterOrEqual、lessOrEqual
List<Reports.ReportFilter> FiltersList = reportMd.getReportFilters();
lstFilters.addAll(FiltersList);
lstFilters.add(reportFilter1);
reportMd.setReportFilters(lstFilters);
//run report and check if the number of leads is greater than or equal to 1
Reports.reportResults results = Reports.ReportManager.runReport(reportId, reportMd,true);//运行report
Reports.ReportFactWithDetails factDetails = (Reports.ReportFactWithDetails)results.getFactMap().get('0!T');
List<Reports.ReportDetailRow> reportRows = factDetails.getRows();//获取report数据集合
//System.debug('reportRows====>'+reportRows);
//System.debug('--->'+JSON.serializePretty(reportRows));
Reports.ReportExtendedMetadata extended_metadata = results.getReportExtendedMetadata();
//System.debug('extended_metadata====>'+extended_metadata);
Map<String,reports.DetailColumn> infoMap = extended_metadata.getDetailColumnInfo();//获取report中的字段
String coluName = '';
for (String re : infoMap.keySet()) {
coluName += infoMap.get(re).getName()+',';
}
coluName = coluName.removeEnd(',');
//System.debug('coluName=====>'+coluName);
List<String> csvLineList = new List<String>();
String line = '';
for(Reports.ReportDetailRow reportRow : reportRows){
line = '';
List<Reports.ReportDataCell> datacells = reportRow.getDataCells();
System.debug('datacells ===>'+datacells);
for (Reports.ReportDataCell cell : datacells) {
line += '"'+cell.getLabel()+'"'+',';
}
line = line.removeEnd(',');
csvLineList.add(line);
}
//拼接report的表头
String csvLines = String.join(csvLineList, '\n');
//拼接report的数据
String csvContent =coluName+'\n'+ csvLines;
//System.debug('csvContent===>'+csvContent);
Reports.Dimension dim_Across = results.getGroupingsAcross();
// System.debug('--->'+JSON.serializePretty(results));
// System.debug('运行报表的返回结果:'+results);
Map<String, Reports.ReportFact> factMap = results.getFactMap();
Messaging.EmailFileAttachment attachment = new Messaging.EmailFileAttachment();
attachment.setFileName(reportDeveloperName + '_' + '125' + '.csv');
attachment.setBody(Blob.valueOf(csvContent));//将report的csv文件作为附件
attachment.setContentType('text/csv');
// attachment.setContentType('application/vnd.ms-excel');
// attachment.setContentType('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');可以设置为excel格式
Messaging.SingleEmailMessage message = new Messaging.SingleEmailMessage();
message.setFileAttachments(new List<Messaging.EmailFileAttachment>{ attachment });
message.setSubject('潛在客戶名單日報表 - ' + regionCode);
String emailName = 'test';
List<String> toAddressList = new List<String>();
toAddressList.add('85790807@qq.com');//此处邮箱是假的,用于测试
message.setHtmlBody(
String.format(
system.Label.MSG_DAILY_REPORT_EMAIL_TO_RD,
new List<String>{ emailName, regionName, regionCode }
)
);
message.setToAddresses(toAddressList);
message.setOrgWideEmailAddressId(EmailUtility.defaultOrgWideEmailAddressId);
messageList.add(message);
Messaging.sendEmail(messageList);
}