物料供需汇总/明细数据二次加工办法

栏目:云星空知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:4

物料供需汇总/明细数据二次加工办法

问题描述:

在实际业务场景中,因用户分析数据角度的差异,有些需求并非只是对报表增加字段就能满足,而是需要对标准的物料供需汇总/明细表展示数据进行二次加工,这时就需要获取标准的物料供需汇总/明细表数据,以便进行再加工后展示。

解决方案:


本贴以二开的角度说明如何拿到物料供需汇总/明细数据,以下示例代码是执行计划插件代码,实际上只需要BOS上下文(Context)即可,因此,以下代码同样可以移植到表单/列表,或操作等各类插件上。


using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data;

using Kingdee.BOS;

using Kingdee.BOS.Util;

using Kingdee.BOS.Core;

using Kingdee.BOS.Orm;

using Kingdee.BOS.Contracts;

using Kingdee.BOS.Orm.DataEntity;

using Kingdee.BOS.App.Data;

using Kingdee.BOS.Core.Report;

using Kingdee.BOS.ServiceHelper;

using Kingdee.BOS.Model.ReportFilter;

using Kingdee.K3.Core.MFG.Common;

using Kingdee.K3.MFG.App;

using Kingdee.K3.MFG.Contracts.PLN;


namespace ABC.XX.K3Cloud.WebApi.ServicePlugIn

{

    public class MtrlDSDataCollect_Schedule : IScheduleService

    {

        public void Run(Context ctx, Schedule schedule)

        {

            string computeNo = string.Empty;

            try

            {

                string rptFormId = "PLN_MtrlSupplyDemandRpt"; //查询的目标报表标识

                string rptFilterFormId = "PLN_MtrlSupplyDemandFilter"; //报表对应的过滤界面标识

                string rptFilterSchemeId = string.Empty; //过滤方案ID,没传则为默认方案


                //获取相关元数据

                var comFilterMetadata = FormMetaDataCache.GetCachedFilterMetaData(ctx);

                var rptMetadata = FormMetaDataCache.GetCachedFormMetaData(ctx, rptFormId);

                var rptFilterMetadata = FormMetaDataCache.GetCachedFormMetaData(ctx, rptFilterFormId);

                //获取报表过滤方案的构建基础,便于后续模型构建

                var rptFilterServiceProvider = rptFilterMetadata .BusinessInfo.GetForm().GetFormServiceProvider();

                var rptModel = new SysReportFilterModel();

                rptModel.SetContext(ctx, rptFilterMetadata.BusinessInfo, rptFilterServiceProvider);

                rptModel.FormId = rptFilterMetadata.BusinessInfo.GetForm().Id;

                rptModel.FilterObject.FilterMetaData = comFilterMetadata;

                rptModel.InitFieldList(rptMetadata, rptFilterMetadata);

                rptModel.GetSchemeList();

                //IsNullOrEmptyOrWhiteSpace()方法须using Kingdee.BOS.Util;

                if (rptFilterSchemeId.IsNullOrEmptyOrWhiteSpace())

                {

                    rptModel.LoadDefaultScheme();//加载默认过滤方案

                }

                else

                {

                    rptModel.Load(rptFilterSchemeId);

                }

                var filterPara = rptModel.GetFilterParameter();

                //获取最近一次成功的,非计划模拟运算的MRP运算标识和编号

                DynamicObject filterObj = filterPara.CustomFilter;

                string sql = string.Format(@" SELECT TOP 1 A.FCOMPUTEID, A.FNUMBER 

FROM T_PLN_MRPLOG A WHERE A.FSTATUS='3' AND A.FISSIMUMRP='0' 

ORDER BY A.FCREATEDATE DESC ");

                DynamicObject mrpCalInfo = DBUtils.ExecuteDynamicObject(ctx, sql).FirstOrDefault();

                if(mrpCalInfo.IsNullOrEmpty()) return; 


                string computeId = mrpCalInfo["FCOMPUTEID"].ToString(); //运算ID

                computeNo = mrpCalInfo["FNUMBER"].ToString(); //运算编码

                filterObj["MrpBillNo"] = computeNo;

                filterObj["ComputeId"] = computeId;


                #region 本代码块是检测物料供需数据是否已收集,未收集则进行收集

                //对应物料供需数据的收集,可参照相关帖子:https://vip-admin.kingdee.com/questions/331715096760317952/answers/331715096760317952

                IMtrlDSDataSumCalcService rptService = AppServiceContext.GetService<IMtrlDSDataSumCalcService>();

                bool isReady = rptService.CheckMtrlDSDataByComputeId(ctx, computeId);

                if (!isReady)

                {

                    OperateOption option = OperateOption.Create();

                    option.SetVariableValue("ComputeId", computeId);

                    TaskProxyItem tpi = new TaskProxyItem();

                    option.SetVariableValue("TaskId", tpi.TaskId);

                    rptService.Execute(ctx, option);

                }

                #endregion 本代码块是检测物料供需数据是否已收集,未收集则进行收集


                //报表参数

                IRptParams param = new RptParams();

                param.FormId = rptFilterMetadata.BusinessInfo.GetForm().Id;

                param.StartRow = 1;

                param.EndRow = int.MaxValue;

                param.FilterParameter = filterPara;

                param.FilterFieldInfo = rptModel.FilterFieldInfo;

                param.CustomParams = new Dictionary<string, object>();

                param.CustomParams.Add("OpenParameter", new Dictionary<string, object>());


                //报表服务参数,用于查询。

                var reportServiceParam = new ReportServiceParameter();

                reportServiceParam.RptFilterParams = param;

                reportServiceParam.Context = ctx;

                reportServiceParam.PageId = Guid.NewGuid().ToString();

                reportServiceParam.BusinessInfo = rptMetadata.BusinessInfo;

                //下一句的resutl.DataSource报表数据的DataTable,物理表名是resutl.DataSource.TableName,可将期数据转储到特定表进行二次加工

                var result = SysReportServiceHelper.GetReportData(reportServiceParam);

            }

            catch (Exception ex)

            {

                Kingdee.BOS.Log.Logger.Info("ABC.XX.PLN", string.Format("物料供需数据抓取失败。{0},{1}\t\n{2}",  computeNo, ex.Message, ex.StackTrace));

            }

        }

    }

}


物料供需汇总/明细数据二次加工办法

问题描述:在实际业务场景中,因用户分析数据角度的差异,有些需求并非只是对报表增加字段就能满足,而是需要对标准的物料供需汇总/明细表...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息