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()); }
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); }