二开-通过报表引擎获取系统标准报表数据原创
金蝶云社区-海Tony
海Tony
7人赞赏了该文章 616次浏览 未经作者许可,禁止转载编辑于2023年10月09日 15:26:44

        在平时项目的客户化开发过程中,经常会遇到需要取系统标准报表的成本数据,然后结合新开发报表计算对应的成本字段数据的需求。这可能就需要将标准系统报表数据查询出来后存档落地。我们以需要取《销售订单成本跟踪表》的成本项目(如直接材料、间接材料、直接人工、间接人工等)对应的累计完工金额为例,来计算二开报表的产品生产成本合计金额。

        第一步先取到标准报表《销售订单成本跟踪表》的数据,这里需要先设置一个默认的过滤方案如下图,其中核算组织、截止会计年度、截止会计期间这几个查询参数是动态的,后面通过动态表单让用户选择【下一篇文章:《系统标准报表数据存档落地》中继续介绍】。

1696834753019.png

1)根据过滤方案名称先查询出过滤方案Id:select FSCHEMEID from T_BAS_FILTERSCHEME_L where FDESCRIPTION = N'销售订单成本跟踪表存档专用过滤方案'

2)下面是我针对报表数据源参数接口的扩展方法:

    public static class IRptParamsExtension
    {
        public static IRptParams CreateFromSysReportFilterScheme(this IRptParams rpt, Context ctx, FormMetadata reportMetadata, Func<ICommonFilterModelService, string> schemeSelector)
        {
            //字段比较条件元数据。
            var filterMetadata = FormMetaDataCache.GetCachedFilterMetaData(ctx);

            //账表元数据。
            var reportFormId = reportMetadata.BusinessInfo.GetForm().Id;

            //过滤条件元数据。
            var reportFilterFormId = reportMetadata.BusinessInfo.GetForm().FilterObject;
            var reportFilterMetadata = FormMetaDataCache.GetCachedFormMetaData(ctx, reportFilterFormId);
            var reportFilterServiceProvider = reportFilterMetadata.BusinessInfo.GetForm().GetFormServiceProvider();

            //过滤方案元数据。
            var schemeFormId = FormIdConst.BOS_FilterScheme;
            var schemeMetadata = FormMetaDataCache.GetCachedFormMetaData(ctx, schemeFormId);

            //用户参数元数据。
            var parameterDataFormId = reportMetadata.BusinessInfo.GetForm().ParameterObjectId;
            var parameterDataMetadata = FormMetaDataCache.GetCachedFormMetaData(ctx, parameterDataFormId);

            var model = new SysReportFilterModel();
            model.SetContext(ctx, reportFilterMetadata.BusinessInfo, reportFilterServiceProvider);
            model.FormId = reportFilterFormId;
            model.FilterObject.FilterMetaData = filterMetadata;
            model.InitFieldList(reportMetadata, reportFilterMetadata);
            model.GetSchemeList();

            //方案加载,返回选中的过滤方案主键。
            schemeSelector = schemeSelector != null ? schemeSelector : s => { model.LoadDefaultScheme(); return string.Empty; };
            var schemeId = schemeSelector(model);

            //打开参数,暂时不指定任何项。
            var openParameter = new Dictionary<string, object>();

            //如果指定了过滤方案,则根据过滤方案查找创建用户。
            long userId = -1L;
            if (!string.IsNullOrWhiteSpace(schemeId))
            {
                var schemeBusinessInfo = schemeMetadata.BusinessInfo.GetSubBusinessInfo(new List<string> { "FUserID" });
                userId = BusinessDataServiceHelper.LoadSingle(ctx, schemeId, schemeBusinessInfo.GetDynamicObjectType())
                    .GetPropertyValue<long>(schemeBusinessInfo.GetField("FUserID").PropertyName);
            }//end if

            //加载用户参数数据包。
            var parameterData = UserParamterServiceHelper.Load(ctx, parameterDataMetadata.BusinessInfo, userId, reportFormId, KeyConst.USERPARAMETER_KEY);

            IRptParams p = new RptParams();
            p.CustomParams.Add(KeyConst.OPENPARAMETER_KEY, openParameter);
            p.FormId = reportFilterFormId;
            p.StartRow = 1;
            p.EndRow = int.MaxValue;//StartRow和EndRow是报表数据分页的起始行数和截至行数,一般取所有数据,所以EndRow取int最大值。
            p.FilterParameter = model.GetFilterParameter();
            p.FilterFieldInfo = model.FilterFieldInfo;
            p.BaseDataTempTable.AddRange(PermissionServiceHelper.GetBaseDataTempTable(ctx, reportFormId));
            p.ParameterData = parameterData;

            return p;
        }

        public static IRptParams CreateFromSysReportFilterScheme(this IRptParams rpt, Context ctx, FormMetadata reportMetadata, string schemeId)
        {
            return CreateFromSysReportFilterScheme(rpt, ctx, reportMetadata, service => { service.Load(schemeId); return schemeId; });
        }

        public static IRptParams CreateFromSysReportFilterScheme(this IRptParams rpt, Context ctx, FormMetadata reportMetadata)
        {
            return CreateFromSysReportFilterScheme(rpt, ctx, reportMetadata, service => { service.LoadDefaultScheme(); return string.Empty; });
        }
    }


3)获取系统标准报表数据:

            ISysReportService sysReportService = ServiceFactory.GetSysReportService(ctx);

            string formId = "CB_OrderCostTrack";
            var reportMetadata = FormMetaDataCache.GetCachedFormMetaData(ctx, formId);
            IRptParams p = new RptParams();

            string schemeId = KDConfiguration.Current.GetAppSettingItemValue("CB_OrderCostTrack_CD_SCHEMEID");

            if (string.IsNullOrWhiteSpace(schemeId))
            {
                throw new KDException("OrderCostTrackService_Schedule", "销售订单成本跟踪表不存在专用的过滤方案,请联系相关人员设置!");
            }
            p = p.CreateFromSysReportFilterScheme(ctx, reportMetadata, schemeId);
          
            //分页大小
            int pageSize = 90000000;         

            p.StartRow = 1;
            p.EndRow = pageSize;

           

             using (DataTable dt = sysReportService.GetData(ctx, reportMetadata.BusinessInfo, p))
             {

                 //针对获取的标准报表数据dt做后续的处理……

             }

赞 7