/// <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> /// <remarks>Переопределяем стандартный метод</remarks> protected override void WriteTotalRow(tablelayoutClass LayoutProfile, Croc.XmlFramework.ReportService.Layouts.ReportLayoutData LayoutData, Croc.XmlFramework.ReportService.Layouts.TableLayout.LayoutColumns Columns, int CurrentRowNum, int CurrentColumnNum, bool SubTotals, DataTable oTable, int[] ColumnsRowspan, int nGroupedCellsCount, DataRow PreviousRow) { // вызываем базовый метод, но передаем ему столбцы для накопления итогов // только по помеченным строкам base.WriteTotalRow(LayoutProfile, LayoutData, TotalColumns, CurrentRowNum, CurrentColumnNum, SubTotals, oTable, ColumnsRowspan, nGroupedCellsCount, PreviousRow); // если выводим общие итоги, то больше ничего делать не надо if (!SubTotals) { return; } // получаем объект, с которым работают форматтеры и эвалуаторы ReportFormatterData FormatterData = new ReportFormatterData(LayoutData, ((int)PreviousRow["Expected"] - (int)PreviousRow["TotalSpent"]).ToString(), null, PreviousRow, -1, -1); durationevaluatorClass FormatterNode = new durationevaluatorClass(); FormatterNode.workdayDuration = "{#WorkdayDuration}"; FormatterNode.format = "{@TimeMeasureUnits}"; // просим объект у фабрики IReportFormatter Formatter = (IReportFormatter)ReportObjectFactory.GetInstance(FormatterNode.GetAssembly(), FormatterNode.GetClass()); // делаем что-то Formatter.Execute(FormatterNode, FormatterData); // далее добавляем строку для вывода дисбаланса по сотруднику LayoutTable.AddRow(); LayoutTable.CurrentRow.AddCell("<fo:block text-align='right'>Дисбаланс по сотруднику:</fo:block>", "string", 1, 3, "SUBTOTAL"); LayoutTable.CurrentRow.CurrentCell.StartsColumnspanedCells = true; LayoutTable.CurrentRow.CurrentCell.IsAggregated = true; LayoutTable.CurrentRow.AddCell(null, null, 1, 1); LayoutTable.CurrentRow.CurrentCell.IsFakeCell = true; LayoutTable.CurrentRow.CurrentCell.IsAggregated = true; LayoutTable.CurrentRow.AddCell(null, null, 1, 1); LayoutTable.CurrentRow.CurrentCell.IsFakeCell = true; LayoutTable.CurrentRow.CurrentCell.IsAggregated = true; LayoutTable.CurrentRow.AddCell(FormatterData.CurrentValue, "string", 1, 2, "SUBTOTAL"); LayoutTable.CurrentRow.CurrentCell.StartsColumnspanedCells = true; LayoutTable.CurrentRow.CurrentCell.IsAggregated = true; LayoutTable.CurrentRow.AddCell(null, null, 1, 1); LayoutTable.CurrentRow.CurrentCell.IsFakeCell = true; LayoutTable.CurrentRow.CurrentCell.IsAggregated = true; }