SSRS 2008 R2 - SSRS 2012 - ReportViewer:Safari和Chrome中的报告均为空白

Ani*_*a C 84 reportviewer reporting-services ssrs-2008 reporting-services-2012 ssrs-2012

我将报告服务从2008版迁移到另一个服务器版本2008 R2.在2008版本中,报告在Safari上运行良好.报告的新版本2008 R2根本没有出现.我看到的只是参数部分,然后报告是空白的.与Chrome相同.根据Microsoft Safari IS,如果以有限的方式支持.报告并不复杂.事实上,我创建了一个报告,其上只有一行,以查看它是否会显示在Safari中但不是,该报告也完全空白.有没有人在Safari上查看SSRS报告?我是否需要处理某种配置设置?

Ema*_*eco 108

终极解决方案(也适用于SSRS 2012!)

将以下脚本附加到以下文件(在SSRS服务器上)
C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportManager\js\ReportingServices.js

function pageLoad() {    
    var element = document.getElementById("ctl31_ctl10");
    if (element) 
    {
        element.style.overflow = "visible"; 
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:正如azzlak所说,div的名字并不总是如此ctl31_ctl10.对于SQL 2012尝试ctl32_ctl09和2008 R2尝试ctl31_ctl09.如果此解决方案不起作用,请从浏览器中查看HTML以查看脚本是否已正常更改overflow:auto属性overflow:visible.


ReportViewer控件的解决方案

插入.aspx页面(或链接.css文件,如果可用)此样式行

#reportViewer_ctl09 {
  overflow:visible !important;
 }
Run Code Online (Sandbox Code Playgroud)

原因

Chrome和Safari overflow:auto以与IE相同的方式呈现.

SSRS HTML是QuirksMode HTML并依赖于IE 5.5的错误.非IE浏览器没有IE quirksmode,因此正确呈现HTML

SSRS 2008 R2报告生成的HTML页面包含一个div具有overflow:auto样式的HTML页面,它将报告转换为不可见的报告.

<div id="ctl31_ctl10" style="height:100%;width:100%;overflow:auto;position:relative;">
Run Code Online (Sandbox Code Playgroud)

我可以通过使用Chrome的开发工具()手动切换overflow:autooverflow:visible生成的网页来查看有关Chrome的报告F12.


我喜欢Tim的解决方案,它很容易且有效.

但是仍然存在一个问题:用户每次更改参数时(我的报告使用参数!)AJAX刷新div,溢出:自动标记被重写,没有脚本更改它.

此技术说明详细说明了问题所在:

发生这种情况是因为在使用AJAX面板构建的页面中,只有AJAX面板才会更改其状态,而无需刷新整个页面.因此,OnLoad您在<body>标记上应用的事件只会被触发一次:第一次加载页面.之后,更改任何AJAX面板将不再触发这些事件.

用户einarq建议使用此解决方案:

另一个选项是将您的函数重命名为pageLoad.具有此名称的任何函数将由asp.net ajax自动调用(如果它存在于页面上,也在每次部分更新后).如果这样做,您还可以从body标签中删除onload属性

所以编写了解决方案中显示的改进脚本.

  • 完美的工作.但是对于SQL Server 2012,有问题的div id是`ctl32_ctl09`. (8认同)
  • 而不是搜索id ctl32_ctl09或生成的任何内容,请尝试:document.querySelector("[id ^ = VisibleReportContent]").parentNode; (3认同)

小智 27

只需包括SizeToReportContent="true"如下所示

<rsweb:ReportViewer ID="ReportViewer1" runat="server" SizeToReportContent="True"...
Run Code Online (Sandbox Code Playgroud)

  • 我不知道为什么这不是公认的解决方案,因为a)它工作正常,而b)它似乎是内置的解决方案.不是让报告者正常工作的黑客行为.并不是说攻击ReportViewer使其工作有任何问题.好像整个报告观看者都是大黑客. (4认同)
  • 此解决方案是否仅适用于在应用程序中嵌入ReportViewer控件?如果这适用于报表管理器并且报表从ReportServer URL运行,则请指定您需要包含此编辑的位置. (3认同)
  • 您是指\ SQL\MSRS11.MSSQLSERVER\Reporting Services\ReportServer\Pages\ReportViewer.aspx中的以下行:<RS:ReportViewerHost ID ="ReportViewerControl"runat ="server"/> (2认同)

Mic*_*own 23

我正在使用Chrome版本21和SQL 2008 R2 SP1,并且上述修复程序都不适用于我.下面是有效的代码,与其他答案一样,我添加了这段代码以附加到"C:\ Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportManager\js\ReportingServices.js"(在SSRS服务器):

//Fix to allow Chrome to display SSRS Reports
function pageLoad() { 
    var element = document.getElementById("ctl31_ctl09");
    if (element) 
    {
        element.style.overflow = "visible";         
    } 
}
Run Code Online (Sandbox Code Playgroud)


Tim*_*dge 14

这是一个已知问题.问题是div标签的样式为"overflow:auto",这显然不适用于Safari和Chrome使用的WebKit(参见Emanuele Greco的回答).我不知道如何利用Emanuele的建议来使用RS:ReportViewerHost元素,但我使用JavaScript解决了它.

问题

在此输入图像描述

由于在div元素的style属性中指定了"overflow:auto",其id为"ctl31_ctl10",因此我们无法在样式表文件中覆盖它,因此我使用了JavaScript.我将以下代码添加到"C:\ Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportManager\js\ReportingServices.js"

function FixSafari()
{    
    var element = document.getElementById("ctl31_ctl10");
    if (element) 
    {
        element.style.overflow = "visible";  //default overflow value
    }
}

// Code from http://stackoverflow.com/questions/9434/how-do-i-add-an-additional-window-onload-event-in-javascript
if (window.addEventListener) // W3C standard
{
    window.addEventListener('load', FixSafari, false); // NB **not** 'onload'
} 
else if (window.attachEvent) // Microsoft
{
    window.attachEvent('onload', FixSafari);
}
Run Code Online (Sandbox Code Playgroud)

注意

似乎有一个SSRS 2005解决方案,我没有尝试,但我不认为它适用于SSRS 2008,因为我找不到"Doc​​MapAndReportFrame"类.

  • 有一点我不明白.如果你申请的代码功能FixSari在\ ReportingServices.js,然后执行该代码显示在SSRS的报告,你在哪里申请执行源代码的方法为FixSafari功能?如果我理解正确,会生成ReportingServices.js的原始代码并最终执行FixSafari代码? (2认同)

小智 12

我的解决方案基于上述想法.

function pageLoad() {
    var element = document.querySelector('table[id*=_fixedTable] > tbody > tr:last-child > td:last-child > div');
    if (element) {
        element.style.overflow = "visible";
    } 
}
Run Code Online (Sandbox Code Playgroud)

它不仅限于某个id,而且您不需要包含任何其他库,例如jQuery.


Eri*_*iss 11

这是我用于Report Server 2008 R2的解决方案

无论报表服务器将在表的"id"属性中输出什么内容,它都应该有效.我不认为你总能认为它会是"ctl31_fixedTable"

我使用了上面的建议和一些方法的混合动态加载jquery库到这里找到的javascript文件的页面

在服务器上转到以下目录:C:\ Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportManager\js

将jquery库jquery-1.6.2.min.js复制到该目录中

创建文件的备份副本ReportingServices.js编辑文件.并将其附加到底部:

var jQueryScriptOutputted = false;
function initJQuery() {

    //if the jQuery object isn't available
    if (typeof(jQuery) == 'undefined') {


        if (! jQueryScriptOutputted) {
            //only output the script once..
            jQueryScriptOutputted = true;

            //output the script 
            document.write("<scr" + "ipt type=\"text/javascript\" src=\"../js/jquery-1.6.2.min.js\"></scr" + "ipt>");
         }
        setTimeout("initJQuery()", 50);
    } else {

        $(function() {     

        // Bug-fix on Chrome and Safari etc (webkit)
        if ($.browser.webkit) {

            // Start timer to make sure overflow is set to visible
             setInterval(function () {
                var div = $('table[id*=_fixedTable] > tbody > tr:last > td:last > div')

                div.css('overflow', 'visible');
            }, 1000);
        }

        });
    }        
}

initJQuery();
Run Code Online (Sandbox Code Playgroud)