【问题标题】:Printing Crystal Reports from a Crystal Reports Viewer (ActiveX, ASP.Net)从 Crystal Reports 查看器(ActiveX、ASP.Net)打印 Crystal Reports
【发布时间】:2012-04-26 00:23:27
【问题描述】:

我在尝试从 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)。将其设置为任何东西似乎都会导致问题。这是它在页面源代码中的样子:

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

【问题讨论】:

  • 好吧,我再次查看了一份更简单的报告,并设法让它发挥作用。我需要做的是:将整个报表文档存储在会话中,而不仅仅是数据源,不指定报表类型(ActiveX 或 PDF),如果有,则始终在 Page_Load 事件中设置报表文档一个在会话中。一旦我设法让其他人使用一些代码示例,我将发布更新。
  • 在提问时尽量做到准确,以获得社区更好的回应

标签: asp.net crystal-reports


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    crViewer.PrintMode = PrintMode.Pdf;
    

    【讨论】:

    • 也许我误解了你的意思,但即使我可能有使用 ActiveX 的 PrintMode 的报告,我仍然可以使用其他浏览器。 Crystal 将检测到不支持 ActiveX,然后改用 PDF 模式。
    • 正确,其他非activeX浏览器即使设置为ActiveX模式也会使用Pdf模式。我的意思是完全避免它,让所有浏览器都使用 Pdf 模式。
    【解决方案3】:

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

    我发现this page 有许多选项可以解决我认为与您的问题非常相似的问题。我收到了标题为“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 中...然后查看器开始正常工作。

    希望对你有帮助!

    【讨论】:

      【解决方案4】:

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

      还要确保正确处理 Crystal Report 文档,否则可能会开始出现“加载报告失败”错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多