/// <summary> /// Рисует колонки таблицы лэйаута /// </summary> /// <remarks>Переопределяем стандартный метод</remarks> protected override void WriteColumns(tablelayoutClass LayoutProfile, ReportLayoutData LayoutData, DataTable oTable, TableLayout.LayoutColumns Columns) { base.WriteColumns(LayoutProfile, LayoutData, oTable, Columns); // создаем копию существующих столбцов // для накопления общих итогов только по помеченным строкам m_TotalColumns = cloneLayoutColumns(Columns); }
/// <summary> /// Формирует визуальное представление отчета на основании описания /// </summary> /// <param name="LayoutProfile">xml-профиль лэйаута</param> /// <param name="LayoutData">параметры</param> /// <remarks>Переопределяем стандартный метод</remarks> protected override void DoMake(abstractlayoutClass LayoutProfile, ReportLayoutData LayoutData) { base.DoMake(LayoutProfile, LayoutData); // очищаем столбцы итогов m_TotalColumns = null; }
/// <summary> /// Проверяет, нужно ли выводить дополнительный столбец /// и выводит его в случае необходимости /// </summary> /// <param name="LayoutProfile">профиль отчета</param> /// <param name="RepGen">репорт-райтер</param> /// <param name="Columns">описание колонок лэйаута</param> /// <param name="Params">параметры</param> /// <param name="CustomData">пользовательские данные</param> /// <param name="Vars">переменные фрагмента отчета</param> /// <param name="oDataColumn">дополнительный столбец, который нужно вывести</param> /// <param name="HiddenColumns">скрытые столбцы</param> /// <param name="FormattersNode">форматтеры для лэйаута по умолчанию</param> private void writeVarColumn(tablelayoutClass LayoutProfile, ReportLayoutData LayoutData, TableLayout.LayoutColumns Columns, DataColumn oDataColumn, string HiddenColumns, abstractformatterClass[] FormattersNode) { // нас интересуют только столбцы с названиями вида Expenses_yyyyMMdd // остальные столбцы пропускаем if (oDataColumn.ColumnName.IndexOf("Expenses_") < 0) { return; } colClass ColNode = new colClass(); ColNode.aggregationfunction = aggregationfunctiontype.sum; ColNode.aggregationfunctionSpecified = true; ColNode.data = "{#" + oDataColumn.ColumnName + "}"; ColNode.t = DateTime.ParseExact(oDataColumn.ColumnName.Substring(9), "yyyyMMdd", null).ToShortDateString(); // пропишем форматтеры emptyvalueevaluatorClass formatter1 = new emptyvalueevaluatorClass(); formatter1.value = "0"; durationevaluatorClass formatter2 = new durationevaluatorClass(); formatter2.format = "{@TimeMeasureUnits}"; formatter2.workdayDuration = "{#WorkdayDuration}"; ColNode.formatters = new abstractformatterClass[] { formatter1, formatter2 }; InsertColumn(ColNode, null, LayoutProfile, LayoutData, Columns, HiddenColumns, FormattersNode); }
/// <summary> /// Рисует колонки таблицы лэйаута /// </summary> /// <param name="LayoutProfile">профиль отчета</param> /// <param name="RepGen">репорт-райтер</param> /// <param name="oTable">ридер с данными</param> /// <param name="Columns">описание колонок лэйаута</param> /// <param name="Params">параметры</param> /// <param name="CustomData">пользовательские данные</param> /// <param name="Vars">переменные фрагмента отчета</param> protected override void WriteColumns(tablelayoutClass LayoutProfile, ReportLayoutData LayoutData, DataTable oTable, TableLayout.LayoutColumns Columns) { // строка с номерами скрытых колонок string HiddenColumns = string.Empty; if (LayoutProfile.hiddencolumnsparamname != null && LayoutProfile.hiddencolumnsparamname != "") { HiddenColumns = LayoutData.Params[LayoutProfile.hiddencolumnsparamname].ToString(); } // приписываем с начала и с конца строки запятые для облегчения последующего поиска if (!HiddenColumns.StartsWith(",")) { HiddenColumns = "," + HiddenColumns; } if (!HiddenColumns.EndsWith(",")) { HiddenColumns += ","; } // xml-узел с профилями дефолтных для лэйаута эвалуаторов/форматтеров abstractformatterClass[] FormattersNode = LayoutProfile.formatters; if (LayoutProfile.col == null) { // если в профиле явно не описаны колонки отчета for (int i = 0; i < oTable.Columns.Count; i++) { // добавляем колонку в коллекцию Columns.Add(new LayoutColumn("{#" + oTable.Columns[i].ColumnName + "}", FormattersNode)); // добавлем колонку в отчет LayoutData.RepGen.TAddColumn(oTable.Columns[i].ColumnName, align.ALIGN_CENTER, valign.VALIGN_MIDDLE, "TABLE_HEADER"); } } else { // добавляем явно описанные колонки foreach (colClass ColNode in LayoutProfile.col) { // рекурсивно добавляем колонки InsertColumn(ColNode, null, LayoutProfile, LayoutData, Columns, HiddenColumns, FormattersNode); //InsertColumn(ColNode, null, LayoutProfile, RepGen, Columns, Params, HiddenColumns, FormattersNode, CustomData, Vars); } // добавляем неявно описанные колонки foreach (DataColumn oDataColumn in oTable.Columns) { writeVarColumn(LayoutProfile, LayoutData, Columns, oDataColumn, HiddenColumns, FormattersNode); } } // создаем копию существующих столбцов // для накопления общих итогов только по помеченным строкам m_TotalColumns = cloneLayoutColumns(Columns); }
/// <summary> /// Рисует строку подведения итогов. Это может быть как строка с общими итогами, так и с промежуточными /// </summary> /// <remarks>Переопределяем стандартный метод</remarks> protected override void WriteTotalRow(tablelayoutClass LayoutProfile, ReportLayoutData LayoutData, TableLayout.LayoutColumns Columns, int CurrentRowNum, int CurrentColumnNum, bool SubTotals, DataTable oTable, int[] ColumnsRowspan, int nGroupedCellsCount, DataRow PreviousRow) { if (SubTotals) { // если мы выводим подитоги, то просто вызываем базовый метод base.WriteTotalRow(LayoutProfile, LayoutData, Columns, CurrentRowNum, CurrentColumnNum, SubTotals, oTable, ColumnsRowspan, nGroupedCellsCount, PreviousRow); } else { // если мы выводим общие итоги, то вызываем базовый метод, но // передаем ему столбцы для накопления итогов только по помеченным строкам base.WriteTotalRow(LayoutProfile, LayoutData, TotalColumns, CurrentRowNum, CurrentColumnNum, SubTotals, oTable, ColumnsRowspan, nGroupedCellsCount, PreviousRow); } }
/// <summary> /// Построение отчета /// </summary> /// <param name="data">Контекст</param> protected override void buildReport(ReportLayoutData data) { XslFOProfileWriter foWriter = data.RepGen; ThisReportParams ps = new ThisReportParams(data.Params); ps.FolderName = data.DataProvider.GetValue("Header", null) as string; OverallData report = null; // получим данные using (IDataReader reader = data.DataProvider.GetDataReader("Main", null)) { if (reader.Read()) { IOverallDeserializer deserializer = new OverallDeserializer( new DepartmentDataDeserializer( new DepartmentDetailDataDeserializer() ) ); report = deserializer.Deserialize(new DataReaderWrapper(reader)); } else { report = new OverallData(new List <DepartmentData>()); } } // сконфигурируем компонент, отвечающий за формирование отчета IReportWriter writer = new ReportWriter( ps.ShowRestrictions ? new WithParamsHeaderWriter(ps) as IHeaderWriter : new SimpleHeaderWriter() as IHeaderWriter, new BodyWriter( new BaseDataWriter( new SimpleIntIndexGenerator(1, 1), ps.TimeMeasureUnits == TimeMeasureUnits.Days ? new DHMCostsFormatter() as ICostsFormatter : new HourCostsFormatter() as ICostsFormatter ), report, ps.ShowDetalization ? new DetailReportSerializer() as IReportSerializer : new MainReportSerializer() as IReportSerializer ) ) as IReportWriter; writer.Write(foWriter); }
/// <summary> /// Построение отчета /// </summary> /// <param name="data">Контекст</param> protected override void buildReport(ReportLayoutData data) { XslFOProfileWriter foWriter = data.RepGen; ThisReportParams ps = new ThisReportParams(data.Params); string name = data.DataProvider.GetValue("Header", null) as string; List <BaseData> report = null; // получим данные using (IDataReader reader = data.DataProvider.GetDataReader("Main", null)) { if (reader.Read()) { IDataDeserializer deserializer = new DataDeserializer( new SnapDataDeserializer(), new StatusDataDeserializer() ); report = new List <BaseData>(deserializer.Deserialize(new DataReaderWrapper(reader))); } else { report = new List <BaseData>(); } } // сконфигурируем компонент, отвечающий за формирование отчета IReportWriter writer = new ReportWriter( new HeaderWriter(name), new BodyWriter( new BaseDataWriter( new SimpleIntIndexGenerator(1, 1)), report, new ReportSerializer() ) ) as IReportWriter; writer.Write(foWriter); }
// Метод, формирующий отчет; вызывается подсистемой ReportService protected override void buildReport(ReportLayoutData reportData) { //Инициализируем фин. данные по проекту из БД InitializeFinanceData(reportData); //Расчитаем остальные фин показатели CalcProjectFinanceData(); //Непосредственно построение отчета reportData.RepGen.WriteLayoutMaster(); reportData.RepGen.StartPageSequence(); reportData.RepGen.StartPageBody(); reportData.RepGen.Header(xmlEncode("Финансовый план по проекту (БДДС)")); //Формируем и выводим подзаголовок StringBuilder sbBlock = new StringBuilder(); sbBlock.Append(_GetParamValueAsFoBlock("Контракт", FinanceData.Contract["Name"].ToString())); sbBlock.Append(_GetParamValueAsFoBlock("Сумма контракта", _FormatMoney(FinanceData.ContractSum))); reportData.RepGen.AddSubHeader(_MakeSubHeader(sbBlock)); //Отрисовка основного тела отчета if (bIsBudgetBindedReport) { writeBudgetBindedReport(reportData.RepGen); } else { writeSupplierBindedReport(reportData.RepGen); } reportData.RepGen.EndPageBody(); reportData.RepGen.EndPageSequence(); //Освободим ресурсы FinanceData.Dispose(); }
/// <summary> /// Инициализация финансовых данных по проекту из БД /// </summary> /// <param name="reportData">Параметры отчета</param> protected override void InitializeFinanceData(ReportLayoutData reportData) { FinanceData = new ProjectFinanceData(); //определяем необходимость привязки к статьям бюджета bIsBudgetBindedReport = (int)reportData.Params.GetParam("IsBudgetBinded").Value == 1; //Данные контракта using (IDataReader reader = reportData.DataProvider.GetDataReader("ContractInfoDS", reportData.CustomData)) { if (reader.Read()) { FinanceData.Contract = (HybridDictionary)_GetDataFromDataRow(reader); } if (null != FinanceData.Contract) { FinanceData.ContractSum = Utils.ParseDBString(FinanceData.Contract["ContractSum"].ToString()); } } //Данные по временному масштабу using (IDataReader reader = reportData.DataProvider.GetDataReader("IntervalSaldoDS", reportData.CustomData)) { if (reader.Read()) { FinanceData.DateRatio = (HybridDictionary)_GetDataFromDataRow(reader); } } //Данные по интервалам using (IDataReader reader = reportData.DataProvider.GetDataReader("DateRatioIntervalsDS", reportData.CustomData)) { FinanceData.DateIntervals = _GetDataAsArrayList(reader); //Сразу инициализируем массив "Сальдо по временным интервалам" if (null != FinanceData.DateIntervals) { foreach (IDictionary interval in FinanceData.DateIntervals) { if (true != FinanceData.IntervalSaldo?.Contains(interval["ObjectID"])) { FinanceData.IntervalSaldo?.Add(interval["ObjectID"], new double()); } } } } //Бюджет проекта if (bIsBudgetBindedReport) { using (IDataReader reader = reportData.DataProvider.GetDataReader("ProjectBudgetForBDDSReportDS", reportData.CustomData)) { FinanceData.Budget = _GetDataAsArrayList(reader); //Сразу инициализируем массив if (null != FinanceData.Budget) { foreach (IDictionary BudgetOut in FinanceData.Budget) { if (!FinanceData.BudgetOutOutcomeSum.Contains(BudgetOut["BudgetOutID"])) { FinanceData.BudgetOutOutcomeSum.Add(BudgetOut["BudgetOutID"], new double()); } if (!FinanceData.BudgetBalance.Contains(BudgetOut["BudgetOutID"])) { FinanceData.BudgetBalance.Add(BudgetOut["BudgetOutID"], new double()); } } } } } //Данные по приходам проекта using (IDataReader reader = reportData.DataProvider.GetDataReader("ProjectIncomesForBDDSReportDS", reportData.CustomData)) { FinanceData.Incomes = _GetDataAsArrayList(reader); } //Данные по расходам проекта //В зависимости от необходимости привязки к бюджету или контрагентам используем соответствующий источник данных if (bIsBudgetBindedReport) { using (IDataReader reader = reportData.DataProvider.GetDataReader("ProjectBudgetBindedOutcomesForBDDSReportDS", reportData.CustomData)) { FinanceData.Outcomes = _GetDataAsArrayList(reader); } //Расходы на начало периода using (IDataReader reader = reportData.DataProvider.GetDataReader("ProjectBudgetBindedOutcomesBeforeForBDDSReportDS", reportData.CustomData)) { FinanceData.OutcomesBefore = _GetDataAsArrayList(reader); //Сразу инициализируем массив if (null != FinanceData.Budget) { foreach (IDictionary BudgetOut in FinanceData.Budget) { if (!FinanceData.OutcomesAfter.Contains(BudgetOut["BudgetOutID"])) { FinanceData.OutcomesAfter.Add(BudgetOut["BudgetOutID"], new double()); } } } } //Суммарные расходы по каждому временному интервалу using (IDataReader reader = reportData.DataProvider.GetDataReader("ProjectTotalBudgetBindedOutcomesForBDDSReportDS", reportData.CustomData)) { FinanceData.IntervalOutcomes = _GetDataAsArrayList(reader); } } else { using (IDataReader reader = reportData.DataProvider.GetDataReader("ProjectSupplierBindedOutcomesForBDDSReportDS", reportData.CustomData)) { FinanceData.Outcomes = _GetDataAsArrayList(reader); } //Расходы на начало периода using (IDataReader reader = reportData.DataProvider.GetDataReader("ProjectSupplierBindedOutcomesBeforeForBDDSReportDS", reportData.CustomData)) { FinanceData.OutcomesBefore = _GetDataAsArrayList(reader); } //Суммарные расходы по каждому временному интервалу using (IDataReader reader = reportData.DataProvider.GetDataReader("ProjectTotalSupplierBindedOutcomesForBDDSReportDS", reportData.CustomData)) { FinanceData.IntervalOutcomes = _GetDataAsArrayList(reader); } } }
// Закомментил старое /*protected override void WriteColumns(tablelayoutClass LayoutProfile, XslFOProfileWriter RepGen, DataTable oTable, LayoutColumns Columns, ReportParams Params, object CustomData, IDictionary Vars) * { * base.WriteColumns(LayoutProfile, RepGen, oTable, Columns, Params, CustomData, Vars); * * // создаем копию существующих столбцов * // для накопления общих итогов только по помеченным строкам * m_TotalColumns = cloneLayoutColumns(Columns); * } */ /// <summary> /// Вычисляет данные ячейки таблицы лэйаута /// </summary> /// <remarks>Переопределяем стандартный метод</remarks> protected override ReportFormatterData CalculateCellValue(ReportLayoutData LayoutData, TableLayout.LayoutColumns Columns, int RowNum, int ColumnNum, DataRow CurrentRow, int RowSpan) { // значение в ячейке object CurrentValue = null; // получаем объект, с которым работают форматтеры и эвалуаторы ReportFormatterData FormatterData = new ReportFormatterData( LayoutData, CurrentValue, null, CurrentRow, RowNum, ColumnNum); if (string.Empty == Columns[ColumnNum].RSFileldName) // если текущее значение не соответсвует никакой колонке рекордсета { if (Columns[ColumnNum].ColumnIsCounter) // если колонка - счетчик { // текущее значение счетчика CurrentValue = Columns[ColumnNum].CounterCurrent.ToString(); // инкрементируем счетчик Columns[ColumnNum].IncrementCounter(); } else // null иначе { CurrentValue = null; } } else // значение { CurrentValue = new Croc.XmlFramework.ReportService.Utility.MacroProcessor(FormatterData).Process(Columns[ColumnNum].RSFileldName); } // Encoding if (Columns[ColumnNum].Encoding == encodingtype.text) { CurrentValue = System.Web.HttpUtility.HtmlEncode(CurrentValue.ToString()); } FormatterData.CurrentValue = CurrentValue; // проходим по эвалуаторам и форматтерам if (Columns[ColumnNum].Formatters != null) { foreach (abstractformatterClass FormatterNode in Columns[ColumnNum].Formatters) { if (!FormatterNode.useSpecified || FormatterNode.use != usetype.totalcell) { // просим объект у фабрики IReportFormatter Formatter = (IReportFormatter)ReportObjectFactory.GetInstance(FormatterNode.GetAssembly(), FormatterNode.GetClass()); // делаем что-то Formatter.Execute(FormatterNode, FormatterData); } } } if (string.Empty != Columns[ColumnNum].AggregationFunction) { Columns[ColumnNum].UpdateTotals(CurrentValue); // проапдейтим итоги по помеченным строкам bool bNoTotals; try { // берем из строки рекорсета столбец NoTotals bNoTotals = Convert.ToBoolean(CurrentRow[NOTOTALS_COLUMN_NAME]); } catch (Exception) { // если, что-то пошло не так, считаем, что нужно // пересчитывать итоги (как обычно) bNoTotals = false; } // пересчитаем итоги, если нужно if (!bNoTotals) { TotalColumns[ColumnNum].UpdateTotals(CurrentValue); } } if (FormatterData.ClassName == null || FormatterData.ClassName == string.Empty) { FormatterData.ClassName = Columns[ColumnNum].CellCssClass; } return(FormatterData); }