1

我在尝试从 ASP.Net 页面打印 Crystal Reports 报告时遇到了一些严重问题。这是当前的设置:

  • Crystal Reports 查看器设置在页面上。查看报告时报告显示正常。
  • 报表查看器 PrintMode 设置为 ActiveX
  • 根据 SAP 的建议(在他们的知识库文章之一中找到),我正在从会话变量设置报告数据源。通过调用 WCF 服务设置报表数据源。传递到报告中的数据很好。(同样,报告显示得很好,显示所有内容都应该如此)。
  • ASP.Net 应用程序和相关服务的构建目标是 x86。
  • 一切都使用 Crystal Reports 版本 13,ASP.Net Web 应用程序使用 .Net 4。它正在 Internet Explorer 8 中查看。
  • 我已经尝试检查 Internet Explorer 8 上的 ActiveX 设置,它们都不应该是问题(一切都设置为允许或提示)。
  • 无论是从 IDE 还是从单独服务器上的设置网站运行它,都会发生错误。
  • 另一台服务器上 IIS 中的应用程序池设置被设置为允许 32 位应用程序。

当我单击报表查看器上的打印图标时,我收到以下错误消息:

“发生通信错误。将停止打印。”

同样的错误发生在不止一台机器上。如果我在错误消息上单击“确定”,下面的对话框会显示“正在加载 Crystal Reports 打印控件,请稍候。”。如果我等待,什么都不会发生。没有提示安装 ActiveX 控件,也没有弹出任何内容允许我选择打印机(我知道其中安装了几个)。

我试过做以下事情,但都没有奏效:

  • 将报告类型切换为 PDF。如果我这样做,然后单击报告查看器上的打印按钮,我会收到以下错误:

Microsoft JScript 运行时错误:需要对象。”

它特别打破了这一行:

bobj.crv.stateManager.setComponentState('MainContent_reportViewer_UI ',eval('('+document.getElementById(' _CRYSTALSTATEctl00$MainContent$reportViewer').value+')'));

报告中有几个动态图像,但在查看报告时它们都正确显示。它们是我能想到的与此报告相关联的唯一二进制对象。错误发生在为页面动态创建的代码中——不是我写的。

  • 我尝试从正确的 .cab 文件手动安装 ActiveX 控件。这在任何情况下都没有区别。
  • 我已经安装了最新的 Crystal Reports 服务包(服务包 3)。同样,这并没有改变任何东西。
  • 根据我遇到的一些论坛帖子的建议,我已尝试在默认网站内为 CrystalReportViewers13 设置虚拟目录。这也没有任何效果。
  • 在页面上启用 ViewState 对打印是否有效没有影响。
  • 我尝试添加我自己的打印按钮和一个包含可用打印机列表的下拉列表。当我单击自己的自定义打印按钮并调用 PrintToPrinter() 时,我收到与尝试打印 PDF 报告相同的错误消息:

“Microsoft JScript 运行时错误:需要对象”

...并且它在单击“打印”按钮时尝试打印 PDF 报告时在同一行中断。

至少一天以来,我一直在反对这一点,而且我还没有什么想法。任何人都知道可能导致这种情况的原因是什么?

编辑:

好吧,这就是我为了让事情正常工作而做的事情。它最终比我想象的要简单得多:

  • 将整个 ReportDocument 填充到会话中。您的页面加载应如下所示:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["report"] != null)
        {
            reportViewer.ReportSource = Session["report"];
        }
    
        BuildReport();
    }
    
  • 使 ReportViewer 尽可能简单 - 不要指定报告类型(PDF 或 ActiveX)。将其设置为任何东西似乎都会导致问题。这是它在页面源代码中的样子:

......就是这样。我不敢相信我花了大约一天的时间试图让它工作,结果却如此简单。希望这篇文章可以帮助其他面临同样问题的人。

4

4 回答 4

1

如果您收到大量用户请求,将整个报告存储在会话中是个坏主意。

在使用水晶报表时,您必须在发送响应之前重新初始化报表及其登录名和数据源、每个请求中的参数等(回发或不回发无关紧要)。Crystal 报表不保持完整的视图状态,这就是它每次都应该重新初始化的原因。

我认为您在回发请求期间没有重新初始化,因此出现错误。

于 2012-04-14T06:29:49.583 回答
1

省去头痛并禁用 activeX 打印。它会使用临时文件炸毁您的 Web 服务器,仅适用于 IE,并且仅限于您可以同时打印的报告数量。将打印模式设置为 Pdf 并完成。很多浏览器都可以直接打印pdf。

crViewer.PrintMode = PrintMode.Pdf;
于 2013-07-02T16:25:58.927 回答
0

我知道这个问题很老,但我想我会插话以防其他人有这个问题。

我发现这个页面有很多选项可以解决我认为与您的问题非常相似的问题。我收到了标题为“bobj is undefined”的错误,但真正归结为 IIS 无法找到 Crystal 的 JS 文件的正确路径。

对于我自己,我最终将一些文件夹放在我网站根目录 (wwwroot) 的 aspnet_client 目录中,并确保 NETWORK_SERVICE 可以访问 aspnet_client 文件夹。我必须对我的 x86 SAP 文件夹中的“crystalreportviewers”文件夹执行相同的操作

'C:\Program Files (x86)\SAP BusinessObjects\Crystal Reports 20XX\crystalreportviewers'

我还必须将该站点的配置添加到我的 web.config 中...然后查看器开始正常工作。

希望能帮助到你!

于 2013-05-02T11:47:05.480 回答
0

我遇到了类似的问题,在页面上正确生成了报告,但是当我尝试缩放时,它说“没有可用的有效报告源”。为了克服这个问题,我只是在每次加载页面时加载报告,无论是 Postback 还是 normal load

还要确保您正确处理 Crystal Report 文档,否则它可能会开始出现“Load Report Failed”错误。

于 2014-04-13T08:33:21.300 回答