Склеивание Отчетов(Страниц)
Склеивание Отчетов(Страниц)
Здравствуйте!
Нужна помощь. Имеется набор отчетов. Каждый состоит из 8 страниц. Так вот 6 из этих страниц одинаковые для всех, а меняются(со временем и добавляются новые отчеты) только первые 2. Вопрос: можно ли, разделив отчеты(статичная часть - один отчет, динамичная - остальные), склеивать их динамично или как то еще? При этом нужно учитывать что отчет может отображаться для группы данных, то есть 8+8+8+8+....
Спасибо заранее!
Нужна помощь. Имеется набор отчетов. Каждый состоит из 8 страниц. Так вот 6 из этих страниц одинаковые для всех, а меняются(со временем и добавляются новые отчеты) только первые 2. Вопрос: можно ли, разделив отчеты(статичная часть - один отчет, динамичная - остальные), склеивать их динамично или как то еще? При этом нужно учитывать что отчет может отображаться для группы данных, то есть 8+8+8+8+....
Спасибо заранее!
Re: Склеивание Отчетов(Страниц)
Здравствуйте,
Вы можете объединить уже отрендеренные отчеты в один итоговый:
Спасибо.
Вы можете объединить уже отрендеренные отчеты в один итоговый:
Код: Выделить всё
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: Склеивание Отчетов(Страниц)
Здравствуйте!
Объединение по отрисованным страницам уже рассматривали, но это проблематично. Объясню подробнее ситуацию: шаблон на одну запись состоит из 4-х страниц. Первые две (например квитанция, сведения о клиенте) меняются периодически совместно. И последние 2 страницы(например сопроводительная информация и т.п.) если меняются, то вместе, также периодически. И так получается, что если нужно что-либо поменять в шаблоне на какой либо странице, то приходится затрагивать все абсолютно шаблоны. Все это дело выгружается в PDF файл по 50 таких 4-х страничных отчетов. То есть если объединять рендеренные страницы, то нужно каждый отрисовать, потом брать по 2 с первого шаблона и 2 со второго.
Надеялся что есть более универсальное средство!
Объединение по отрисованным страницам уже рассматривали, но это проблематично. Объясню подробнее ситуацию: шаблон на одну запись состоит из 4-х страниц. Первые две (например квитанция, сведения о клиенте) меняются периодически совместно. И последние 2 страницы(например сопроводительная информация и т.п.) если меняются, то вместе, также периодически. И так получается, что если нужно что-либо поменять в шаблоне на какой либо странице, то приходится затрагивать все абсолютно шаблоны. Все это дело выгружается в PDF файл по 50 таких 4-х страничных отчетов. То есть если объединять рендеренные страницы, то нужно каждый отрисовать, потом брать по 2 с первого шаблона и 2 со второго.
Надеялся что есть более универсальное средство!
Re: Склеивание Отчетов(Страниц)
Здравствуйте,
Как вариант, мы можете использовать компонент SubReport, с ссылкой на внешний файл, для отображения общей части - "(например сопроводительная информация и т.п.)".
Спасибо.
Как вариант, мы можете использовать компонент SubReport, с ссылкой на внешний файл, для отображения общей части - "(например сопроводительная информация и т.п.)".
Спасибо.
Re: Склеивание Отчетов(Страниц)
Пробую реализацию объединения отрисованных отчетов. Так вот этот вариант практически в 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: Склеивание Отчетов(Страниц)
Это пример кода. Прошу обратить внимание на функцию ProcessReportBeforeUsage класса RegisteredReport. Она у меня больше подозрений вызывает(но по идее необходима так как в для каждой строки данных могут быть разные формы отчетов). Версия Stimulsoft Reports.Net 2012.3
Re: Склеивание Отчетов(Страниц)
И в целом вопрос: Render необходимо производить каждый раз перед выводом отчета??? Даже если один и тот же отчет (но с разными данными) нужно сохранять раз 50
Re: Склеивание Отчетов(Страниц)
Здравствуйте,
Да. Если данные изменились, то необходимо заново рендерить отчет, если его не перестроить. то данные будут отображены старые.
Спасибо.
Да. Если данные изменились, то необходимо заново рендерить отчет, если его не перестроить. то данные будут отображены старые.
Спасибо.