I have a parameter for a report that connects to a datasource.
It pulls back a list of items from which the user can select one to run the report against.
That parameter pulls its data from a datasource that I added via the report designer.
I added the resulting trdx file to my winForms visual studio project.
I need to be able to change the connection string of the datasource the parameter is using at run time.
I was able to deserialize the trdx file easily enough with some code I found here in this forum.
But I could not figure out how to change the connectionstring for a parameter's datasource.
How would I go about doing that?
Thanks,Jim
7 Answers, 1 is accepted
Please test usingthe approach illustrated in the code snippet of the Changing the connection string dynamically according to runtime data KB article.
Let us know how it goes and if you need further help.
Regards,
Stef
Telerik
Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.
http://www.telerik.com/support/kb/reporting/details/changing-the-connection-string-dynamically-according-to-runtime-data
However I end up getting this error: "Unable to get report parameters: Missing report name"
Here is the ReportsServiceController:
public
class
ReportsServiceController : ReportsControllerBase
{
protected
override
IReportResolver CreateReportResolver()
{
var reportsPath = HttpContext.Current.Server.MapPath(
"~/Content/Reports"
);
return
new
ReportFileResolver(reportsPath)
.AddFallbackResolver(
new
ReportTypeResolver());
}
protected
override
ICache CreateCache()
{
return
Telerik.Reporting.Services.Engine.CacheFactory.CreateFileCache();
}
}
Code for the controller for the view containing the ReportViewer
public
ActionResult Index()
{
var connStringManager =
new
ReportConnectionStringController();
var uri = Server.MapPath(
"/Content/Reports/Venta.trdx"
);
var report =
new
UriReportSource() { Uri = uri };
report.Parameters.Add(
new
Parameter(
"ptIdUnica"
, 3));
var changeReport = connStringManager.UpdateReportSource(report)
as
InstanceReportSource;
return
View(
new
ReportModel() { TheReport = changeReport });
}
that ReportModel.TheReport
public
class
ReportModel
{
public
InstanceReportSource TheReport {
get
;
set
; }
}
And the View:
@model PuntoVentaWeb.ViewModels.ReportModel
@
using
Telerik.ReportViewer.Mvc
@section styles
{
<link href=
"~/ReportViewer/styles/ReportViewer-7.2.14.127.css"
rel=
"stylesheet"
/>
<style>
#reportViewer1 {
position: absolute;
left: 5px;
right: 5px;
top: 5px;
bottom: 5px;
overflow: hidden;
}
</style>
}
@section scripts
{
<!--kendo.all.min.js can be used
as
well instead of kendo.web.min.js and kendo.mobile.min.js-->
<!--kendo.mobile.min.js - optional,
if
gestures/touch support
is
required-->
<link href=
"//netdna.bootstrapcdn.com/font-awesome/3.2.1/css/font-awesome.css"
rel=
"stylesheet"
>
<script src=
"~/ReportViewer/js/ReportViewer-7.2.14.127.js"
></script>
}
@{
ViewBag.Title =
"Report Viewer"
;
@(Html.TelerikReporting().ReportViewer()
.Id(
"reportViewer1"
)
.ServiceUrl(
"/api/ReportsService/"
)
.TemplateUrl(@Url.Content(
"~/ReportViewer/templates/telerikReportViewerTemplate.html"
))
.ReportSource(Model.TheReport)
.ViewMode(ViewModes.INTERACTIVE)
.ScaleMode(ScaleModes.SPECIFIC)
.Scale(1.0)
.PersistSession(
false
)
)
}
Please Any help is appreciated
[quote]Stef said:Hello Jim,
Please test usingthe approach illustrated in the code snippet of the Changing the connection string dynamically according to runtime data KB article.
Let us know how it goes and if you need further help.
Regards,
Stef
Telerik
Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.
Please check the details regarding the HTML5 Report Viewer in the Call service to bind the report forum thread (How the viewer(client)-service pair works).
In order to change the connection strings in the report, you will need a custom report resolver for the Reporting REST service's CreateReportResolver method.
In that resolver's Resolve method you can place the logic for replacing the connection strings and returning a valid report source object.
Let us know if you have any further questions.
Regards,
Stef
Telerik
Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.
I am also trying to set the connection string dynamically using http://www.telerik.com/support/kb/reporting/details/changing-the-connection-string-dynamically-according-to-runtime-data. I have not been able to find any of the posts helpful.
I use an MVC View and am trying to use what was mentioned in the above post but have not been able to successfully get it to work. I am also passing parameters into the UriReportSource.
var reportSource = new Telerik.Reporting.UriReportSource()
{
Uri = "MyReport.trdx",
Parameters = {new Parameter { Name="​x" , Value = Model.X},
new Parameter {Name = "​y", Value= ​Model.Y},
new Parameter {Name = "​z", Value=Model.​Z},
}
};
var connectionString = ​​"[insert connection string here]";
var connectionStringHandler = new ​ProjectName.Classes.ReportConnectionStringManager(connectionString);
var newReportSource = connectionStringHandler.UpdateReportSource(reportSource);
@(Html.TelerikReporting().ReportViewer()
.Id("reportViewer1")
.ServiceUrl(ConfigurationManager.AppSettings["basePath"] + "/api/ReportSetup/")
.TemplateUrl(ConfigurationManager.AppSettings["basePath"] + "/ReportViewer/templates/telerikReportViewerTemplate-8.1.14.618.html")
.ReportSource(newReportSource)
)
Instead of pointing me to a custom report resolver, if that is what is needed, please provide me exactly how I can do it in code and where to place the code. An example project would be helpful too. Help would be greatly appreciated. Thanks!
The HTML5 Viewer sends only string description which report to be resolved on the server, not the whole report instance - How it works.
Thus you can keep the current settings where you pass a server path to a TRDX file. Then you will have to use a custom resolver in the Reporting REST service to get the passed string, obtain the TRDX file, deserialize and modify it.
For example:
static
ReportsController()
{
// var appPath = HttpContext.Current.Server.MapPath("~/");
// var reportsPath = Path.Combine(appPath, @"..\..\..\Report Designer\Examples");
// var resolver = new ReportFileResolver(reportsPath)
// .AddFallbackResolver(new ReportTypeResolver());
configurationInstance =
new
ReportServiceConfiguration
{
HostAppId =
"Html5DemoApp"
,
Storage =
new
FileStorage(),
ReportResolver =
new
MyResolver(),
//resolver,
//ReportSharingTimeout = 0,
//ClientSessionTimeout = 0,
};
}
//the custom resolver
public
class
MyResolver : IReportResolver
{
//this method will be called on each request for report (refresh, navigate to report, sub report, parameters updates)
//the method will be called 3 times on initial load
public
Telerik.Reporting.ReportSource Resolve(
string
report)
{
Report reportInstance =
null
;
if
(report.Contains(
"SampleReport"
))
{
//retrieve an instance of the report
reportInstance = DeserializeReport(report);;
//change the report's DataSource settings
(reportInstance.DataSource
as
Telerik.Reporting.SqlDataSource).ConnectionString =
"new string here"
;
//change a nested data item's DataSource
((reportInstance.Items.Find(
"table1"
,
true
)[0]
as
Telerik.Reporting.Table).DataSource =GetStoredOnTheServerData();
//set report parameters values
reportInstance.ReportParameters[
"UserId"
].Value = GetUserId();
}
return
new
InstanceReportSource { ReportDocument = reportInstance};
}
}
/////////////////test the above with calling a randome SampleReport report
<script type=
"text/javascript"
>
$(document).ready(function () {
$(
"#reportViewer1"
)
.telerik_ReportViewer({
serviceUrl:
"api/reports/"
,
templateUrl:
'ReportViewer/templates/telerikReportViewerTemplate-9.1.15.731.html'
,
//ReportSource - report description
reportSource: {
report:
"SampleReport.trdx"
,
// Parameters name value dictionary
parameters: { }
},
viewMode: telerikReportViewer.ViewModes.INTERACTIVE,
});
});
I hope this information is helpful.
Regards,
Stef
Telerik
When implementing your code above, the line:
reportInstance = DeserializeReport(report);;
Gives an error 'The name 'DeserializeReport' does not exist in the current context'. AS far as I can tell I have all the correct references/usings - please advise?