在平时项目的客户化开发过程中,经常会遇到需要取系统标准报表的成本数据,然后结合新开发报表计算对应的成本字段数据的需求。这可能就需要将标准系统报表数据查询出来后存档落地。我们以需要取《销售订单成本跟踪表》的成本项目(如直接材料、间接材料、直接人工、间接人工等)对应的累计完工金额为例,来计算二开报表的产品生产成本合计金额。
第一步先取到标准报表《销售订单成本跟踪表》的数据,这里需要先设置一个默认的过滤方案如下图,其中核算组织、截止会计年度、截止会计期间这几个查询参数是动态的,后面通过动态表单让用户选择【下一篇文章:《系统标准报表数据存档落地》中继续介绍】。
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做后续的处理……
}
推荐阅读