链接参数操作非法。水晶报告

时间:2014-02-25 06:11:17

标签: c# crystal-reports operation

生成包含子报表的报表并且使用参数链接到主报表时出现问题。

如果没有链接参数,则没有问题。

我已经尝试过谷歌的一些方法,比如直接从子报表设置参数值,所以通过islinked()检查,但是都失败了。

请你就此提出建议。

以下是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);

以下是错误

  

“链接参数操作非法。   2014-02-25 14:00:13,039 [1]错误程序[(null)] - CrystalDecisions.ReportAppServer.DataSetConversion   2014-02-25 14:00:13,039 [1]错误程序[(null)] - 在CrystalDecisions.ReportAppServer.ConvertDotNetToErom.ThrowDotNetException(例外e)      在CrystalDecisions.ReportSource.EromReportSourceBase.ExportToStream(ExportRequestContext reqContext)      在CrystalDecisions.CrystalReports.Engine.FormatEngine.ExportToStream(ExportRequestContext reqContext)      在CrystalDecisions.CrystalReports.Engine.FormatEngine.Export(ExportRequestContext reqContext)      在CrystalDecisions.CrystalReports.Engine.ReportDocument.Export(ExportOptions选项)      在“

中的ReportGenerator.GeneratorEngine.Export(CommandOptions cmdOptions)

2 个答案:

答案 0 :(得分:1)

当我遇到此问题时,因为后来我意识到可枚举的ParameterFields还包括用于链接报告的子报告参数。

由于我只使用子报表中的参数来创建父报表之间的关联,我的解决方案是检查参数对象的ReportName属性,忽略具有ReportName值的所有参数。

使用上述代码中的代码段:

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
}

答案 1 :(得分:0)

Crystal Reports 2013 下(至少)属性ParameterFields 只读:

ParameterFields ParameterFields { get; }

这样,无论您使用ParameterFields属性更改值,您都不会更改报表中的值,然后在运行时不会设置参数。 使用

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);

ReportDocument类下。

使用您的代码的示例:

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]) 
    }
}

...