I would like to create a rdlc report at run time. I don't want to fix the columns because my query changes each time. Also, I would like to set the report layout at run time. How can this be accomplished?
This is the schema on how I programmed the visibility of the columns in my reports:
Create a tabular report with all the colums
Add a function in the report code section, the name could be IsHidden(String ColumnName)
Change the visibility of every column to =IsHidden("YourColumnName"), ColumnName needs to change every column
When executing the report:
Read the report inside an xml document
analyze the RDLC, get all the nodes with the isHidden function, replace it with True or False depending on what columns you need to show or hide.
You can select all the nodes containing the IsHidden function using this snippet:
System.Xml.XmlNodeList TableColunmnList = xmldoc.SelectNodes("rs:Report//*/rs:Visibility[rs:Hidden='=Code.IsHidden(\"" + FieldName + "\")']", xmlnsManager);
reload the RDL code using this code, XmlReport is the RDL code
System.IO.TextReader reader = new System.IO.StringReader(XmlReport);
reportViewer1.Reset();
reportViewer1.LocalReport.LoadReportDefinition(reader);
That's all, your report has dynamic visibility on all the columns.
Related
In SSRS I have a parameter which is of type integer.
Parameter values are bound from dataset, so that after the report gets loaded we can select parameter and run the report.
My situation is I have to pass the same parameter from web app without disturbing the existing functionality. Like "1,2,3" these are Id's which exists in the dropdown.
Elaborating the issue:
I have a query in SSRS dataset which takes a parameter employeeIds (this is a multi select parameter) query is something like this where EmployeeTable.Id in (#employeeIds)
When I used SQL profiler and saw the query executed against my database, it looks like this EmployeeTable.Id in (21,34,56,81)
Which is good, all works well till here. Now I need to call same report from a ASPX page without showing SSRS Filters pane (So I have to construct my params and pass to SSRS report)
Here is how I tried to passed the parameter
parameters(10) = New ReportParameter("employeeIds", "21,34,56,81")
This is throwing error as below
Cannot cast varchar to integer
If I change my Report parameter to string that will break SSRS Parameter filter logic, so I cannot do that. Without disturbing current working SSRS report how can I pass this param from code to Report?
Any help would be highly appreciated!
If I get it right you're trying to open the report in an aspx page and want to open it with your parameter employeeIds set to specific values. So you're looking into setting the parameter value of employeeIds to many values at once.
That could look like this:
parameters(10) = New ReportParameter("employeeIds", new string[] {"21","34","56","81"})
When providing multiple values to a parameter you need to put them in an Array. Have a look here for more info.
=iif(Fields!SubjectCode.Value=Parameters!SubjectCode.Value,Fields!SpAbsentCount.Value,0)
I have a Main Report and a sub report
SubjectCode parameter is passed to the subreport from the main report
for each subject code sub report is generated. based on the subject code I need to select a single value(SpAbsentCount) to display on the sub report
something like select... from... where SubectCode=#SubjectCode
I tried the above expression but it doesn't work
Hard to say exactly without knowing the data and setup of your report, but one guess I have is that you have a whole set of values, and your IIF expression winds up looking at only the first row of values. Try creating a tablix or list that filters on the SubjectCode, then using your code.
I'm currently working on an ASP.Net WebForms application that allows a user to select an item from a list, which ultimately results in a SSRS report being shown, using Report Viewer 2010 (in server mode). The report has been coded with a parameter #id to allow the report to display the correct data for the selected item.
The reports dataset can return multiple rows where some of the data is displayed in a summary area at the top (not in the header section) for example a textbox would have the expression =FIRST(Fields!Address.Value, "dsMain"). The data returned is denormalized so Address will always be the same value. Which is why using FIRST() works. And the rest of the data is shown in a Tablix with grouping applied etc.
But now I'm looking to change this so users can select multiple items and therefore effectively show the report multiple times, but shown in the same report viewer control. The main requirement is to batch print the reports, so showing it in one report view control is important to allow for one click printing of everything.
Now because I didn't design the report in the first place and because its fairly complex in its layout and the sql that is executed; the sql is geared towards running for one id and not a list of them. I'm looking for options to not have to rewrite the report or the sql.
Is it possible to give the report viewer the id parameter as a list and let the report viewer execute same report for each id passed? - I know report parameter can accept multiple values but this isn't the same since the report will unintelligently pass the first value to my stored procedure but not repeat the report for the other values. Perhaps there's a setting in the report designer that allows it to repeat if it is passed multiple values?
Can someone suggest something else to get this working? Or is my only option to extend the report and sql to accept multiple id's and effectively redesign the report?
Thanks any suggestions or help with this.
The answer is to use sub-reports.
Create a new report that takes a list of ids as a multi valued parameter.
Use that parameter as the dataset for a list control.
Have a subreport inside the list. Report inside the list is your original report.
You can then pass each element of your dataset(your list of parameters) as parameter to the your sub-report.
SSRS will repeat it as your want.
[Thanks to Filburt and Devjosh. I have restructured the post and included my attempt approach. ]
I have a table on my SQL DB call ReportList which is a list of report. I need to go through that list and interrogate the reportserver, eport by report, to populate a table called ReportParameters. The ReportParameters table has a column for ReportOwnerID which needs to contains the ReportID value of the corresponding (owner) report as listed in the ReportList table.
This is in VB.NET 2005 ASP2.0 and I have ended up with a mess. Please help me with the cleanest approach to doing this.
It needs to work so:- I have a listbox of the reports as per REportList and a GridView that list all the parameters (uniquely - most of the parameters are common to many reports) the idea being that the parameters get set once and the report can be kicked off by selecting them in the ReportList CheckListBox and clicking on Execute.
I would like it that as I click on a particular report in the ListView, the relevant parameters in the Gridview get a green background and those that do not apply are red. The leftmost column in the gridview contains tha Parameter NAME (not editable) and the next column must be editable to populate the value.
DONE SO FAR:
I have tried on clicking the EXECUTE button , to build a parameters string in a testbox and call that with the Javascript OpenReportWin() function when I open the report in a new window. This works fine, but my biggest issue it interrogating the reportserver reports to get back a list of parameters and dooping them into a table. I have triend to use a hidden DataGrid bound to a ds onto the reportParamaters table; I have tried to poulate it using a datalist but I cannot get the hang of these thionsg and its looking messy. Ther must be a simple clean way of gettting the .GetParameters resultset back from the report server and populating the table without having to create a reportviewer object and cycling through the list of reports - it then has to render each report before you can get that list out.
Thanks
I will withdraw this for now. I will submit a solution when I am comfortable that I have reahced a clean solution.
Mac
PLEASE CLOSE!!!
I have a report which has 3 subreports. In the case of no data I want to hide the report. It's giving me this error:
Error: Subreport could not be shown
How can I hide the subreports?
You are going to have to create some mechanism of knowing whether or not a subreport will successfully be shown on the main report because you aren't going to be able to "return" anything back to the main report from the subreport.
Could you create a small dataset on your main report that would query to check if data will exists for the subreport? and then you could use an expression on the subreport element (or container such as tablix or rectangle) to hide it based upon the results of the query on the main report.
Let me know if I need to clarify.
if we directly create a dataset in the main report itself then there is no question of using another report as a subreport we can directly use the fields from the data set created in the main report and assigning parameters to main dataset values. i think that will not server purpose.