Наиболее оптимальный и рациональный алгоритм работы с отчётами
Добавлено: 20 авг 2009, 20:20
				
				Добрый день!
Прочитав переписку http://forum.stimulsoft.com/Default.aspx?g=posts&t=142 у меня возникли сомнения по поводу корректности и оптимальности используемого мною алгоритма при работе с отчётами.
Я делаю так:
1. Сохраняю каждый отчёт из дизайнера в своём DLL-файле, которые затем поставляются в дистрибутиве конечным пользователям.
2. Использую следующий класс для загрузки, инициализации переменных и параметров, отображения и печати отчётов, инициализировав его в начале программы: Report.Init("bla-bla-bla");
При последовательных генерациях отчётов наблюдаются незначительные увеличения используемой памяти.
Всё ли корректно в моём коде?
Может есть более быстрые и рациональные способы работы с отчётами?
По поводу параметра LoadOnce: когда лучше использовать true, а когда false? Я делаю так: если пользователь точно будет использовать какой-либо отчёт передаю true, если пользователь может не использовать какой-либо отчёт в работе передаю false.
Генерить классы отчётов и компилить их вместе с приложениями считаю нецелесообразным, т.к. отчётов довольно много и при загрузке приложения все отчёты (весь код приложения) будут загружаться в память, а использоваться в работе в текущем сеансе может всего лишь какой-нибудь один отчёт.
Компилировать клиентом *.mrt файлы при первом запуске отчёта также считаю нецелесообразным, т.к. процесс отнимает некоторое время, думаю предпочтительнее использовать готовые DLL.
Заранее спасибо!
			Прочитав переписку http://forum.stimulsoft.com/Default.aspx?g=posts&t=142 у меня возникли сомнения по поводу корректности и оптимальности используемого мною алгоритма при работе с отчётами.
Я делаю так:
1. Сохраняю каждый отчёт из дизайнера в своём DLL-файле, которые затем поставляются в дистрибутиве конечным пользователям.
2. Использую следующий класс для загрузки, инициализации переменных и параметров, отображения и печати отчётов, инициализировав его в начале программы: Report.Init("bla-bla-bla");
Код: Выделить всё
using System;
using System.Windows.Forms;
using System.Collections;
using System.Data;
using Stimulsoft.Report;
using Stimulsoft.Report.Dictionary;
namespace ReportStimul
{
    public static class Report
    {
        private static string ReportFilesPath;
        private static string ConnectionString;
        public static object RecordSet;
        public static Hashtable Fields;
        public static void Init(string ConnectionString)
        {
            Report.ConnectionString = ConnectionString;
            ReportFilesPath = System.IO.Directory.GetCurrentDirectory();
            StiConfig.LoadLocalization(ReportFilesPath + @"\ru.xml");
            Fields = new Hashtable();
        }
        public static void Generate(string ReportName, bool ShowPreview, bool LoadOnce)
        {
            try
            {
                using (StiReport report = StiReport.GetReportFromAssembly(ReportFilesPath + ReportName + ".dll", LoadOnce))
                {
                    if (RecordSet != null)
                    {
                        if (RecordSet is DataSet) report.RegData(RecordSet as DataSet);
                        else if (RecordSet is DataTable) report.RegData(RecordSet as DataTable);
                        else if (RecordSet is DataView) report.RegData(RecordSet as DataView);
                    }
                    else
                    {
                        report.Dictionary.Databases.Clear();
                        report.Dictionary.Databases.Add(new StiSqlDatabase("Connection", ConnectionString));
                    }
                    if (Fields.Count > 0)
                    {
                        foreach (DictionaryEntry de in Fields)
                        {
                            if (de.Value != null) report[de.Key.ToString()] = de.Value;
                        }
                    }
                    if (ShowPreview)
                    {
                        report.Show(true);
                    }
                    else
                    {
                        report.Print(false);
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex);
            }
            finally
            {
                RecordSet = null;
                Fields.Clear();
            }
        }
    }
}
Всё ли корректно в моём коде?
Может есть более быстрые и рациональные способы работы с отчётами?
По поводу параметра LoadOnce: когда лучше использовать true, а когда false? Я делаю так: если пользователь точно будет использовать какой-либо отчёт передаю true, если пользователь может не использовать какой-либо отчёт в работе передаю false.
Генерить классы отчётов и компилить их вместе с приложениями считаю нецелесообразным, т.к. отчётов довольно много и при загрузке приложения все отчёты (весь код приложения) будут загружаться в память, а использоваться в работе в текущем сеансе может всего лишь какой-нибудь один отчёт.
Компилировать клиентом *.mrt файлы при первом запуске отчёта также считаю нецелесообразным, т.к. процесс отнимает некоторое время, думаю предпочтительнее использовать готовые DLL.
Заранее спасибо!