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

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

Добавлено: 24 июл 2015, 08:23
Expandel
Можно ли отключить выполнения запроса при открытии отчета, а выполнялся только после нажатие на применить.

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

Добавлено: 24 июл 2015, 13:56
HighAley
Здравствуйте.

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

Спасибо.

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

Добавлено: 28 июл 2015, 10:58
Expandel
Переменные заполняются с сервера. В дизайнере, предварительный просмотр все работает. Но при запуске в asp.net приложении отчет пустой. Версия 2015.01.09. Для отображения используется StiMvcViewer.

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

Добавлено: 29 июл 2015, 09:31
HighAley
Здравствуйте.

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

Спасибо.

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

Добавлено: 29 июл 2015, 11:33
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
    }
})

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

Добавлено: 30 июл 2015, 10:18
HighAley
Здравствуйте.

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

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

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

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

(report.Dictionary.Databases[0] as StiSqlDatabase).ConnectionString = "test";
Спасибо.

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

Добавлено: 30 июл 2015, 15:10
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";
Почему?

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

Добавлено: 30 июл 2015, 17:08
DmitryRu
Вопрос почему следует из Вашего FAQ
http://admin.stimulsoft.com/documentati ... FAQ.En.pdf
Секция 2.1, How do I change database connection?

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

Добавлено: 31 июл 2015, 10:52
HighAley
Здравствуйте, Дмитрий.

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

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

Спасибо.

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

Добавлено: 02 авг 2015, 17:52
Expandel
Aleksey Andreyanov писал(а):Здравствуйте.

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

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

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

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

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