我有一个基于参数化存储过程的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 :(得分:0)
你的概念应该有效。您应该能够在C#中收集数据,然后将其推送到Crystal Report。
我已经尝试了你的代码,它似乎对我有用。我通常做的唯一不同的是不使用SetParameterValue,我通常单独构建ParameterField对象,然后将它们添加到ParameterFields对象,然后将该对象传递给报表。那是更乏味的,可能没有比这更好的了。
回到你的问题,我建议你确保参数名称拼写正确(带有“@”符号),但如果是这种情况,它会给你一个错误。
唯一的另一件事是确保报告中包含参数字段,并且它们没有附加任何抑制逻辑,但这有点愚蠢,我怀疑是否会出现这种情况
总而言之,看起来你做得对,你的参数字段应该显示出来。作为另一项测试,您可以随时尝试使用水晶查看器创建一个简单的表单应用程序,以查看它的外观。这会使出口部分脱离混合,因为有时候出口过程似乎会发生奇怪的事情。
我知道这可能不是很多帮助,但我希望你能找到一些有用的东西。 :)