Выполнение запроса при открытие.
Добавлено: 24 июл 2015, 08:23
Можно ли отключить выполнения запроса при открытии отчета, а выполнялся только после нажатие на применить.
Инструмент бизнес-аналитики от компании Stimulsoft. Программное обеспечение для создания дашбордов и отчетов. Инструменты отчетности для любой платформы.
https://forum.stimulsoft.ru/
Код: Выделить всё
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.Dictionary.Databases[0] as StiSqlDatabase).ConnectionString = "test";
Код: Выделить всё
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";
Да Connection String изменяется. Пробовал не вызывать метод SetConnectionString(), но отчет не работает просто белая страница.Aleksey Andreyanov писал(а):Здравствуйте.
Ваша проблема возникает из-за того, что вы удаляете только Connection из Databases, но остаётся Data Source, который ассоциирован с удалённым Connection и он уже не работает.
Для начала уточните меняется ли у вас Connection String?
Если нет, то нет необходимости вызывать метод SetConnectionString().
Если меняется, то проще это сделать с поможю следующего кода:Спасибо.Код: Выделить всё
(report.Dictionary.Databases[0] as StiSqlDatabase).ConnectionString = "test";