加载水晶报告失败 - 包含大括号的无效字段名称

时间:2013-10-30 13:13:27

标签: c# .net visual-studio-2012 crystal-reports crystal-reports-xi

我有大约700个水晶XI报告,其中一些包含公式字段名称中的结束大括号,如“测试} ”。即使Crystal Reports XI可以打开所有这些,C#也会在加载此类报告时崩溃。

这是我用来加载报告的代码(其他报告工作正常)

CrystalDecisions.CrystalReports.Engine.ReportDocument reportDocument; 
reportDocument = new CrystalDecisions.CrystalReports.Engine.ReportDocument();

reportDocument.Load(path); //Application crashes here

抛出以下异常:

A first chance exception of type 'System.Exception' occurred in 
CrystalDecisions.CrystalReports.Engine.dll

Load report failed 
Invalid field name

所以我的问题是,如果有可能不加载这些报告?如果没有,是否有更新版本的水晶报告能够加载旧报告的DLL?

有关此问题的一些进一步信息:
我正在使用Visual Studio 2012 C#.NET 4.5,平台目标设置为x86
至于Crystal DLL,我使用版本11.0.3300

令人惊讶的是,C#在使用包含左大括号或许多其他特殊字符的字段名称加载报表时没有任何问题:

测试} ”或“ {测试} ” - 错误
{测试”或“测试{” - 加载没有问题 - 因此打开花括号工作正常 “”测试< > =%& |“” - 加载也没有任何问题(是的,名称包含双引号)

编辑:由于不可避免的混淆:

请注意,问题在于公式字段名称公式本身。示例图片:

Example Image

- >目前我只看到一个解决方案,因为问题似乎是API和C#的组合:重命名所有公式字段名称并删除括号

原始异常消息:

{"Der Bericht konnte nicht geladen werden."} //Load report failed
Data: {System.Collections.ListDictionaryInternal}
HelpLink: null
HResult: -2146233088
InnerException: {"\rUngültiger Feldname.\nC:\\Users\\username\\AppData\\Local\\Temp\\  
  {566E74ED-58BF-40CD-82B2-9AE0E6BC4013}.rpt"} //Invalid field name
Message: "Der Bericht konnte nicht geladen werden."
Source: "CrystalDecisions.CrystalReports.Engine"
StackTrace: " at 
  CrystalDecisions.ReportAppServer.ReportClientDocumentWrapper.EnsureDocumentIsOpened() \r\n at 
  CrystalDecisions.CrystalReports.Engine.ReportDocument.Load(String filename, 
  OpenReportMethod openMethod, Int16 parentJob)\r\n at 
  CrystalDecisions.CrystalReports.Engine.ReportDocument.Load(String filename) \r\n at 
  CRTableLister.ReportAnalyzer.analyzeReport(String path)"
TargetSite: {Void EnsureDocumentIsOpened()}

2 个答案:

答案 0 :(得分:1)

据我所知,当您将字段从数据集拖放到报表公式时,会使用水晶报表{}。拖动后,它变得像公式中的{TableName.ColumnName},公式表示为@formulaName,没有任何空格。一般来说,我们不喜欢列名之间的任何空格。

以下是基本公式示例

Global BalQty As Number           - declares the global variable Balqty as an Integer
if {Table.Flag} = 1 Then                        - if the record is Receipt of Stock
BalQty = {Table.qtyRec} + Balqty       - Add to the cumulative value of Balqty
else                                          - otherwise
BalQty = BalQty – {Table.qtyDispa}
endif
Formula  = Balqty             - Return Balqty

让它保存为MyFormula。因此,当我将其拖放到报表上时,它将显示为@MyFormula。我认为它适用于任何版本的Crystal Report。

最后我可以说,你需要检查你的公式。

所有这些示例都来自Crystal Report Basic for VS2008。

enter image description here

答案 1 :(得分:0)

我认为你的Crystal Reports for VS已经过时了。它们现在高达13.x,因此我建议获得最新版本。您可以下载here。确保下载exe,而不是msi。我相信exe是列表中的第一个,当悬停在它们上方时检查超链接。您可能还想在安装新版本之前卸载当前版本。

编辑:

看到屏幕截图后,公式名称周围不应有任何括号。请看截图。 enter image description here