/// <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="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, 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; }
/// <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="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) { }