Страница 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
Здравствуйте,
Да. Если данные изменились, то необходимо заново рендерить отчет, если его не перестроить. то данные будут отображены старые.
Спасибо.