插件案例 —— 换个思维查系统报表原创
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人打赏
还没有人打赏,快来当第一个打赏的人吧!
推荐阅读