0

我有大约 700 份水晶 XI 报告,其中一些在公式字段名称 中包含右大括号,例如“ Test } ”。尽管 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# 在加载包含左大括号或许多其他特殊字符的字段名称的报告时没有任何问题:

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

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

请记住,问题在于公式字段名称不是公式本身。示例图像:

示例图像

-> 目前我只看到一个解决方案,因为问题似乎是 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()}
4

2 回答 2

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。

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

所有这些示例均来自 VS2008 的 Crystal Report Basic。

在此处输入图像描述

于 2013-10-31T13:29:57.297 回答
0

我认为您的 VS 水晶报表已过时。它们现在高达 13.x,所以我建议获取最新版本。你可以在这里下载。确保下载exe,而不是msi。我相信 exe 是列表中的第一个,将鼠标悬停在它们上方时请检查超链接。您可能还想在安装新版本之前卸载当前版本。

编辑:

看到屏幕截图后,公式名称不应有任何括号。请看截图。 在此处输入图像描述

于 2013-10-30T14:03:56.687 回答