Страница 1 из 1

Склеивание Отчетов(Страниц)

Добавлено: 11 сен 2014, 16:15
walle93
Здравствуйте!
Нужна помощь. Имеется набор отчетов. Каждый состоит из 8 страниц. Так вот 6 из этих страниц одинаковые для всех, а меняются(со временем и добавляются новые отчеты) только первые 2. Вопрос: можно ли, разделив отчеты(статичная часть - один отчет, динамичная - остальные), склеивать их динамично или как то еще? При этом нужно учитывать что отчет может отображаться для группы данных, то есть 8+8+8+8+....
Спасибо заранее!

Re: Склеивание Отчетов(Страниц)

Добавлено: 12 сен 2014, 11:13
Aleksey
Здравствуйте,

Вы можете объединить уже отрендеренные отчеты в один итоговый:

Код: Выделить всё

rep1.Render();
foreach(StiPage page in rep1.RenderedPages)
{
    report.RenderedPages.Add(page);
}
rep2.Render();
foreach (StiPage page in rep2.RenderedPages)
{
    report.RenderedPages.Add(page);
}
При этом нужно учитывать что отчет может отображаться для группы данных, то есть 8+8+8+8+....
Не совсем понятна проблема, не могли бы более подробно описать.

Спасибо.

Re: Склеивание Отчетов(Страниц)

Добавлено: 15 сен 2014, 11:21
walle93
Здравствуйте!
Объединение по отрисованным страницам уже рассматривали, но это проблематично. Объясню подробнее ситуацию: шаблон на одну запись состоит из 4-х страниц. Первые две (например квитанция, сведения о клиенте) меняются периодически совместно. И последние 2 страницы(например сопроводительная информация и т.п.) если меняются, то вместе, также периодически. И так получается, что если нужно что-либо поменять в шаблоне на какой либо странице, то приходится затрагивать все абсолютно шаблоны. Все это дело выгружается в PDF файл по 50 таких 4-х страничных отчетов. То есть если объединять рендеренные страницы, то нужно каждый отрисовать, потом брать по 2 с первого шаблона и 2 со второго.
Надеялся что есть более универсальное средство!

Re: Склеивание Отчетов(Страниц)

Добавлено: 15 сен 2014, 15:55
Aleksey
Здравствуйте,

Как вариант, мы можете использовать компонент SubReport, с ссылкой на внешний файл, для отображения общей части - "(например сопроводительная информация и т.п.)".

Спасибо.

Re: Склеивание Отчетов(Страниц)

Добавлено: 16 сен 2014, 16:15
walle93
Пробую реализацию объединения отрисованных отчетов. Так вот этот вариант практически в 2 раза работает медленнее, если бы мы просто один большой отчет создавали.

Может делаю, что не так?? Можно ли узнать как правильно рендерить и вцелом создавать отчеты??? Читал, на этом же форуме про разного рода очистки кэша и все такое читал, но ничего.

Код: Выделить всё


List<RegisteredReport> Reports;
        private Stimulsoft.Report.StiReport newReport;

        class RegisteredReport
        {
            public Stimulsoft.Report.StiReport mReport;
            public String mName;
            public String mReportCacheCompiledFolderName;
            public String mReportCacheCompiledFileName;
            public String mViolationTypes;
            public String mOriginalFoto;
            public DateTime mDateFrom;
            public DateTime mDateTo;
            public bool mLoadedFromAssembly = false;
            public int mCollate;

            public RegisteredReport(Stimulsoft.Report.StiReport report, String name, String violationTypes, String originalFoto, DateTime dateFrom, DateTime dateTo, int collate)
            {
                mReportCacheCompiledFolderName = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
                mReportCacheCompiledFolderName = Path.Combine(mReportCacheCompiledFolderName, "Stimulsoft\\CompiledReports");
                mReportCacheCompiledFolderName = Path.Combine(mReportCacheCompiledFolderName, System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion().ToString());
                mReportCacheCompiledFileName = Path.Combine(mReportCacheCompiledFolderName, report.GetReportAssemblyCacheName());
                if (File.Exists(mReportCacheCompiledFileName))
                {
                    File.Delete(mReportCacheCompiledFileName);
                }
                mReport = report;
                mName = name;
                mViolationTypes = violationTypes;
                mOriginalFoto = originalFoto;
                mDateFrom = dateFrom;
                mDateTo = dateTo;
                mCollate = collate;
            }

            public void ProcessReportBeforeUsage(DataTable Table)
            {
                if (File.Exists(mReportCacheCompiledFileName))
                {
                    if (!mLoadedFromAssembly)
                    {
                        mReport =
                            Stimulsoft.Report.StiReport.GetReportFromAssembly(
                                mReportCacheCompiledFileName, false);
                        mLoadedFromAssembly = true;
                    }
                }
                else //Compiled report does not exist
                {
                    mReport.RegData(Table);
                    if (!Directory.Exists(mReportCacheCompiledFolderName))
                        Directory.CreateDirectory(mReportCacheCompiledFolderName);
                    mReport.Compile(mReportCacheCompiledFileName);
                    mReport = mReport.CompiledReport;
                }
            }
        }      

        void InitializeRegisteredReports(String reportType)
        {
            Reports = new List<RegisteredReport>();
            if (reportType == "Почта")
            {
                //Постановление_ДопИнформация
                Reports.Add(new RegisteredReport(Постановление_1_1, "1",
                    "ТипОбрабатываемыхДанных_1", "55", DateTime.Parse("1.01.2000"),
                    DateTime.Parse("31.01.2014"), 2));
                Reports.Add(new RegisteredReport(Постановление_1_2, "1",
                    "ТипОбрабатываемыхДанных_1", "55", DateTime.Parse("1.02.2014"),
                    DateTime.Parse("1.07.2014"), 2));
                Reports.Add(new RegisteredReport(Постановление_1_3, "1",
                    "ТипОбрабатываемыхДанных_1", "55", DateTime.Parse("2.07.2014"),
                    DateTime.Parse("2.07.2114"), 2));
                Reports.Add(new RegisteredReport(Постановление_2_1, "1", "ТипОбрабатываемыхДанных_2", "55",
                    DateTime.Parse("1.01.2000"), DateTime.Parse("31.01.2014"), 2));
                Reports.Add(new RegisteredReport(Постановление_2_2, "1", "ТипОбрабатываемыхДанных_2", "55",
                    DateTime.Parse("1.02.2014"), DateTime.Parse("1.07.2014"), 2));
                Reports.Add(new RegisteredReport(Постановление_2_3, "1", "ТипОбрабатываемыхДанных_2", "55",
                    DateTime.Parse("2.07.2014"), DateTime.Parse("2.07.2114"), 2));
                Reports.Add(new RegisteredReport(Постановление_ДопИнформация, "2", "ТипОбрабатываемыхДанных_Все", "55",
                    DateTime.Parse("2.07.2010"), DateTime.Parse("2.07.2114"), 2));
            }
            
        }


ВЦЕЛОМ ЕДИНЫЙ ОТЧЕТ ВЫГЛЯДИТ КАК Постановление_1_1+Постановление_ДопИнформация

        List<RegisteredReport> GetValidReport(DateTime date, String originalFoto)
        {
            var response = Reports.Where(x => x.mDateFrom <= date && date <= x.mDateTo && x.mViolationTypes.IndexOf(violationType) != -1 && (x.mOriginalFoto == originalFoto || x.mOriginalFoto == "55")).OrderBy(y=>y.mName).ToList();

            return response;
        }

        private void RenderReport(int send, List<RegisteredReport> findedReportTemplate, DataTable inputTable)
        {
            for (int i = 0; i < findedReportTemplate.Count; i++)
            {
                findedReportTemplate[i].ProcessReportBeforeUsage(inputTable);

                findedReportTemplate[i].mReport.RegData(inputTable);

                findedReportTemplate[i].mReport.Collate = findedReportTemplate[i].mCollate;

                findedReportTemplate[i].mReport.Render(false);

                if (inputTable.Rows.Count == 1)
                {
                    foreach (StiPage stiPage in findedReportTemplate[i].mReport.RenderedPages)
                    {
                        var page = (StiPage)stiPage.Clone();

                        page.Report = newReport;
                        page.Guid = Guid.NewGuid().ToString().Replace("-", "");
                        newReport.RenderedPages.Add(page);
                    }
                }
            }

            if (inputTable.Rows.Count > 1)
            {
                for (int j = 0; j < findedReportTemplate[0].mReport.RenderedPages.Count / findedReportTemplate[0].mCollate; j++)
                {
                    foreach (RegisteredReport rep in findedReportTemplate)
                    {
                        int start = j * rep.mCollate;
                        for (int k = start; k < start + rep.mCollate; k++)
                        {
                            var page = (StiPage)rep.mReport.RenderedPages[k].Clone();

                            page.Report = newReport;
                            page.Guid = Guid.NewGuid().ToString().Replace("-", "");
                            newReport.RenderedPages.Add(page);
                        }
                    }
                }
            }
        }


Save(){

DataTable TempTableForReport = new DataTable();
            TempTableForReport = DSProtocol_Table.Tables[0].Clone();

            if (!(send == 3 && pristavArgs[3] == "Только архивные"))//Это условие потому что при выгрузке только архивных приставам, выгружать само постановление не нужно.
            {
                newReport = new StiReport();
                newReport.RenderedPages.Clear();
                newReport.NeedsCompiling = false;
                newReport.IsRendered = true;
                List<RegisteredReport> findedReportTemplate;

                for (int h = 0; h < DSProtocol_Table.Tables[0].Rows.Count; h++)
                {
                    TempTableForReport.Rows.Clear();
                    TempTableForReport.LoadDataRow(DSProtocol_Table.Tables[0].Rows[h].ItemArray, true);
                    findedReportTemplate = GetValidReport(DateTime.Parse(TempTableForReport.Rows[0]["Дата печати"].ToString()), TempTableForReport.Rows[0]["ОригиналФото"].ToString());
                    if (findedReportTemplate != null)
                    {
                        RenderReport(send, findedReportTemplate, TempTableForReport);
                    }
                    else
                    {
                        if (ErrorEvent != null)
                        {
                            ErrorEvent("Ошибка поиска шаблона", TempTableForReport.Rows[0]["id"].ToString(),
                                "Не найден шаблон для постановления " +
                                TempTableForReport.Rows[0]["Постановление"].ToString());
                        }
                    }
                }

                newReport.ExportDocument(Stimulsoft.Report.StiExportFormat.Pdf, String.Concat(folder_name, "\\", file_name, ".pdf"), settings);

            }
}


Start_LoadData(){
InitializeRegisteredReports("Почта");
SqlCommand.CommandText="SELECT ******";

SqlDataReader SqlDR=.... выполнение запроса
while(SqlDR.Read()){
заполняем DSProtocol_Table - DataSet, который и служит источником для отчетов

if(DSProtocol_Table.Tables[0].Rows.Count==50){
Save();//Здесь и вызываю функцию сохранения отчета
}
}
}

Re: Склеивание Отчетов(Страниц)

Добавлено: 16 сен 2014, 16:26
walle93
Это пример кода. Прошу обратить внимание на функцию ProcessReportBeforeUsage класса RegisteredReport. Она у меня больше подозрений вызывает(но по идее необходима так как в для каждой строки данных могут быть разные формы отчетов). Версия Stimulsoft Reports.Net 2012.3

Re: Склеивание Отчетов(Страниц)

Добавлено: 17 сен 2014, 11:04
walle93
И в целом вопрос: Render необходимо производить каждый раз перед выводом отчета??? Даже если один и тот же отчет (но с разными данными) нужно сохранять раз 50

Re: Склеивание Отчетов(Страниц)

Добавлено: 17 сен 2014, 16:21
Aleksey
Здравствуйте,

Да. Если данные изменились, то необходимо заново рендерить отчет, если его не перестроить. то данные будут отображены старые.

Спасибо.