Example #1
0
 /// <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);
 }
Example #2
0
        /// <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);
        }
Example #5
0
 /// <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);
     }
 }
Example #6
0
        /// <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);
        }
Example #7
0
        /// <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);
        }
Example #8
0
        // Метод, формирующий отчет; вызывается подсистемой 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();
        }
Example #9
0
        /// <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);
                }
            }
        }
Example #10
0
        // Закомментил старое

        /*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);
        }