插件案例 —— 换个思维查系统报表原创
金蝶云社区-MiLai
MiLai
18人赞赏了该文章 1,912次浏览 未经作者许可,禁止转载编辑于2020年08月17日 13:37:04

业务背景

有的时候,需要查询通版的报表,但是有些业务取数逻辑,挺复杂的。通常我们的做法可能是查找对应的报表取数逻辑,然后把取数逻辑罗列出来,然后根据自己的业务查询,但是可以换个思路,从底层查询报表。这里需要一定的代码抽象思维。


技术思路

对于BOS来说,所有的报表就只是一张DataTable,然后根据DataTbale进行渲染,分页等内容。那么就存在一个通用的GetData方法,这些方法就由抽象插件来进行实现,并让派生类进行实现。那么我们查询通版报表,就可以直接调用BOS的查询代码,触发业务过滤方案,等内容。


代码示例


                 
            //获取基本元数据信息
            var filterMetadata = FormMetaDataCache.GetCachedFilterMetaData(this.Context);
            var reportMetadata = FormMetaDataCache.GetCachedFormMetaData(this.Context, "报表FormId");
            var reportFilterMetadata = FormMetaDataCache.GetCachedFormMetaData(this.Context, "报表过滤方案FormId");
            //获取报表过滤方案的构建基础,便于后续模型构建
            var reportFilterServiceProvider = reportFilterMetadata.BusinessInfo.GetForm().GetFormServiceProvider();
            var model = new SysReportFilterModel();
            model.SetContext(this.Context, reportFilterMetadata.BusinessInfo, reportFilterServiceProvider);
            model.FormId = reportFilterMetadata.BusinessInfo.GetForm().Id;
            model.FilterObject.FilterMetaData = filterMetadata;
            model.InitFieldList(reportMetadata, reportFilterMetadata);
            model.GetSchemeList();
            //获取过滤方案,可以通过LoadScheme("Id"),查询报表默认存在的一些过滤方案
            model.LoadDefaultScheme();
            var filter = model.GetFilterParameter();
            var det = reportFilterMetadata.BusinessInfo.GetDynamicObjectType();

            //这里填写普通过滤方案,填充实体信息
            DynamicObject filterObj = filter.CustomFilter;
            filterObj["StockOrgId"] = qpovOrgId;
            filterObj["BeginDate"] = qpovDate;
            filterObj["EndDate"] = qpovDate;
            filterObj["BeginStockId_Id"] = qpovStockId;
            filterObj["BeginStockId"] = qpovStock;
            filterObj["EndStockId_Id"] = qpovStockId;
            filterObj["EndStockId"] = qpovStock;
            //这里填写高级过滤方案,拼个物料
            filter.FilterString.JoinFilterString(" FMaterialId IN ({0})", string.Join(",", materialSeq.Keys.Distinct().ToArray()));
            //报表参数
            IRptParams p = new RptParams();
            p.FormId = reportFilterMetadata.BusinessInfo.GetForm().Id;
            p.StartRow = 1;
            p.EndRow = int.MaxValue;
            p.FilterParameter = filter;
            p.FilterFieldInfo = model.FilterFieldInfo;
            p.CustomParams = new Dictionary<string, object>();
            p.CustomParams.Add("OpenParameter", "");
            //报表服务参数,用于查询。
            var reportServiceParam = new ReportServiceParameter();
            reportServiceParam.RptFilterParams = p;
            reportServiceParam.Context = this.Context;
            reportServiceParam.PageId = Guid.NewGuid().ToString();
            reportServiceParam.BusinessInfo = reportMetadata.BusinessInfo;
            //调用服务、查询报表,resutl.DataSource就是我们需要的DatTable了
            var result = SysReportServiceHelper.GetReportData(reportServiceParam);


图标赞 18
18人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!