从Crystal Reports Viewer(ActiveX,ASP.Net)打印Crystal Reports

时间:2012-04-13 15:53:55

标签: asp.net crystal-reports

我在尝试从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')值+ ')')); < / p>

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

  • 我尝试从正确的.cab文件手动安装ActiveX控件。这在任何情景中都没有区别。
  • 我安装了最新的Crystal Reports Service Pack(Service Pack 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 个答案:

答案 0 :(得分:1)

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

在处理Crystal报表时,您必须在发送响应之前重新初始化报表及其登录和数据源,参数等在每个请求中(回发或没有回发无关紧要)。 Crystal报表不会维护完整的视图状态,这就是每次都应该重新初始化的原因。

我认为你不会在回发请求期间重新初始化因此错误。

答案 1 :(得分:1)

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

crViewer.PrintMode = PrintMode.Pdf;

答案 2 :(得分:0)

我知道这个问题已经过时了,但我想我会发信息以防其他人遇到这个问题。

我发现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中...然后查看器开始正常工作。

希望它有所帮助!

答案 3 :(得分:0)

我遇到了类似的问题,报告是在页面上正确生成的,但当我尝试缩放时,它说,&#34;没有有效的报告源可用&#34;。要解决此问题,我只需在每次加载页面时加载报告,无论是回发还是正常加载

还要确保您正确处理Crystal Report文档,否则可能会开始提供&#34;加载报告失败&#34;错误。