salesforce中自定义开发report,用代码实现

自定义开发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);
         
    }
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值