/// <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); } }
// Закомментил старое /*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); }
/// <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">профиль отчета</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> /// <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> /// <param name="oDataColumn">дополнительный столбец, который нужно вывести</param> /// <param name="HiddenColumns">скрытые столбцы</param> /// <param name="FormattersNode">форматтеры для лэйаута по умолчанию</param> protected virtual void WriteVarColumn(tablelayoutClass LayoutProfile, XslFOProfileWriter RepGen, DataTable oTable, TableLayout.LayoutColumns Columns, ReportParams Params, object CustomData, IDictionary Vars, DataColumn oDataColumn, string HiddenColumns, abstractformatterClass[] FormattersNode) { }