Выполнение запроса при открытие.
Выполнение запроса при открытие.
Можно ли отключить выполнения запроса при открытии отчета, а выполнялся только после нажатие на применить.
Re: Выполнение запроса при открытие.
Здравствуйте.
Да, можно. Успановите свойство Request Parameters в значение True.
Данный вариант не подойдёт, если ваши переменные берут данные из источников данных.
Спасибо.
Да, можно. Успановите свойство Request Parameters в значение True.
Данный вариант не подойдёт, если ваши переменные берут данные из источников данных.
Спасибо.
Re: Выполнение запроса при открытие.
Переменные заполняются с сервера. В дизайнере, предварительный просмотр все работает. Но при запуске в asp.net приложении отчет пустой. Версия 2015.01.09. Для отображения используется StiMvcViewer.
Re: Выполнение запроса при открытие.
Здравствуйте.
Уточните, пожалуйста, вы задаёте значения переменных на сервере или пользователь вводит их значения во вьювере?
Будет более удобно обсуждать вашу проблему, если мы будем видеть ваш шаблон отчёта, а также ваш код на стороне сервера.
Спасибо.
Уточните, пожалуйста, вы задаёте значения переменных на сервере или пользователь вводит их значения во вьювере?
Будет более удобно обсуждать вашу проблему, если мы будем видеть ваш шаблон отчёта, а также ваш код на стороне сервера.
Спасибо.
Re: Выполнение запроса при открытие.
Добрый день
View
Код: Выделить всё
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;
}
Код: Выделить всё
@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 КБ) 341 скачивание
Re: Выполнение запроса при открытие.
Здравствуйте.
Ваша проблема возникает из-за того, что вы удаляете только Connection из Databases, но остаётся Data Source, который ассоциирован с удалённым Connection и он уже не работает.
Для начала уточните меняется ли у вас Connection String?
Если нет, то нет необходимости вызывать метод SetConnectionString().
Если меняется, то проще это сделать с поможю следующего кода:
Спасибо.
Ваша проблема возникает из-за того, что вы удаляете только Connection из Databases, но остаётся Data Source, который ассоциирован с удалённым Connection и он уже не работает.
Для начала уточните меняется ли у вас Connection String?
Если нет, то нет необходимости вызывать метод SetConnectionString().
Если меняется, то проще это сделать с поможю следующего кода:
Код: Выделить всё
(report.Dictionary.Databases[0] as StiSqlDatabase).ConnectionString = "test";
Re: Выполнение запроса при открытие.
У нас 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: Выполнение запроса при открытие.
Вопрос почему следует из Вашего FAQ
http://admin.stimulsoft.com/documentati ... FAQ.En.pdf
Секция 2.1, How do I change database connection?
http://admin.stimulsoft.com/documentati ... FAQ.En.pdf
Секция 2.1, How do I change database connection?
Re: Выполнение запроса при открытие.
Здравствуйте, Дмитрий.
Если вы используете метод из FAQ, то необходимо создавать Connection с тем же именем, которое было.
Синхронизация не поможет, если у вас нету источника данных в созданном Connection.
Лучше изменяйте строку напрямую, если надо только её изменить, а всё остальное (Источники данных, солонки в них) остаются неизменными.
В FAQ описана ситуация, когда необходимо поменять тип Connection, например заменить MSSQL на MySQL.
Спасибо.
Если вы используете метод из FAQ, то необходимо создавать Connection с тем же именем, которое было.
Синхронизация не поможет, если у вас нету источника данных в созданном Connection.
Лучше изменяйте строку напрямую, если надо только её изменить, а всё остальное (Источники данных, солонки в них) остаются неизменными.
В FAQ описана ситуация, когда необходимо поменять тип Connection, например заменить MSSQL на MySQL.
Спасибо.
Re: Выполнение запроса при открытие.
Да Connection String изменяется. Пробовал не вызывать метод SetConnectionString(), но отчет не работает просто белая страница.Aleksey Andreyanov писал(а):Здравствуйте.
Ваша проблема возникает из-за того, что вы удаляете только Connection из Databases, но остаётся Data Source, который ассоциирован с удалённым Connection и он уже не работает.
Для начала уточните меняется ли у вас Connection String?
Если нет, то нет необходимости вызывать метод SetConnectionString().
Если меняется, то проще это сделать с поможю следующего кода:Спасибо.Код: Выделить всё
(report.Dictionary.Databases[0] as StiSqlDatabase).ConnectionString = "test";