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

Передача датасета в отчёт, загруженный из сборки

Добавлено: 11 июл 2012, 14:47
EmeJIbka
Доброго времени всем.
Расскажите, пожалуйста, как правильно передавать данные в отчёт, который загружается из сборки. В своем приложении я передаю в отчёт массив объектов. Если я создаю экземпляр StiReport, то всё работает правильно, данные в отчёт попадают и отображаются. Но если загружать отчёт из сборки ( StiReport.GetReportFromAssembly(...)), то в отчёт попадают только переменные. Не могу понять в чём причина такого странного поведения.

Ниже приведён код основного класса-обёртки на stimulReport.

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

public class StimulReportDesigner
    {
        private StiReport _stiReport;

        public StimulReportDesigner()
        {
            SetEngineOptions();
            SetDesignerOptions();
            SetDictionaryOptions();
        }

        public void PreviewReport()
        {
            using (_stiReport)
            {
                CompileReport();
                _stiReport.Show(true);
            }
        }

        private void CompileReport()
        {
            var reportFileName = _stiReport.ReportFile;
            var compiledReportFileName = string.Format("{0}.dll", reportFileName);
            if (!File.Exists(compiledReportFileName) || CompiledReportIsOlderThanReport(reportFileName, compiledReportFileName))
            {
                _stiReport.Compile(compiledReportFileName);
            }
        }

        public void OpenReport(string reportFileName, bool isLocalTemplate)
        {
            if (!File.Exists(reportFileName))
            {
                throw new Exception(string.Format("Не найден файл шаблона {0}!", reportFileName));
            }

            var compiledReportFileName = string.Format("{0}.dll", reportFileName);
            if (!File.Exists(compiledReportFileName) || CompiledReportIsOlderThanReport(reportFileName, compiledReportFileName))
            {
                _stiReport = new StiReport();
                _stiReport.Load(reportFileName);
            }
            else
            {
                _stiReport = StiReport.GetReportFromAssembly(compiledReportFileName, false);
            }
        }

        private bool CompiledReportIsOlderThanReport(string reportFileName, string compiledReportFileName)
        {
            var reportFileInfo = new FileInfo(reportFileName);
            var compiledReportFileInfo = new FileInfo(compiledReportFileName);

            return compiledReportFileInfo.CreationTime < reportFileInfo.CreationTime
                || compiledReportFileInfo.CreationTime < reportFileInfo.LastWriteTime;
        }

        public void UpdateReportDictionary(ReportData reportData)
        {
            if (_stiReport == null)
            {
                _stiReport = new StiReport();
            }

            _stiReport.Dictionary.Databases.Clear();
            _stiReport.Dictionary.DataStore.Clear();
            _stiReport.Dictionary.DataSources.Clear();

            RegisterData(reportData);
            _stiReport.Dictionary.Synchronize();
        }

        private void RegisterData(ReportData reportData)
        {
            if (reportData != null && reportData.Tables.Any())
            {
                foreach (var table in reportData.Tables)
                {
                    if (!table.IsEmpty || Settings.ShowEmptyTables)
                    {
                        _stiReport.RegData(table.Name, GetArrayFromList(table));
                    }
                }
            }

            if (reportData != null)
            {
                foreach (ReportVariable variable in reportData.Variables)
                {
                    if (!variable.IsEmpty || Settings.ShowEmptyVariables)
                    {
                        var newVariable = new StiVariable
                                              {
                                                  Alias       = variable.Caption,
                                                  Name        = variable.Name,
                                                  ValueObject = variable.Value ?? string.Empty,
                                                  Type        = variable.Value != null?variable.Value.GetType():typeof(string)
                                              };
                        if (!_stiReport.Dictionary.Variables.Contains(newVariable.Name))
                        {
                            _stiReport.Dictionary.Variables.Add(newVariable);
                        }
                        else
                        {
                            _stiReport.Dictionary.Variables[newVariable.Name].ValueObject = newVariable.ValueObject;
                        }
                        _stiReport[newVariable.Name] = newVariable.ValueObject;
                    }
                }
            }
        }

        private static object[] GetArrayFromList(ReportTable table)
        {
            var sourceRows = table.GetRows();
            var rows = new object[sourceRows.Count];

            for (int i = 0; i < sourceRows.Count; i++)
            {
                rows[i] = sourceRows[i];
            }
            return rows;
        }

        public class Settings
        {
            public static bool ShowEmptyTables = true;
            public static bool ShowEmptyVariables = true;
        }

        private static void SetDictionaryOptions()
        {
            StiOptions.Dictionary.AutoSynchronize = StiAutoSynchronizeMode.Always;
            StiOptions.Dictionary.ShowOnlyAliasForDataSource = true;
            StiOptions.Dictionary.ShowOnlyAliasForDataRelation = true;
            StiOptions.Dictionary.ShowOnlyAliasForDatabase = true;
            StiOptions.Dictionary.ShowOnlyAliasForData = true;
            StiOptions.Dictionary.ShowOnlyAliasForDataColumn = true;
            StiOptions.Dictionary.ShowOnlyAliasForPages = true;
            StiOptions.Dictionary.ShowOnlyAliasForComponents = true;
            StiOptions.Dictionary.ShowOnlyAliasForVariable = true;
            StiOptions.Dictionary.BusinessObjects.MaxLevel = 3;
            StiOptions.Dictionary.BusinessObjects.AllowUseDataColumn = true;
            StiOptions.Dictionary.BusinessObjects.AllowUseFields = true;
            StiOptions.Dictionary.BusinessObjects.AllowUseProperties = true;
        }

        private static void SetDesignerOptions()
        {
            StiOptions.Windows.GlobalGuiStyle = StiGlobalGuiStyle.Windows7;
            StiOptions.Designer.ShowSelectTypeOfGuiOption = false;

            StiOptions.Designer.AutoCorrectComponentName = true;
            StiOptions.Designer.AutoCorrectDataColumnName = true;
            StiOptions.Designer.AutoCorrectDataRelationName = true;
            StiOptions.Designer.AutoCorrectDataSourceName = true;
            StiOptions.Designer.AutoCorrectReportName = true;
        }

        private static void SetEngineOptions()
        {
            StiOptions.Engine.HideRenderingProgress = true;
            StiOptions.Engine.HideExceptions = false;
            StiOptions.Engine.HideMessages = false;
        }
    }
Во вложениях скриншот тестового приложения и исходники.

Re: Передача датасета в отчёт, загруженный из сборки

Добавлено: 12 июл 2012, 15:58
Aleksey
Здравствуйте,

Проблема была с очисткой словаря и регистрированием данных для уже скомпилированного отчета.
Пожалуйста, попробуйте убрать очистку словаря перед вызовом уже скомпилированного отчета.

Спасибо.

Re: Передача датасета в отчёт, загруженный из сборки

Добавлено: 13 июл 2012, 13:09
EmeJIbka
Большое спасибо :)
Все заработало.

Re: Передача датасета в отчёт, загруженный из сборки

Добавлено: 13 июл 2012, 14:51
Aleksey
Здравствуйте,

Всегда рады помочь.