Here is my problem. Our shop has three environments that the development team must work with, development, testing and production. I have successfully been able to change the DataSource (WebServiceDataSource) of the master report by changing the ServiceUrl. For subreports I have been able to change the ReportSource based on the environment but I have not been able to locate a way to change the DataSource. Does anyone have an idea how this is done?
Here is the code I have right now:
public class TexasProtaxCustomReportResolver : Telerik.Reporting.Services.Engine.IReportResolver { private readonly string _path; private readonly string _apiUrl; public TexasProtaxCustomReportResolver(string path, string apiUrl) { _path = path; _apiUrl = apiUrl; } public Telerik.Reporting.ReportSource Resolve(string reportName) { var reportPacker = new ReportPackager(); string reportPath = Path.Combine(_path, reportName); using (var sourceStream = System.IO.File.OpenRead( reportPath)) { var report = (Telerik.Reporting.Report)reportPacker.UnpackageDocument(sourceStream); SetReportSource((ReportItemBase)report); var irs = new InstanceReportSource { ReportDocument = report }; return irs; } } private void SetReportSource(ReportItemBase reportItemBase) { if (reportItemBase.Items.Count < 1) return; if (reportItemBase is Telerik.Reporting.Report) { var report = (Telerik.Reporting.Report)reportItemBase; var webServiceDataSource = (WebServiceDataSource)report.DataSource; string url = webServiceDataSource.ServiceUrl; url = url.ToLower().Replace("localhost:5001", _apiUrl); webServiceDataSource.ServiceUrl = url; } foreach (var item in reportItemBase.Items) { // recursively set the reportsource SetReportSource(item); if (item is SubReport subReport) { // Save Parameters var clonable = subReport.ReportSource.Parameters as ICloneable; var parameters = (ParameterCollection)clonable.Clone(); string fileName = Path.GetFileName(subReport.ReportSource.ToString()); var uriReportSource = new UriReportSource { Uri = Path.Combine(_path, fileName) }; uriReportSource.Parameters.AddRange(parameters); subReport.ReportSource = uriReportSource; continue; } } } }