Reputation: 1
I have a problem when generate a report which has subreport and it use parameters link to the main report.
if there is no linked parameter, there is no problem.
I have tried some ways from google, such as set the parameter value from subreport directly, so by islinked() checking, but failed for all.
Could you please give suggestion on this.
Below is the code for parameter setting from C# visual studio 2010
if (cmdOptions.Parameters != null)
{
List<string> valueLst = cmdOptions.Parameters.GetStringList("parameters");
string[] values = valueLst.ToArray();
log.info("Lenth of parameters: " + values.Length);
int pCount = m_Report.ParameterFields.Count;
log.info("Lenth of parameters field: " + pCount);
int iMaxIdx = pCount - 1;
for (int i = 0; i < values.Length; i++)
{
if (i > iMaxIdx)
break;
ParameterField parField = m_Report.ParameterFields[i];
parField.CurrentValues.Clear();
switch (parField.ParameterValueType)
{
case ParameterValueKind.NumberParameter:
{
parField.CurrentValues.AddValue(Convert.ToDouble(values[i])); break;
}
case ParameterValueKind.BooleanParameter:
{
parField.CurrentValues.AddValue(Convert.ToBoolean(values[i])); break;
}
case ParameterValueKind.DateParameter:
{
parField.CurrentValues.AddValue(Convert.ToDateTime(values[i])); break;
}
case ParameterValueKind.DateTimeParameter:
{
parField.CurrentValues.AddValue(Convert.ToDateTime(values[i])); break;
}
case ParameterValueKind.StringParameter:
{
parField.CurrentValues.AddValue(Convert.ToString(values[i]));
//AddDiscreetValue(Convert.ToString(values[i]), parField.CurrentValues);
break;
}
default:
{
parField.CurrentValues.AddValue(Convert.ToString(values[i])); break;
}
}
}
}
ExportOptions o = BuildExportOptions(cmdOptions);//there is no problem, I have tested for this.
m_Report.Export(o);
Below is the error
"Operation illegal on linked parameter. 2014-02-25 14:00:13,039 [1] ERROR Program [(null)] - CrystalDecisions.ReportAppServer.DataSetConversion 2014-02-25 14:00:13,039 [1] ERROR Program [(null)] - at CrystalDecisions.ReportAppServer.ConvertDotNetToErom.ThrowDotNetException(Exception e) at CrystalDecisions.ReportSource.EromReportSourceBase.ExportToStream(ExportRequestContext reqContext) at CrystalDecisions.CrystalReports.Engine.FormatEngine.ExportToStream(ExportRequestContext reqContext) at CrystalDecisions.CrystalReports.Engine.FormatEngine.Export(ExportRequestContext reqContext) at CrystalDecisions.CrystalReports.Engine.ReportDocument.Export(ExportOptions options) at ReportGenerator.GeneratorEngine.Export(CommandOptions cmdOptions) in "
Upvotes: 0
Views: 6814
Reputation: 51
When I encountered this issue is was because later I realized that the ParameterFields enumerable also includes sub report parameters that are used to link reports.
Since I only ever use parameters in sub reports to create association between the parent report, my solution was to check the parameter object's ReportName property, ignoring all parameters that had a ReportName value.
Using a snippet from your code above:
for (int i = 0; i < values.Length; i++)
{
if (i > iMaxIdx)
break;
ParameterField parField = m_Report.ParameterFields[i];
//is this a sub-report parameter?
if(parField.ReportName.Length > 0)
continue; //yes, move next
parField.CurrentValues.Clear();
//additional processing here
}
Upvotes: 5
Reputation: 367
Under Crystal Reports 2013 (at least) the property ParameterFields
is readonly:
ParameterFields ParameterFields { get; }
That way, regardless you change the values using ParameterFields
property you never will change the values in report, then the parameters will be not set on running.
Use
public virtual void SetParameterValue(int index, object val);
public virtual void SetParameterValue(string name, object val);
public virtual void SetParameterValue(string name, object val, string subreport);
under ReportDocument
class.
Example using your code:
public object ParameterParse(ParameterValueKind type, string value)
{
if (String.IsNullOrEmpty(value))
return null;
switch (type)
{
case ParameterValueKind.NumberParameter:
return Convert.ToInt32(value);
case ParameterValueKind.CurrencyParameter:
return Convert.ToDecimal(value);
case ParameterValueKind.BooleanParameter:
return Convert.ToBoolean(value);
case ParameterValueKind.DateParameter:
case ParameterValueKind.DateTimeParameter:
return Convert.ToDateTime(value);
case ParameterValueKind.StringParameter:
return Convert.ToString(value);
case ParameterValueKind.TimeParameter:
TimeSpan time;
return TimeSpan.TryParse(value, out time) ? time : (object)null;
}
return null;
}
...
if (cmdOptions.Parameters != null)
{
List<string> valueLst = cmdOptions.Parameters.GetStringList("parameters");
string[] values = valueLst.ToArray();
log.info("Lenth of parameters: " + values.Length);
int pCount = m_Report.ParameterFields.Count;
log.info("Lenth of parameters field: " + pCount);
int iMaxIdx = pCount - 1;
if (pCount > values.Length)
{
throw new Exception("Parameters count in report is greatest than parameters supplied");
}
for (int i = 0; i < pCount; i++)
{
m_Report.SetParameterValue(i, ParameterParse(m_Report.ParameterFields[i].ParameterValueType, values[i])
}
}
...
Upvotes: 0