2014-02-25 54 views
0

我生成報告時有一個問題,它有子報告,它使用參數鏈接到主報告。鏈接參數操作不合法。水晶報告

如果沒有鏈接參數,則沒有問題。

我已經嘗試了一些谷歌的方式,如直接從子報表設置參數值,所以通過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年2月25日14:00: 13,039 [1] ERROR Program [(null)] - CrystalDecisions.ReportAppServer.DataSetConversion 2014-02-25 14:00:13,039 [1] ERROR Program [(null)] - CrystalDecisions.ReportAppServer.ConvertDotNetToErom.ThrowDotNetException(Exception e ) 在CrystalDecisi ons.ReportSource.EromReportSourceBase.ExportToStream(ExportRequestContext reqContext) 在CrystalDecisions.CrystalReports.Engine.FormatEngine.ExportToStream(ExportRequestContext reqContext) 在CrystalDecisions.CrystalReports.Engine.FormatEngine.Export(ExportRequestContext reqContext) 在CrystalDecisions.CrystalReports.Engine.ReportDocument 。出口(ExportOptions選項)在「

+0

你有沒有設置報表和主報告,報告本身之間的聯繫? – aMazing

+0

是的,我已經設置使用水晶報告2011設計師通過變化子報告鏈接 – landy

+1

大家好,剛剛解決了這個問題。這是由設置鏈接參數的值引起的。 – landy

回答

0

的Crystal Reports 2013(至少)財產ParameterFields 在ReportGenerator.GeneratorEngine.Export(CommandOptions cmdOptions)是隻讀的:

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

...

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 
}