به صورت پیش فرض، تمام گزارشات Stimulsoft، قبل از رندر باید به صورت اسمبلی کامپایل شوند. در برنامههای NET. در صورتیکه اسمبلی در حافظه بارگذاری شده باشد، تا زمانیکه برنامه اصلی از حافظه خارج نشود، فایل اسمبلی قفل خواهد بود و امکان حذف و یا تغییر آن وجود ندارد.
همانطور که در مثال بالا مشاهده کنید، یک گزارش ساخته میشود و در صورت عدم وجود فایل کامپایل شده و یا تغییر در فایل گزارش، مجددا فایل گزارش با نام جدیدی کامپایل شده و نمایش داده میشود.
در هر بار کامپایل گزارش، فایل اسمبلی کامپایل شده، در پوشه %Temp% ذخیره و در حافظه بارگذاری میشود. به هرحال، بارگذاری اسمبلی گزارش، سبب قفل شدن و اختصاص حافظهای برای آن میشود.
همانطور که مشاهده میکنید در هر بار کامپایل گزارش، این فایلها ساخته میشوند.
چندین راه حل برای رفع این مشکل وجود دارد:
- استفاده گزارشات به صورت کلاسهای #C در برنامه شما (با استفاده از Designer و Save as آن به صورت کلاس #C). در این صورت گزارش همزمان با کامپایل برنامه شما، کامپایل شده و در زمان فراخوانی، دیگر نیاز به کامپایل مجدد آن نیست.
اشکال: در صورتیکه قالب گزارش شما نیاز به تغییر داشته باشد، برنامهی شما باید با کلاسهای جدید گزارش مجددا کامپایل شود. - میتوان گزارش را از طریق برنامه Designer به صورت اسمبلی ( dll ) ذخیره کرد.
اشکال: این روش برای مدیریت گزارشها در طول ارتقاء آنها مفید نمیباشد. - از گزارش کامپایل شده استفاده نکنید و به جای آن از تفسیر عبارات در گزارش استفاده کنید. برای فعالسازی این حالت، خصوصیت Calculation Mode گزارش را در پنجره خصوصیتها در برنامه Designer بر روی Interpretation قرار دهید.
اشکال: این روش به این معنی است که تمامی اصطلاحات زبان C# / VB.NET تفسیر نمیشوند. همچنین استفاده از رخدادهای مربوط به اجزاء گزارش غیرممکن میباشد. - کامپایل و رندر گزارش، در دامنهی برنامهی دیگری انجام شود. در این مورد میتوان پس از رندر گزارش، اسمبلی را در دامنهی برنامه جاری بارگذاری کرد و فایل قفل شدهی آن، بعدا حذف خواهد شد. با استفاده از متد ()CreateReportInNewAppDomain از کلاس StiReport میتوان گزارش را ایجاد کرد و با استفاده از متد ()UnloadReportAppDomain آن را بارگذاری کرد.
اشکال در این روش متدهای RegData و RegBusinessObject با سرعت خیلی کمی اجرا میشوند؛ چرا که هدایت دادهها به دامنهی دیگری استفاده شده است. ایجاد و بارگذاری در دامنهی برنامه نیازمند زمان میباشد. - کارآمدترین روش: کامپایل گزارش تنها در زمان اولین فراخوانی انجام شود و هر زمان که درخواست فراخوانی گزارش انجام میشود، گزارش را از اسمبلی کامپایل شده، در حافظه بارگذاری میکنیم. در این مورد تنها یک کپی از گزارش در حافظه ذخیره میشود و تنها یک اسمبلی در درایو وجود دارد. پوشه مربوط به گزارشهای کامپایل شده میتواند قبل از استفاده از گزارشات حذف شود، چرا که در اولین درخواست گزارش، دوباره ایجاد خواهد شد.
مثال:
var report = new StiReport(); report.Load( "Report.mrt" ); var folder = Environment.GetFolderPath( Environment.SpecialFolder.LocalApplicationData ); folder = Path.Combine( folder, "Stimulsoft\\CompiledReports" ); folder = Path.Combine( folder, System.Runtime.InteropServices.RuntimeEnvironment.GetSystemVersion() ); var compiledReportFile = Path.Combine( folder, report.GetReportAssemblyCacheName() ); if ( File.Exists( compiledReportFile ) ) report = StiReport.GetReportFromAssembly( compiledReportFile, true ); else { if ( !Directory.Exists( folder ) ) Directory.CreateDirectory( folder ); report.Compile( compiledReportFile ); } report.RegBusinessObject( "TestData", new { Title = "Vahid " + DateTime.Now.Millisecond } ); report.Render( false );
نکته: حتما بارگذاری دیتا مربوط به گزارش را بعد از عملیات کامپایل قراردهید.