Пример #1
0
        private IEpsReportConfig[] CreateReportConfigs(IMacroProcessor macroProcessor, EpsOutput output,
                                                       ISession session)
        {
            var reportParams =
                output.Output_EpsOutputParam_List.Where(i => i.OutputParamType == EpsParamTypes.REP).ToArray();
            var reports = reportParams.Where(i => i.OutputParamCode == EpsTaskParameterTypes.EpsReport).ToArray();
            var res     = new List <IEpsReportConfig>();

            foreach (var report in reports)
            {
                var reportName = report.OutputParamValue;
                // проверяем не задали ли один отчет несколько раз
                if (res.Any(i => i.ReportName == reportName))
                {
                    throw new Exception(
                              string.Format(
                                  "Report {0} in output {1} was configured more than once. Please, check the settings.",
                                  report.OutputParamValue, output.OutputID));
                }

                // вычленяем параметры
                var currentReportParams = reportParams.Where(i => i.OutputParamSubValue == reportName).ToArray();

                // заполняем макросы
                var childMacroProcessor = macroProcessor.GetChildProcessor();
                foreach (
                    var taskParam in
                    currentReportParams.Where(i => !EpsTaskParameterTypes.IsKnownParameter(i.OutputParamCode)))
                {
                    childMacroProcessor.Add(taskParam.OutputParamCode, taskParam.OutputParamValue);
                }
                // безусловно добавляем пользователя
                childMacroProcessor.Add(EpsReportParameterTypes.UserCode, output.Login_r);

                var reportConfig = CreateReportConfig(output, childMacroProcessor, report, currentReportParams, session);
                res.Add(reportConfig);
            }
            return(res.ToArray());
        }
Пример #2
0
        private IEpsReportConfig CreateReportConfig(EpsOutput output, IMacroProcessor macroProcessor,
                                                    EpsOutputParam report, EpsOutputParam[] reportParams, ISession session)
        {
            var res = new EpsReportConfig();

            // добавляем параметры этого отчета
            res.Parameters = reportParams
                             .Where(p => !EpsTaskParameterTypes.IsKnownParameter(p.OutputParamCode))
                             .ToDictionary(i => i.OutputParamCode, i => macroProcessor.Process(i.OutputParamValue));
            // добавляем в отчет обязательный параметр UserCode
            res.Parameters.Add(EpsReportParameterTypes.UserCode, output.Login_r);

            // определяем имя файла отчета (оно же subvalue для параметров)
            res.ReportName = macroProcessor.Process(report.OutputParamValue);
            if (string.IsNullOrEmpty(res.ReportName))
            {
                throw new Exception(string.Format("Empty report file name in output {0}. Check the settings.",
                                                  output.OutputID));
            }

            //TODO: Нужно бы переделать алгоритм определения кода отчета. Фиг знает почему так.
            res.ReportCode = Path.GetFileNameWithoutExtension(res.ReportName);

            macroProcessor.AddOrReplace("SQL", macroString => ProcessSqlMacro(macroString, session, reportParams));

            //определяем имя выгрузки отчета (итоговое имя)
            var resultReportFile = GetParamValue(reportParams, macroProcessor, EpsTaskParameterTypes.ResultReportFile,
                                                 res.ReportName);

            // если ничего не задано - то берем имя файла отчета
            // иначе вычисляем результируещее имя с учетом макросов
            res.ReportResultFileName = IsNullOrEmptyAfterTrim(resultReportFile)
                ? res.ReportName
                : resultReportFile;
            //    : ProcessReportFileName(session, resultReportFile, reportParams);

            //получаем параметр типа EpsTaskParams.ChangeODBC. 0 - строку переопределять (переопределяет все подключения в отчете), 1 - строку не переопределять.
            var changeOdbcStr = GetParamValue(reportParams, macroProcessor, EpsTaskParameterTypes.ChangeODBC,
                                              res.ReportName);

            res.ConnectionString = changeOdbcStr == "1" ? null : EpsConfig.OdbcConnectionString;

            //получим пользовательский параметр ReportUseODAC
            //var wmsReport = session.Get<WmsReport>(res.ReportCode);
            //var reportUseOdac = wmsReport.CPV_List.FirstOrDefault(i => i.CustomParam.CustomParamCode == WmsReportCPV.ReportUseODACParameter);
            //TODO: исправить на вариант выше (когда Виталик починит метаданные)
            var reportUseOdac = session
                                .Query <WmsReportCPV>()
                                .Any(
                i =>
                i.CustomParam.CustomParamCode == WmsReportCPV.ReportUseODACParameter &&
                i.REPORT.Report == res.ReportCode && i.CPVValue == "1");

            //параметр ReportUseODAC в приоритете
            if (reportUseOdac)
            {
                res.ConnectionString = EpsConfig.OdacConnectionString;
            }

            //вычисляем полное имя к файлу отчета
            res.ReportFullFileName = (output.ReportFileSubFolder_r != null)
                ? Path.Combine(EpsConfig.ReportPath, output.ReportFileSubFolder_r, res.ReportName)
                : Path.Combine(EpsConfig.ReportPath, res.ReportName);

            return(res);
        }