This is a migrated thread and some comments may be shown as answers.

How to get rid of this Error without copy subreport's trdp file in to debug folder ?

3 Answers 441 Views
General Discussions
This is a migrated thread and some comments may be shown as answers.
Omer47
Top achievements
Rank 1
Omer47 asked on 11 Sep 2019, 02:11 PM

I successfully make an example Winforms App which is taking parameters from user and then exports report which has a subreport to pdf. But I have an problem which I can solve just by putting the subreport's trdp file in the debug folder which is in the project. But I want to put subreport's trdp file where I want to put without getting the error. How can I do that ? I will attach the error I am getting. The error is written in Turkish. But It basically says I couldn't find the file "C:\Users\OE\source\repos\TelerikReportsDenemeForm\TelerikReportsDenemeForm\bin\Debug\denemereportabv.trdp".       

Here is my code : 

001.namespace TelerikReportsDenemeForm
002.{
003.    class ReportConnectionStringManager
004.    {
005.        readonly string connectionString;
006. 
007.        public ReportConnectionStringManager(string connectionString)
008.        {
009.            this.connectionString = connectionString;
010.        }
011. 
012.        public ReportSource UpdateReportSource(ReportSource sourceReportSource)
013.        {
014.            if (sourceReportSource is UriReportSource)
015.            {
016.                var uriReportSource = (UriReportSource)sourceReportSource;
017.                // unpackage TRDP report
018.                // http://docs.telerik.com/reporting/report-packaging-trdp#unpackaging
019.                var reportInstance = UnpackageReport(uriReportSource);
020.                // or deserialize TRDX report(legacy format)
021.                // http://docs.telerik.com/reporting/programmatic-xml-serialization#deserialize-report-definition-from-xml-file
022.                // var reportInstance = DeserializeReport(uriReportSource);
023.                ValidateReportSource(uriReportSource.Uri);
024.                this.SetConnectionString(reportInstance);
025.                return CreateInstanceReportSource(reportInstance, uriReportSource);
026.            }
027. 
028.            if (sourceReportSource is XmlReportSource)
029.            {
030.                var xml = (XmlReportSource)sourceReportSource;
031.                ValidateReportSource(xml.Xml);
032.                var reportInstance = this.DeserializeReport(xml);
033.                this.SetConnectionString(reportInstance);
034.                return CreateInstanceReportSource(reportInstance, xml);
035.            }
036. 
037.            if (sourceReportSource is InstanceReportSource)
038.            {
039.                var instanceReportSource = (InstanceReportSource)sourceReportSource;
040.                this.SetConnectionString((ReportItemBase)instanceReportSource.ReportDocument);
041.                return instanceReportSource;
042.            }
043. 
044.            if (sourceReportSource is TypeReportSource)
045.            {
046.                var typeReportSource = (TypeReportSource)sourceReportSource;
047.                var typeName = typeReportSource.TypeName;
048.                ValidateReportSource(typeName);
049.                var reportType = Type.GetType(typeName);
050.                var reportInstance = (Report)Activator.CreateInstance(reportType);
051.                this.SetConnectionString((ReportItemBase)reportInstance);
052.                return CreateInstanceReportSource(reportInstance, typeReportSource);
053.            }
054. 
055.            throw new NotImplementedException("Handler for the used ReportSource type is not implemented.");
056.        }
057. 
058.        ReportSource CreateInstanceReportSource(IReportDocument report, ReportSource originalReportSource)
059.        {
060.            var instanceReportSource = new InstanceReportSource { ReportDocument = report };
061.            instanceReportSource.Parameters.AddRange(originalReportSource.Parameters);
062.            return instanceReportSource;
063.        }
064. 
065.        void ValidateReportSource(string value)
066.        {
067.            if (value.Trim().StartsWith("="))
068.            {
069.                throw new InvalidOperationException("Expressions for ReportSource are not supported when changing the connection string dynamically");
070.            }
071.        }
072. 
073.        Report UnpackageReport(UriReportSource uriReportSource)
074.        {
075.            var reportPackager = new ReportPackager();
076.            using (var sourceStream = System.IO.File.OpenRead(uriReportSource.Uri))
077.            {
078.                var report = (Report)reportPackager.UnpackageDocument(sourceStream);
079.                return report;
080.            }
081.        }
082. 
083.        Report DeserializeReport(UriReportSource uriReportSource)
084.        {
085.            var settings = new System.Xml.XmlReaderSettings();
086.            settings.IgnoreWhitespace = true;
087.            using (var xmlReader = System.Xml.XmlReader.Create(uriReportSource.Uri, settings))
088.            {
089.                var xmlSerializer = new Telerik.Reporting.XmlSerialization.ReportXmlSerializer();
090.                var report = (Telerik.Reporting.Report)xmlSerializer.Deserialize(xmlReader);
091.                return report;
092.            }
093.        }
094. 
095.        Report DeserializeReport(XmlReportSource xmlReportSource)
096.        {
097.            var settings = new System.Xml.XmlReaderSettings();
098.            settings.IgnoreWhitespace = true;
099.            var textReader = new System.IO.StringReader(xmlReportSource.Xml);
100.            using (var xmlReader = System.Xml.XmlReader.Create(textReader, settings))
101.            {
102.                var xmlSerializer = new Telerik.Reporting.XmlSerialization.ReportXmlSerializer();
103.                var report = (Telerik.Reporting.Report)xmlSerializer.Deserialize(xmlReader);
104.                return report;
105.            }
106.        }
107. 
108.        void SetConnectionString(ReportItemBase reportItemBase)
109.        {
110.            if (reportItemBase.Items.Count < 1)
111.                return;
112. 
113.            if (reportItemBase is Report)
114.            {
115.                var report = (Report)reportItemBase;
116. 
117.                if (report.DataSource is SqlDataSource)
118.                {
119.                    var sqlDataSource = (SqlDataSource)report.DataSource;
120.                    sqlDataSource.ConnectionString = connectionString;
121.                }
122.                foreach (var parameter in report.ReportParameters)
123.                {
124.                    if (parameter.AvailableValues.DataSource is SqlDataSource)
125.                    {
126.                        var sqlDataSource = (SqlDataSource)parameter.AvailableValues.DataSource;
127.                        sqlDataSource.ConnectionString = connectionString;
128.                    }
129.                }
130.            }
131. 
132.            foreach (var item in reportItemBase.Items)
133.            {
134.                //recursively set the connection string to the items from the Items collection
135.                SetConnectionString(item);
136. 
137.                //set the drillthrough report connection strings
138.                var drillThroughAction = item.Action as NavigateToReportAction;
139.                if (null != drillThroughAction)
140.                {
141.                    var updatedReportInstance = this.UpdateReportSource(drillThroughAction.ReportSource);
142.                    drillThroughAction.ReportSource = updatedReportInstance;
143.                }
144. 
145.                if (item is SubReport)
146.                {
147.                    var subReport = (SubReport)item;
148.                    subReport.ReportSource = this.UpdateReportSource(subReport.ReportSource);
149.                    continue;
150.                }
151. 
152.                //Covers all data items(Crosstab, Table, List, Graph, Map and Chart)
153.                if (item is DataItem)
154.                {
155.                    var dataItem = (DataItem)item;
156.                    if (dataItem.DataSource is SqlDataSource)
157.                    {
158.                        var sqlDataSource = (SqlDataSource)dataItem.DataSource;
159.                        sqlDataSource.ConnectionString = connectionString;
160.                        continue;
161.                    }
162.                }
163. 
164.            }
165.        }
166.    }
167. 
168.    public partial class Form1 : Form
169.    {
170.        public Form1()
171.        {
172.            InitializeComponent();
173.        }
174. 
175.        private void BtnExportPDF_Click(object sender, EventArgs e)
176.        {
177.            var reportProcessor = new Telerik.Reporting.Processing.ReportProcessor();
178. 
179.            // set any deviceInfo settings if necessary
180.            var deviceInfo = new System.Collections.Hashtable();
181. 
182.            // Depending on the report definition choose ONE of the following REPORT SOURCES
183. 
184. 
185.            ////                  -2-
186.            //// ***Declarative (TRDP/TRDX) report definitions***
187.            var reportSource = new Telerik.Reporting.UriReportSource();
188. 
189.            //// reportName is the path to the TRDP/TRDX file
190.            reportSource.Uri = @"C:\Users\OE\Desktop\TelerikReport\Deneme.trdp";
191.            ////                  -2-
192.            ReportConnectionStringManager reportConnection = new ReportConnectionStringManager("Data Source=192.168.6.198:1521/TEST2;User Id=smart;Password=a;");
193.            ReportSource rs = reportConnection.UpdateReportSource(reportSource);
194.             
195. 
196. 
197.            ////                  -3-
198.            //// ***Instance of the report definition***
199.            //var reportSource = new Telerik.Reporting.InstanceReportSource();
200. 
201.            //// Report1 is the class of the report. It should inherit Telerik.Reporting.Report class
202.            //reportSource.ReportDocument = new Report1();
203.            ////                  -3-
204.            object parameterValue = txtBasDep.Text;
205.            rs.Parameters.Add("basdepid", parameterValue);
206.            object parameterValue1 = txtBitDep.Text;
207.            rs.Parameters.Add("bitdepid", parameterValue1);
208.            object parameterValue2 = txtSonDogum.Text;
209.            rs.Parameters.Add("sondogumtar", parameterValue2);
210. 
211.            Telerik.Reporting.Processing.RenderingResult result = reportProcessor.RenderReport("PDF", rs, deviceInfo);
212. 
213. 
214. 
215.            string filePath = @"C:\Users\OE\Desktop\TelerikReport\Deneme.pdf";
216. 
217.            using (System.IO.FileStream fs = new System.IO.FileStream(filePath, System.IO.FileMode.Create))
218.            {
219.                fs.Write(result.DocumentBytes, 0, result.DocumentBytes.Length);
220.            }
221. 
222.            MessageBox.Show("The report has been exported!", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
223.        }
224.    }
225.}

3 Answers, 1 is accepted

Sort by
0
Silviya
Telerik team
answered on 16 Sep 2019, 10:32 AM

Hi Ömer,

The error message states that the subreport cannot be found in the execution folder of the application. As you have a master-detail scenario, main and sub reports must be placed relative to each other as when they were designed. When you add the TRDX|TRDP files to the solution structure set each file's Build Action to Content, and Copy to Output Directory to Copy if Newer or Always. This will assure the report file is copied relative to the execution folder of the application and it will be discovered during the processing.

Best Regards,
Silviya
Progress Telerik

Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Feedback Portal and vote to affect the priority of the items
0
Omer47
Top achievements
Rank 1
answered on 16 Sep 2019, 12:06 PM
I am designing my reports in End-User Report designer. Then I am taking trdp files and I am exporting them to pdf programmatically. I think in this scenario, I must embed subreport in mainreport's trdp file. But I dont know how to do that. Can you explain me how to embed subreport into main report. I cant find any tutorials about this.
0
Silviya
Telerik team
answered on 18 Sep 2019, 09:36 AM

Hi Ömer,

Yes, that's correct. You can set ReportSource property for SubReport item through the Standalone Report Designer by following these steps from Set the Report Source through the Report Designer section.

As you are using TRDP files, select the URL or file option and in the Select a file or enter a valid URL drop-down choose <Select a file> which will open a File Explorer to choose the subreport file.

Click Edit Parameters button in case you need to pass a report parameter from the main report to the detail report. In the Parameter Value, type or select the value to pass to the parameter in the detail report.

Best Regards,
Silviya
Progress Telerik

Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Feedback Portal and vote to affect the priority of the items
Tags
General Discussions
Asked by
Omer47
Top achievements
Rank 1
Answers by
Silviya
Telerik team
Omer47
Top achievements
Rank 1
Share this question
or