Выполнение запроса при открытие.

Обсуждение Stimulsoft Reports.WEB
Expandel
Сообщения: 5
Зарегистрирован: 24 июл 2015, 08:19

Выполнение запроса при открытие.

Сообщение Expandel »

Можно ли отключить выполнения запроса при открытии отчета, а выполнялся только после нажатие на применить.
HighAley
Сообщения: 1998
Зарегистрирован: 08 июн 2011, 11:36
Откуда: Stimulsoft Office

Re: Выполнение запроса при открытие.

Сообщение HighAley »

Здравствуйте.

Да, можно. Успановите свойство Request Parameters в значение True.
Данный вариант не подойдёт, если ваши переменные берут данные из источников данных.

Спасибо.
Expandel
Сообщения: 5
Зарегистрирован: 24 июл 2015, 08:19

Re: Выполнение запроса при открытие.

Сообщение Expandel »

Переменные заполняются с сервера. В дизайнере, предварительный просмотр все работает. Но при запуске в asp.net приложении отчет пустой. Версия 2015.01.09. Для отображения используется StiMvcViewer.
HighAley
Сообщения: 1998
Зарегистрирован: 08 июн 2011, 11:36
Откуда: Stimulsoft Office

Re: Выполнение запроса при открытие.

Сообщение HighAley »

Здравствуйте.

Уточните, пожалуйста, вы задаёте значения переменных на сервере или пользователь вводит их значения во вьювере?
Будет более удобно обсуждать вашу проблему, если мы будем видеть ваш шаблон отчёта, а также ваш код на стороне сервера.

Спасибо.
Expandel
Сообщения: 5
Зарегистрирован: 24 июл 2015, 08:19

Re: Выполнение запроса при открытие.

Сообщение Expandel »

Добрый день

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

 public ReportController(ICurrentUserKeeper session)
        {
            StiOptions.Engine.AllowPrepareSqlQueries = false;
        }

        public ActionResult Index()
        {
            return View();
        }

        public ActionResult GetReportSnapshot()
        {
            var routeValues = StiMvcViewer.GetRouteValues(HttpContext);
            var id = 1;
            if (routeValues["id"] != null)
                id = Convert.ToInt32(routeValues["id"]);

            var report = LoadReport(id);
            var connStr = ConfigurationManager.ConnectionStrings["ReportConnection"].ConnectionString;
            SetConnectionString(report, connStr);
            SetParams(report);

            return StiMvcViewer.GetReportSnapshotResult(HttpContext, report);
        }

        public ActionResult ViewerEvent()
        {
            return StiMvcViewer.ViewerEventResult(HttpContext);
        }

        public ActionResult GetReports()
        {
            var reports = LoadReportsFromFile()
                .Select(r => new { r.Id, r.NameRu })
                .OrderBy(ob=>ob.NameRu);

            return Json(reports, JsonRequestBehavior.AllowGet);
        }

        // StiMvcViewer
        public ActionResult PrintReport()
        {
            return StiMvcViewer.PrintReportResult(HttpContext);
        }

        public FileResult ExportReport()
        {
            return StiMvcViewer.ExportReportResult(HttpContext);
        }

        public ActionResult Interaction()
        {
            return StiMvcViewer.InteractionResult(HttpContext);
        }
  
        /// <summary>
        /// Получить список объектов ReportModel содержащих шаблон отчета и его идентификатор из файла
        /// </summary>
        /// <returns>список объектов ReportModel</returns>
        private IEnumerable<ReportModel> LoadReportsFromFile()
        {
            if (_reports != null)
                return _reports;

            _reports = new List<ReportModel>();

            var reportDir = ConfigurationManager.AppSettings["ReportDir"];
            var reportListFile = ConfigurationManager.AppSettings["ReportListFile"];
            var path = Server.MapPath(Path.Combine(reportDir, reportListFile));
            var lines = System.IO.File.ReadAllLines(path);
            foreach (var line in lines)
            {
                var reportInfo = line.Split('?');
                if (reportInfo.Length < 2)
                    continue;

                int key;
                if (!int.TryParse(reportInfo[0], out key))
                    continue;

                var currentReport = _reports.SingleOrDefault(r => r.Id == key);

                if (Convert.ToBoolean(reportInfo[3]))
                {
                    var right = reportInfo[1].Replace(".mrt", "");
                    if (!_authorizer.Check(new[] { right }))
                    {
                        continue;
                    }
                }

                if (currentReport != null)
                {
                    currentReport.Id = key;
                    currentReport.FileName = reportInfo[1];
                    currentReport.NameRu = reportInfo.Length < 3 ? "н/у" : reportInfo[2];
                }
                else
                {
                    _reports.Add(new ReportModel
                    {
                        Id = key,
                        FileName = reportInfo[1],
                        NameRu = reportInfo.Length < 3 ? "н/у" : reportInfo[2]
                    });
                }
            }

            return _reports;
        }

        private StiReport LoadReport(int id)
        {
            var reports = LoadReportsFromFile();
            var reportModel = reports.SingleOrDefault(r => r.Id == id);

            if (reportModel == null)
                return null;

            var report = new StiReport();
            var reportDir = ConfigurationManager.AppSettings["ReportDir"];
            var path = Server.MapPath(Path.Combine(reportDir, reportModel.FileName));
            report.Load(path);

            return report;
        }

        private void SetConnectionString(StiReport report, string connStr)
        {
            report.Dictionary.Databases.Clear();

            var dataBase = new StiSqlDatabase("ReportConnection", connStr);
            report.Dictionary.Databases.Add(dataBase);
            report.Compile();
        }

        private void SetParams(StiReport report)
        {
            var user = _session.GetCurrentUser();
            if (user != null)
                report["CurrentUser"] = user.FullName;
        }
View

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

@using Stimulsoft.Report.Mvc;

@Html.Stimulsoft().StiMvcViewer(new StiMvcViewerOptions 
{
    Theme = StiTheme.Office2010,
    ActionGetReportSnapshot = "GetReportSnapshot",
    ActionViewerEvent = "ViewerEvent",
    ActionPrintReport = "PrintReport",
    ActionExportReport = "ExportReport",
    ActionInteraction = "Interaction",
    Localization = " ~/App_Data/Reports/ru.xml",
    ClientRequestTimeout = 1800,
    Server =
    {
        GlobalReportCache = false
    }
})
Вложения
Report.mrt
(17.89 КБ) 339 скачиваний
HighAley
Сообщения: 1998
Зарегистрирован: 08 июн 2011, 11:36
Откуда: Stimulsoft Office

Re: Выполнение запроса при открытие.

Сообщение HighAley »

Здравствуйте.

Ваша проблема возникает из-за того, что вы удаляете только Connection из Databases, но остаётся Data Source, который ассоциирован с удалённым Connection и он уже не работает.

Для начала уточните меняется ли у вас Connection String?
Если нет, то нет необходимости вызывать метод SetConnectionString().

Если меняется, то проще это сделать с поможю следующего кода:

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

(report.Dictionary.Databases[0] as StiSqlDatabase).ConnectionString = "test";
Спасибо.
DmitryRu
Сообщения: 163
Зарегистрирован: 19 май 2014, 10:40

Re: Выполнение запроса при открытие.

Сообщение DmitryRu »

У нас Connection String не меняется во время жизни приложения, однако, при деплойменте на рантайм сервер, он конечно не такой, как у разработчика.
Мы решаем проблему так, вроде работает

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

        private void LoadNotCompiled(Stream stream, StiReport report, string newConnectionString)
        {
                report.Load(stream);
                report.Dictionary.Databases.Clear();
                report.Dictionary.Databases.Add(new StiSqlDatabase("myConnection", newConnectionString));
                report.Dictionary.Synchronize();
        }
На хватит ли этого вызова?

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

report.Dictionary.Synchronize();
Или лучше делать, как Вы советуете:

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

(report.Dictionary.Databases[0] as StiSqlDatabase).ConnectionString = "test";
Почему?
DmitryRu
Сообщения: 163
Зарегистрирован: 19 май 2014, 10:40

Re: Выполнение запроса при открытие.

Сообщение DmitryRu »

Вопрос почему следует из Вашего FAQ
http://admin.stimulsoft.com/documentati ... FAQ.En.pdf
Секция 2.1, How do I change database connection?
HighAley
Сообщения: 1998
Зарегистрирован: 08 июн 2011, 11:36
Откуда: Stimulsoft Office

Re: Выполнение запроса при открытие.

Сообщение HighAley »

Здравствуйте, Дмитрий.

Если вы используете метод из FAQ, то необходимо создавать Connection с тем же именем, которое было.
Синхронизация не поможет, если у вас нету источника данных в созданном Connection.
Лучше изменяйте строку напрямую, если надо только её изменить, а всё остальное (Источники данных, солонки в них) остаются неизменными.

В FAQ описана ситуация, когда необходимо поменять тип Connection, например заменить MSSQL на MySQL.

Спасибо.
Expandel
Сообщения: 5
Зарегистрирован: 24 июл 2015, 08:19

Re: Выполнение запроса при открытие.

Сообщение Expandel »

Aleksey Andreyanov писал(а):Здравствуйте.

Ваша проблема возникает из-за того, что вы удаляете только Connection из Databases, но остаётся Data Source, который ассоциирован с удалённым Connection и он уже не работает.

Для начала уточните меняется ли у вас Connection String?
Если нет, то нет необходимости вызывать метод SetConnectionString().

Если меняется, то проще это сделать с поможю следующего кода:

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

(report.Dictionary.Databases[0] as StiSqlDatabase).ConnectionString = "test";
Спасибо.
Да Connection String изменяется. Пробовал не вызывать метод SetConnectionString(), но отчет не работает просто белая страница.
Ответить