I ran into the following issue when trying to build a report and although I finally found the answer in Telerik's documentation it wasn't without some lost productivity. Perhaps this thread can help out some other developers.
Scenario:
So I was working on the visual representation on a number of .aspx web pages and
I had to switch over to create a report that was a form letter. My typical process when I develop in this fashion is to...
- Develop the report without a data source
- Call the report programmatically and give it a data source
- Output the report to the web viewer, pdf or some other export format
In the form letter I wanted to create a date in a certain format and an inside address for the letter. I created two user
functions to accomplish this. [Note: If you haven't looked into using user functions for your Telerik reports then I would
recommend doing so as Telerik has provided a powerful mechanism for extending functionality].
In my Telerik Reporting Class Library, I added a class file named UserFunctions.vb Here is the code:
Public Class UserFunctions Public Shared Function GetAddress(ByVal Name As Object, ByVal Addr1 As Object, ByVal Addr2 As Object, ByVal City As Object, ByVal State As Object, ByVal PostalCode As Object, ByVal Country As Object) As String Dim address As String = "" If Not IsDBNull(Name) AndAlso Name IsNot Nothing Then address &= Name.ToString.Trim & vbCr End If If Not IsDBNull(Addr1) AndAlso Addr1 IsNot Nothing Then address &= Addr1.ToString.Trim & vbCr End If If Not IsDBNull(Addr2) AndAlso Addr2 IsNot Nothing AndAlso Addr2.ToString.Trim.Length > 0 Then address &= Addr2.ToString.Trim & vbCr End If If Not IsDBNull(City) AndAlso City IsNot Nothing Then address &= City.ToString.Trim End If If Not IsDBNull(State) AndAlso State IsNot Nothing Then address &= ", " & State.ToString.Trim End If If Not IsDBNull(PostalCode) AndAlso PostalCode IsNot Nothing Then address &= " " & PostalCode.ToString.Trim & vbCr End If If Not IsDBNull(Country) AndAlso Country IsNot Nothing AndAlso Country.ToString.Trim.Length > 0 Then address &= Country.ToString.Trim End If Return address End Function Public Shared Function GetLetterDate() As String Dim val As String = "" val = Now().ToString("MMMM d, yyyy") Return val End Function End ClassThe first function GetAddress takes several input parameters and builds an address. The second function GetLetterDate() returns a date in the format (April 5, 2012).
This information I wanted to go into the Report Header section. (Here is my mistake!!!) Since I wanted the info of these 2 User Functions to show up side by side, I dropped a Table into the Report Header section of my Report. I re-formatted the table to 1 row with 2 columns and entered the correct syntax for calling the user functions. When I ran the report, my GetAddress function returned an empty string. What was going on?
After wasting a decent amount of time, troubleshooting I finally figured out that the inputs to the GetAddress function were empty. Why would the data source data be empty? It wasn't when I passed it in.
Several days later (after solving the problem in a completely different way), I came across the following line in Telerik's documentation:
The Table report item is a separate data region and does not make use of the report's data source. It has its own Table..::.DataSource property which you have to set in order to populate the item with data.
And that was my whole problem! I gave the Report a Data Source programmically.
Private Function ShowManagementLetterTest() As Telerik.Reporting.Report Dim showId As Integer = CInt(ID) Dim dtHdr As DataTable = csiShowDB.GetShowManagementLetter(showId) Dim report1 As New EmgLOSReports.TestReport1 report1.DataSource = dtHdr Return report1 End FunctionBut I never gave the Table a Data Source (which can easily be accomplished with the following event code in the report itself)
Private Sub Table2_NeedDataSource(ByVal sender As Object, ByVal e As System.EventArgs) Handles Table2.NeedDataSource If Table2.DataSource Is Nothing Then Table2.DataSource = Report.DataSource Dim dt As DataTable = CType(Report.DataSource, DataTable) TextBox10.Value = dt.Rows.Count.ToString End IfEnd SubNow, my whole problem started because I had carried over a style practice from web pages (using tables to line things up) to Telerik.Reporting (which does not need tables to align columns).
So, here were the learnings on my part...
- Make sure that your guidelines and practices apply to your environment (I was in Telerik Reporting not web pages)
- Always keep in mind that there usually is a simpler way to solve your current dilemma (I didn't need tables to align items in Reporting)
- Telerik Reporting Tables require their own data sources!!!
I am attaching a PDF test report that shows the differences of using a Table with and without its' own data source.