4

VB アプリを C# に移植しています。これを除くすべての Crystal レポートが機能します。デバッグし、パラメーター名を確認し、ここで見つけた情報に従いました。何を試しても「パラメータ値がありません」というエラーが表示されます。ExportToStream(ExportFormatType.PortableDocFormat)PDFとして保存しようとするとエラーが発生します。パラメータはすべて文字列です。デバッグすると、リンクされていない 6 つのパラメーターのそれぞれがrptParams.ContainsKey(def.name)ブロック内でヒットします。リンクされたパラメーターのみを持つ7つのサブレポートがあります。

パラメータを設定する前に、データ ソースを設定しています。

私が試してみました:

ParameterFieldDefinitions parmFields = rpt.DataDefinition.ParameterFields;
ParameterValues pvals = new ParameterValues();
foreach (ParameterFieldDefinition def in parmFields)
{
    if (!def.IsLinked() && rptParams.ContainsKey(def.Name))
    {
        ParameterDiscreteValue pval = new ParameterDiscreteValue();
        pval.Value = rptParams[def.Name];
        pvals.Add(pval);
        def.ApplyCurrentValues(pvals);
    }
}

これは、元の VB コードに基づいています。

Dim paramFieldDefs As ParameterFieldDefinitions
Dim paramFieldDef As ParameterFieldDefinition
Dim paramVal As ParameterDiscreteValue
Dim paramVals As New ParameterValues
Dim colStepRepParams As Hashtable
colStepRepParams = cStep.ReportParams

' CREATE A NEW PARAMETERS COLLECTION
paramFieldDefs = rptReport.DataDefinition.ParameterFields()
For Each paramFieldDef In paramFieldDefs
    ' IF EXCLUDES 'PARAMETERS' WHICH LINK MAIN REPORT TO SUB REPORTS
    If Not paramFieldDef.IsLinked Then
        If colStepRepParams.ContainsKey(paramFieldDef.Name) Then
            paramVal = New CrystalDecisions.Shared.ParameterDiscreteValue
            paramVal.Value = colStepRepParams.Item(paramFieldDef.Name)
            paramVals.Add(paramVal)
            paramFieldDef.ApplyCurrentValues(paramVals)
        End If
    End If
Next paramFieldDef

私も試しました:

foreach (ParameterFieldDefinition def in parmFields)
{
    if (!def.IsLinked() && rptParams.ContainsKey(def.Name))
    {
        rpt.SetParameterValue(def.Name, rptParams[def.Name]);
    }
}

順序は次のとおりです。

using (SqlCommand cmd = new SqlCommand(job.sproc, con))
{
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandTimeout = 600; //10 min
    foreach (KeyValuePair<string, string> p in sprParams)
    {
        cmd.Parameters.AddWithValue(p.Key, p.Value);
    }

    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataSet ds = new DataSet();
    da.Fill(ds);

    ReportDocument rpt = new ReportDocument();
    rpt.Load(Path.Combine(RPT_LOCATION, job.repFileName));
    rpt.Database.Tables[0].SetDataSource(ds.Tables[0]);

    int i = 1;
    foreach (string subReport in job.subReports)
    {
        using (ReportDocument srpt = rpt.OpenSubreport(subReport))
        {
            srpt.SetDataSource(ds.Tables[i++]);
        }

    }
    ParameterFieldDefinitions parmFields = rpt.DataDefinition.ParameterFields;
    ParameterValues pvals = new ParameterValues();
    foreach (ParameterFieldDefinition def in parmFields)
    {
        if (!def.IsLinked() && rptParams.ContainsKey(def.Name))
        {
            ParameterDiscreteValue pval = new ParameterDiscreteValue();
            pval.Value = rptParams[def.Name];
            pvals.Add(pval);
            def.ApplyCurrentValues(pvals);
        }
    }
}
4

2 に答える 2

1

そして、ここにあなたのソリューションに部分的に基づいた私のソリューションがあります...私の場合、8時間の戦いの後にようやく機能しました...!

///BEFORE setting DB connection 

ParameterFieldDefinitions parmFields = cr.DataDefinition.ParameterFields;
foreach (ParameterFieldDefinition def in parmFields)
{
   if (!def.IsLinked() )
     {

     switch (def.ValueType)
     {
           case CrystalDecisions.Shared.FieldValueType.StringField:
              cr.SetParameterValue(def.Name, "", def.ReportName);
              break;

           case CrystalDecisions.Shared.FieldValueType.NumberField:
              cr.SetParameterValue(def.Name, 0, def.ReportName);
              break;

           default:
              cr.SetParameterValue(def.Name, null, def.ReportName);
              break;
     }

    }
}
///Now set DB connections 
 ...

///Now set all parameters which INDEED HAVE to be set ...
 ...

こんにちはsk

于 2013-10-07T18:41:00.487 に答える
0

skalka:s ソリューションはうまくいきましたが、サブレポートはありませんでした

foreach (ParameterFieldDefinition def in doc.DataDefinition.ParameterFields)
        {
            if (!def.IsLinked())
            {

                switch (def.ValueType)
                {
                    case CrystalDecisions.Shared.FieldValueType.StringField:
                        doc.SetParameterValue(def.Name, "");
                        break;

                    case CrystalDecisions.Shared.FieldValueType.NumberField:
                        doc.SetParameterValue(def.Name, 0);
                        break;

                    default:
                        doc.SetParameterValue(def.Name, null);
                        break;
                }

            }
        }

        doc.SetDataSource(table);

// Set parameters as I wanted from the beginning
于 2016-06-14T08:33:55.577 に答える