SSRS Set Parameters programmatically causing to state ValidValueMissing - c#

I'm trying to get the parameter of user name and replace its value with the session's username so I can pass to a Stored procedure inside the DRL to generate a table timestamp with this user name.
The parameter "username" is one of the parameters of the RDL which comes with default value and I'm trying to change it with the following code.
Replacing one of the ReportParameters:
var userParameter = GetUserParameter();
if (userParameter != null)
{
newParameters.Remove(newParameters.FirstOrDefault(param => param.Name.Contains(CurrentUserParameterName)));
newParameters.Add(userParameter);
}
Finding username ReportParameters:
var paremeters = ReportViewer.ServerReport.GetEditableHiddenParameters();
//finds parameter by its name, pelase view const value in CurrentUserParameterName
var userParameter = paremeters.FirstOrDefault(param => param.Name.Contains(CurrentUserParameterName));
if (userParameter != null)
{
userParameter.Values.Clear();
userParameter.Values.Add(Utils.GetUserName());
}
return userParameter;
Set Parameters to ServerReport:
ReportViewer.ServerReport.SetParameters(parameters);
After running the report, I get the message "The 'username' parameter is missing a value"
When I debug and look in the ServerReport.GetParameters() I can see that I do have the ReportParameter "username", I do have values (the new values), but its State is "MissingValidValue".
What am I doing wrong?
Thanks in advance,
Eddie

I've finally managed to fix this issue thanks to this article: http://technet.microsoft.com/en-us/library/dd220464.aspx
If you have specified available values for a parameter, the valid
values always appear as a drop-down list. For example, if you provide
available values for a DateTime parameter, a drop-down list for dates
appears in the parameter pane instead of a calendar control. To ensure
that a list of values is consistent among a report and subreports, you
can set an option on the data source to use a single transaction for
all queries in the datasets that are associated with a data source.
Since I entered a default value in the "available values" option in addition to putting it in the "default values", the report tried to validate the new session username, which wasn't listed as an "available value". Once I removed the values in "available values", the new ReportParameter that I supply in code-behind didn't have to be validated, and the report rendered successfully.

Related

Microsoft Reporting not accepting report parameter

When calling reportViewer.ServerReport.Render("name", "deviceInfo");
I get the following exception
ReportServerException occurred
Additional information: This report
requires a default or user-defined value for the report parameter
'MyParam'. To run or subscribe to this report, you must provide a
parameter value. (rsReportParameterValueNotSet)
But the report parameters I'm settting clearly contain 'MyParam';
reportViewer.ServerReport.SetParameters(reportParams);
If step through the code with the debugger reportParams is an IEnumerable of ReportParameter and one of the parameters has the name 'MyParam' with a string collection of (count 1) with a string value inside.
Any ideas?
You need to make sure the value for the "MyParam" is a single value, also check and make sure the "MyParam" parameter is defined from your report template and take string value, you could also add a default value from the report template itself.
var reportParams = new List<ReportParameter>();
// make sure access the first item from the string collection
var myParam = new ReportParameter("MyParam", stringCollection[0]);
reportParams.Add(myParam );
reportViewer.ServerReport.SetParameters(reportParams);

C# assigning a drop down list value to a session value

I have a drop down list which retrieves values from a session I declare as follows.
var autoData = autoRetriever.GetAutoDataByUserId(user.Id);
Session["AutoData"] = autoData;
I then use autoData to populate my drop down list with a “Name” and a int “Value” as indexed in the database. Name and value are both part of my table in the database.
What I am trying to do now is once a user selects from the drop down I am passing the value (e.g 0,1,2,3,n) the id on the db table to a method. OnSelected changed I want to use this value and retrieve another column “Path” from my session (autoData). Namely the path that is associated with the id. Once I have the correct “Path” associated with this value I can move forward with it.
With my OnSelectedIndexChanged method I then have the following. This string selectedAuto contains my value (0,1,2,3,n)
string selectedAuto = AutoDropDown.SelectedValue;
Does anyone have any advice on how I could move forward with this? If I have not explained enough please let me know and I will delve deeper into it.
As #David mentioned yes correct i am trying to use that value to identify that record. That is the part i am finding tricky. How can i retrieve that "Path" based on the value i select.

SSRS URL Parameter won't set

I have the following c# code in a web form:
protected void GridView1_SelectedIndexChanged(object sender, EventArgs e)
{
string url;
string startdate;
string enddate;
string costcenter;
string account;
//url = "http://server/reportserver?/Finance/Cost Spending/Cost Center Details&rs:Command=Render&rc:Parameters=false";
url = "http://server/reportserver?/Finance/Cost Spending/Cost Center Totals&rs:Command=Render&rc:Parameters=false";
costcenter = "&costcenter=990";
startdate="&startdate=" + Convert.ToString(txtStartDate.Text);
enddate = "&enddate=" + Convert.ToString(txtEndDate.Text);
account="&account=" + Convert.ToString(GridView1.SelectedRow.Cells[1].Text);
url =url + startdate + enddate + costcenter + account;
//TextBox1.Text = Convert.ToString(GridView1.SelectedRow.Cells[1].Text);
Response.Redirect(url, false);
}
I've tested a very similer version of this code against another report, the only different being the costcenter parameter. The other report worked fine, but every time i run this code i get the error: "the 'costcenter' parameter is missing a value". The only thing i can think of that's significantly different between the two reports is that in the Cost Center Totals report the costcenter parameter is used to populate the accounts parameter (both are multi-select).
Here's what the parameters page looks like:
Are you using multiple datasets in your report? If so, try setting the datasets to execute serially:
Open the data source dialog in report designer
Select the "Use Single Transaction" checkbox
Some other troubleshooting steps you can try:
Try removing the Report Server Command "&rs:Command=Render" from the query string and see what happens.
Also, if you change the Viewer Command to true, are you able to at least see that the parameters are populated properly (ie: "&rc:Parameters=true"?
I've been under the impression that one difference between running a report on the web server and running it in code is that in code it does not bother with the "Available Values" queries for parameters. In code, you aren't selecting a human-readable label from a drop-down which then passes in the corresponding value. Instead, you just provide the value to the parameter.
So, have you tried not specifying the cost center parameter at all? If the account parameter is all the report's recordsets really are based on, then it may be superfluous to set it.
Update:
Since the time I wrote this answer originally I've learned that dependent parameters (at least in SSRS 2008) must be after the parameter(s) they're dependent on. Make sure your parameters are ordered in a sensible way.
It looks like that's what you've done, I just wanted to mention the possibility.
Check that the Costcenter 990 is in your database!
I did some testing. I have a table "Person" with 4 rows and a PersonID 1 to 4. If set &PersonID=5 for a required single value parameter with "&rc:Parameters=true" then I get a drop-down box so I can choose one of the 4 valid persons.
If I set &PersonID=5 with "&rc:Parameters=false" then I get the message "the PersonID parameter is missing a value".
I faced similar kind of issue. Removing the parameter dependency made it work. I had parameter B depending on parameter A. It worked perfectly when you access the report server directly. But when I tried to bind it programmatically to the report viewer control, even after supplying the parameter using ReportParameter and adding to Parameters list, it was merely saying that "The 'Parameter B' is missing".
So, I went back to the report server. Redeployed the report by removing parameter dependency. It worked. :-)
Ok, I figured out the issue thanks to Alison's poke at the parameters/data sets. What was happening was I had 4 parameters, start date, end date, cost center, and accounts. In the report the account data set relies on the cost center parameters to populate the drop down list. I created a copy of the report, removed the cost center parameter, and removed the data set from the account parameter. I updated the code and ran it and BAM! It worked.

Set "Target Audiences" field with multiple values on a List Item

I am attempting to set the "Target Audiences" field on a list item programmatically. I have been able to set the value programmatically for one audience, but when I attempt to use multiple audiences, SharePoint tries to interpret the value I am setting as a single audience, rather than multiple. I am setting the value using the code below.
listItem[listItem.Fields["Target Audiences"].InternalName] = "Audience One";
I use this code to specify multiple audiences like so:
listItem[listItem.Fields["Target Audiences"].InternalName] = "Audience One; Audience Two";
When I do this, SharePoint tries to interpret the entire string as a single audience, and I get a message when I edit the list item that says "No exact match was found."
Am I using the correct format for specifying multiple audiences for this field, or is there a class that I should be using similar to SPFieldLookupValue?
I don't know how to save multiple audiences in a SPListItem, but if I had this problem, I'd try to print out the value of this field from a PowerShell script. Something like:
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint");
$site = Microsoft.SharePoint.SPSite("http://yourserver");
$web = $site.openweb();
$list = $web.lists["YourList"];
$item = $list.getitembyid(itemid);
write-output $item["Target Audiences"];
EDIT: found some information about what the Audience field value actually is: http://dotnetmafia.sys-con.com/node/1181567/mobile
Just realized I never came back and answered this.
I ended up storing the names of the audiences in a column attached to each list item, then querying the object model to see if the current user is a member of those audiences. This worked for me because I was pulling the data from the list item in a custom web part, and the user never saw the actual list item.

Assign multiple values to a parameter in Crystal Reports

I have added a parameter to my report with the option "Allow Multiple Values" checked.
This is a status column (IE, Proposed, In Progress, Completed, Canceled), and I want the user to be able to select which (and how many) different OrderStatus to report on.
How I normally set parameters is:
report.SetParameterValue("#dtBegin", dtBegin.DateTime);
What I tried to do for the multiple values was something like this:
//pseudo loop
foreach(int intOrderStatus in intSelectedOrderStatuses)
{
report.Parameter_OrderStatus.CurrentValues.AddValue(intOrderStatus);
}
I have checked it does add the values to the OrderStatus parameter, but when the report runs, the CrystalReports dialog pops up and asks me to enter values for the OrderStatus parameter. So it seems as though the values aren't "commited" to the parameter. I have done a number of searches and can't figure out why it's not working.
Thanks,
Just set the parameter value with an array of ints.
report.SetParameterValue("#OrderStatus", new int[]{1,2,3});
in the select expert you would use the in operator.
{table.order_status_id} in {?#OrderStatus}
What you can do is, make a normal parameter field,i.e without multiple values, only discreet values true, all you need to pass is 1,2,3,4. "," is the delimiter for separation use what ever you think works for you, then in record selection formula simply put
{table.order_status_id} in split({#OrderStatus}, ",")
all you need to pass from you page is the string 1,2,3,4 and it should work
Have you set the parameter to Hidden in the Crystal Reports parameter options?
I haven't tried this, but I think that you should be able to add intOrderStatus to either a ParameterDiscreteValue or ParameterRangeValue and pass that into Parameter_OrderStatus.CurrentValues instead of intOrderStatus.
Well i have same issue. The work around is very simple. Don't add data source after parameters. e.g
report.SetParameterValue("#dtBegin", dtBegin.DateTime);
report.SetParameterValue("#dtBegin2", dtBegin.DateTime1);
//Note datasource is assigned after parameters
report.SetDatasource(dataset);
The crystal report will refresh parameters before applying data source to report.
The below is the not popup discrete dialog box
//Note Datasource is applied before parameters
report.SetDatasource(dataset);
report.SetParameterValue("#dtBegin", dtBegin.DateTime);
report.SetParameterValue("#dtBegin2", dtBegin.DateTime1);
Following is tested in Crystal Reports version 13.0.20:
1) In Parameter Fields section add new parameter as follow:
Name: ParamMultipleOrderStatus
Type: Number
Value Options:
Allow multiple values: true
2) Choose the Select Expert Record ... in Crystal Reports and code may like this (use = operator):
{Orders.OrderStatus} = {?ParamMultipleOrderStatus}
3) Use following code:
foreach (int intOrderStatus in intSelectedOrderStatuses)
{
report.ParameterFields["ParamMultipleOrderStatus"].CurrentValues.AddValue(intOrderStatus);
}

Categories