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

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

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

респект вам за продукт
спасибо

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

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

есть идеи?

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

Добавлено: 18 дек 2006, 10:50
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) отчет будет перекомпилирован.

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

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

функция RegData(report) - несет смысловую нагрузку в контексте моего вопроса?

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

Добавлено: 18 дек 2006, 11:58
Vital
Нет. Этот метод просто обертка над report.RegData. Удалить ненужные сборки можно таким образом:

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

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

Спасибо.

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

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

Теперь другая проблема .) - mrt отчеты в сетевой папке и GetReportAssemblyCacheName каждый раз при обращении дает отличное имя? в даном вопросе не силен? в чем суть?

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

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

Спасибо.