2010-05-21 70 views
0

我有一个基于参数化存储过程的Crystal报表。该报告显示每个参数的值以及数据。在正常使用中,一切正常。将数据推送到Crystal报表时参数值未显示?

我现在需要添加一些额外的功能到我的报告应用程序,对存储过程返回的数据做一些额外的处理。为了达到这个目的,我想从我的C#代码中调用该过程,并将数据和参数值一起推送到报告中。

作为一个概念验证,我正在用虚拟数据构建一个数据表并将其推送到报告中。参数值不会出现在报告中,但会显示虚拟数据。我究竟做错了什么?

我使用Crystal Reports 11.5构建报表,并使用Visual Studio 2010构建应用程序。我使用的代码是:

using System; 
using System.Data; 
using CrystalDecisions.CrystalReports.Engine; 
using CrystalDecisions.Shared; 

namespace ReportTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var fakeTable = new DataTable("report_for_date;1"); 
      fakeTable.Columns.Add("Name", typeof(string)); 
      fakeTable.Columns.Add("Amount", typeof(decimal)); 

      var row = fakeTable.NewRow(); 
      row["Name"] = "TEST"; 
      row["Amount"] = 1000; 

      fakeTable.Rows.Add(row); 

      var rep = new ReportDocument(); 

      rep.Load("reportfordate.rpt", OpenReportMethod.OpenReportByDefault); 

      rep.SetDataSource(fakeTable); 

      rep.SetParameterValue("@date", new DateTime(2010, 05, 21)); 
      rep.SetParameterValue("@threshold",5); 

      // This code prints out the expected values (set above) 
      foreach (ParameterField p in rep.ParameterFields) 
       foreach(ParameterDiscreteValue v in p.CurrentValues) 
        Console.WriteLine("{0}={1}", p.Name, v.Value); 

      // The report PDF is generated but does not display the parameter values 
      rep.ExportToDisk(ExportFormatType.PortableDocFormat,"c:/temp/hack.pdf"); 
     } 
    } 
} 

回答

0

您的概念应该工作。您应该能够收集C#中的数据,然后将其推送到Crystal Report。

我试过你的代码了,它似乎为我工作。我通常做的不同的事情不是使用SetParameterValue,而是通常单独构建ParameterField对象,然后将它们添加到ParameterFields对象,然后将该对象传递给报告。这是更乏味的,可能并不比这种方式更好。

回到你的问题,我会建议你确保参数名拼写正确(带有“@”符号),但是如果是这样的话,它应该会给你一个错误。

唯一的另一件事是确保你有报告中包含的参数字段,并且他们没有任何抑制逻辑附加到他们,但这是一种愚蠢,我怀疑这将是案件。

总而言之,它看起来像你做的是正确的,你的参数字段应该显示出来。作为另一个测试,您可以随时尝试使用水晶查看器创建一个简单的表格应用程序,以查看其中的外观。这可能会导致出口部分混乱,因为出口过程中似乎有时会出现奇怪的情况。

我知道这可能不是很多帮助,但我希望你找到一些有用的东西。 :)