Компиляция отчетов и all around

Обсуждение Stimulsoft Reports.NET
Ответить
hstas
Сообщения: 8
Зарегистрирован: 29 авг 2006, 21:48

Компиляция отчетов и all around

Сообщение hstas »

Добрый день, Stimulsoft
Вот такой вопрос. В проекте поставляю заказчику неоткомпилированные отчеты (mrt файлы) для того, чтобы независеть от версии StimulReports. Но такая схема дает некоторую задержку при выводе отчета (компиляция), что невсегда приятно .) При использовании же dll отчетов могут возникнуть проблемы с переходом на другие версии - тогда прийдется откомпилировать все отчеты и переслать заново, но в системе порядка 50 отчетов и некоторые customized - т.е. уникальные для некоторых заказчиков или клиентских версий программы, что далет процесс перекомпиляции файлов вручную просто завальным. Автоматически же вопрос решить можно, но с учетом всех ньюансов (сравнили версии, записали, на лету проверили, и т.д.) игра может "не стоить свеч".
Есть ли у вас готовые схемы для таких моментов? Возможно ли получить сборку dll c полной гарантией ее поддержки последующими версиями, обходя ограничения .net на соответствие версий? Может быть еще какие-либо мысли по этому поводу?

респект вам за продукт
спасибо
hstas
Сообщения: 8
Зарегистрирован: 29 авг 2006, 21:48

Компиляция отчетов и all around

Сообщение hstas »

Небольшое дополнение...
думал попробовать сделать автоматический компилятор в случае различия версий откомпилированных dll и немогу найти методы получения версии компиляции от dll файла отчета
System.Reflection.Assembly sv = System.Reflection.Assembly.LoadFile(dll);
System.Version ver = sv.GetName().Version; // 0.0.0.0 ????

есть идеи?
Vital
Сообщения: 647
Зарегистрирован: 09 июн 2006, 12:23

Компиляция отчетов и all around

Сообщение Vital »

Есть пример работающего кода. В коде провяряется наличие репорта на диске, затем если версия репорта и отчета совпадает и не было изменений в самом отчете, отчет грузится из сборки.

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

string file = StiConfig.ApplicationDirectory + "\\" + "Reports\\" + tvReports.SelectedNode.Tag as string;

				if (File.Exists(file))
				{					
					StiReport report = new StiReport();
                                         //Читаем отчет для того чтобы узнать его версию (версию изменений или уникальных guid отчета, всякий раз когда отчет меняется, меняется и его guid)
					report.Load(file);
					
                                        //Формируем имя сборки отчета
					string compiledReportFile = 
						string.Format("{0}\\CompiledReports\\{1}", StiConfig.ApplicationDirectory,
						report.GetReportAssemblyCacheName());

					if (File.Exists(compiledReportFile))
					{
						report = StiReport.GetReportFromAssembly(compiledReportFile, true);
						RegData(report);
						report.Render(false);
					}
					else
					{											
						RegData(report;
						
						if (!Directory.Exists(StiConfig.ApplicationDirectory + "\\CompiledReports\\"))
							Directory.CreateDirectory(StiConfig.ApplicationDirectory + "\\CompiledReports\\");

						report.Compile(compiledReportFile);						
						report.Render(false);
					
					}

					if (!report.IsStopped)
					{					
						if (reportAction == ReportAction.PreviewInWindow)report.Show();
						else if (reportAction == ReportAction.Preview)
						{
							stiPreviewControl1.Report = report;
							stiPreviewControl1.FirstPage();
						}
						else if (reportAction == ReportAction.Print)report.Print(false);
					}
				}
Всякий раз, когда быдет меняться версия генератора отчетов или будет изменен файл отчета (mrt) отчет будет перекомпилирован.
hstas
Сообщения: 8
Зарегистрирован: 29 авг 2006, 21:48

Компиляция отчетов и all around

Сообщение hstas »

спасибо, все отлично.
А как насчет оптимального алгоритма удаления ненужных сборок (старых версий отчетов, сборок предыдущих версий) в папке CompiledReports?

функция RegData(report) - несет смысловую нагрузку в контексте моего вопроса?
Vital
Сообщения: 647
Зарегистрирован: 09 июн 2006, 12:23

Компиляция отчетов и all around

Сообщение Vital »

Нет. Этот метод просто обертка над report.RegData. Удалить ненужные сборки можно таким образом:

1. Считываем в коллекцию все имена сборок из CompiledReports
2. Бежим по всем отчетам mrt, загружаем каждый, формируем имя сборки для загрузки. По имени сборки удаляем из коллекции имен сборок те которые используются. Эта операция не займет много времени.
3. То что осталось в коллекции это как раз и есть неиспользуемые сборки. Их можно удалить. Только важно делать эту операцию при старре приложения, иначе некоторые сборки могут быть залочены и удалить их неудасться.

Эту операцию можно выполнять один раз в день при старте приложения.

Спасибо.
hstas
Сообщения: 8
Зарегистрирован: 29 авг 2006, 21:48

Компиляция отчетов и all around

Сообщение hstas »

спасибо, Vital
вопрос по удалению могу дополнить - на мой взгляд оптимальней, в моем случае, будет регистрировать в базе по исходному имени отчета сборку и соответствующие операции по очистке распределить по времени - хотя конечно может возникнуть проблема общего доступа к файлам.

Теперь другая проблема .) - mrt отчеты в сетевой папке и GetReportAssemblyCacheName каждый раз при обращении дает отличное имя? в даном вопросе не силен? в чем суть?
Vital
Сообщения: 647
Зарегистрирован: 09 июн 2006, 12:23

Компиляция отчетов и all around

Сообщение Vital »

Возможно отчет не имеет Guid (к примеру он сохранен в более ранней версии генератора). В этом случае при его загрузке будет постоянно генерироваться новый guid.
Для решение я проблемы надо сохранить этот отчет.

Спасибо.
Ответить