我有一份使用Crystal Reports 2008创建的报告。此报告使用了超过40个参数来控制报告的布局。所有参数都是布尔值,在保存的报告中默认为False。报告随保存数据一起保存,报告选项未选中,因为我想从数据库而不是在报告中读取结果。
但是,当我将报告导出为PDF时,我收到一个ParameterFieldCurrentValueException。使用报告保存数据时,我不会收到此错误。
我已经验证报告中的所有五个表都使用以下代码连接到他们的数据源。
foreach (Table table in reportDoc.Database.Tables)
{
bool isConnected = table.TestConnectivity();
Console.WriteLine(table.Name + " connected? " + isConnected.ToString());
}
当数据未与报告一起保存并导出到磁盘时,可能导致ParameterFieldCurrentValueException的原因是什么?
这是可以重现此问题的最简单的代码。
string report = "list_report.rpt";
string pdf = "list_report.pdf";
ReportDocument reportDoc = new ReportDocument();
reportDoc.Load(report);
// Setting parameters (or not) does not have an effect on the error
// All parameters have defaults
// reportDoc.SetParameterValue("hideRegion", false);
reportDoc.ExportToDisk(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat, pdf);
答案 0 :(得分:4)
如果选择了“使用报告保存数据”,则报告不会尝试访问数据库。这是一个包含已保存数据的静态报告。这就是为什么与没有保存数据时尝试传递参数相比,此报告没有错误。
该错误表明您在运行时传递的一个或多个参数值与报告所期望的不匹配。在您的代码中,您直接导出为PDF。由于您没有查看报告,因此引擎无法提示缺少值。
您可以构建一个简单的Windows应用程序来加载报表并将其传递给Crystal Report Viewer控件。首先不将任何参数传递给报表而不保存数据。系统会提示您输入所有参数。在参数提示表单中手动添加它们。这有用吗?这应该。现在开始一次添加一个参数代码。参数提示表单应该只是提示缺少参数。在某些时候,你会再次得到错误,这应该有助于缩小问题范围。
此致
Dan Kelleher
答案 1 :(得分:1)
这个答案不是我的,它是Crystal Reports论坛上的一位绅士。该帖子可以在SAP Forum上找到答案:
使用报告保存数据时 选择报告不会尝试 点击数据库。这是一份静态报告 保存数据。这就是为什么这个 报告与何时相比没有错误 你试图传递参数。
错误表明一个或多个 您传递的参数值 与报告不符 期待。因为你没有看 报告没有机会 提示丢失的引擎 值。
您可以构建一个简单的窗口 加载报告的应用程序。 首先不要传递任何参数 没有保存数据的报告。您 应该提示你所有的 参数。手动添加它们 参数提示表。这有用吗? 这应该。现在开始添加参数 一次编码一个。参数 提示表格应该只是提示 缺少的参数。在某些 指出你会再次得到错误 这应该有助于缩小范围 问题。
然后我做的是将报表加载到Crystal Report Viewer控件中。当它加载时,它提示我任何缺少的参数。我错过了40多个参数列表中的一个参数,导致错误。其代码如下:
ReportDocument reportDoc = new ReportDocument();
reportDoc.Load(")list_report.rpt";
Form1.SetParameterValues(reportDoc);
this.crystalReportViewer1.ReportSource = reportDoc;
如果上述人回复Stack Overflow这个答案,我会选择他的帖子作为答案,以便恰当地归功于来源。
答案 2 :(得分:0)
这个不容易解决!
如何在保存之前为所有参数提供默认值?你得到同样的错误吗?如果不是,那么你将不得不尝试其中的每一个来找到造成麻烦的那个。我想你会在某个公式中使用参数值的某个地方结束......
PS:即使这与您的问题无关,我也会对您在代码中使用CR关键字“公式”感到困惑。