SSRS 2008 R2 - SSRS 2012 - ReportViewer: отчеты в Safari и Chrome пусты - PullRequest
83 голосов
/ 11 мая 2011

Я перенес наши службы отчетов с версии 2008 на другой сервер версии 2008 R2. В версии 2008 отчеты отлично работают на Safari. В новой версии 2008 R2 отчеты не отображаются вообще. Все, что я вижу, это раздел параметров, а затем отчет пуст. То же самое в Chrome. Согласно Microsoft, Safari IS поддерживается в ограниченном режиме. Отчеты не сложны. На самом деле я создал отчет, в котором была только строка, чтобы увидеть, будет ли он отображаться в Safari, но нет, этот отчет также полностью пустой. Кто-нибудь делал отчеты SSRS для просмотра в Safari? Нужно ли связываться с каким-то параметром конфигурации?

Ответы [ 10 ]

104 голосов
/ 29 августа 2011

Окончательное решение (работает и в 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"; 
    }
}

Примечание : Как заметил Аззлак, имя div не всегда ctl31_ctl10.Для SQL 2012 попробуйте ctl32_ctl09, а для 2008 R2 попробуйте ctl31_ctl09.Если это решение не работает, посмотрите HTML-код в браузере, чтобы убедиться, что скрипт работает правильно, изменив свойство overflow:auto на overflow:visible.


Решение для элемента управления ReportViewer

Вставить в .aspx страницу (или в связанный .css файл, если имеется) эту линию стиля

#reportViewer_ctl09 {
  overflow:visible !important;
 }

Причина

Визуализация Chrome и Safari overflow:auto по-другому относиться к IE.

SSRS HTML - это QuirksMode HTML, который зависит от ошибок IE 5.5.Браузеры не IE не имеют quirksmode IE и поэтому корректно отображают HTML

HTML-страница, созданная в отчетах SSRS 2008 R2, содержит div, который имеет стиль overflow:auto, и получаетсясообщить в невидимый отчет.

<div id="ctl31_ctl10" style="height:100%;width:100%;overflow:auto;position:relative;">

Я могу просматривать отчеты в Chrome, вручную изменив overflow:auto на overflow:visible на созданной веб-странице с помощью инструментов разработчика Chrome ( F12 ).


Мне нравится Решение Тима , это просто и работает.

Но есть проблема: каждый раз, когда пользователь изменяет параметры (в моих отчетах используются параметры!), AJAX обновляет div, тег overflow: auto перезаписывается, и ни один скрипт не изменяет его,

В этом техническом описании объясняется, в чем проблема:

Это происходит потому, что на странице, построенной с панелями AJAX, только панели AJAX меняют свое состояние, безОбновление всей страницы.Следовательно, события OnLoad, примененные к тегу <body>, запускаются только один раз: при первой загрузке страницы.После этого изменение любой из панелей AJAX больше не будет запускать эти события.

Пользователь einarq предложил это решение :

Другой вариант -переименуйте вашу функцию в pageLoad.Любые функции с этим именем будут автоматически вызываться ajax asp.net, если он существует на странице, а также после каждого частичного обновления.Если вы сделаете это, вы также можете удалить атрибут onload из тега body

Итак, вы написали улучшенный скрипт, который показан в решении.

27 голосов
/ 23 ноября 2012

Просто включите SizeToReportContent="true", как показано ниже

<rsweb:ReportViewer ID="ReportViewer1" runat="server" SizeToReportContent="True"...
23 голосов
/ 22 августа 2012

Я использую 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";         
    } 
}
14 голосов
/ 12 августа 2011

Это известная проблема . Проблема заключается в том, что тег div имеет стиль «переполнение: авто», который, по-видимому, плохо реализован в WebKit, который используется Safari и Chrome (см. Ответ Emanuele Greco). Я не знал, как воспользоваться предложением Эмануэле использовать элемент RS: ReportViewerHost, но решил это с помощью JavaScript.

Задача

enter image description here

Решение

Поскольку в атрибуте style элемента div с идентификатором «ctl31_ctl10» указано «overflow: auto», мы не можем переопределить его в файле таблицы стилей, поэтому я прибегнул к 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 /23285/dobavit-neskolko-sobytii-window-onload
if (window.addEventListener) // W3C standard
{
    window.addEventListener('load', FixSafari, false); // NB **not** 'onload'
} 
else if (window.attachEvent) // Microsoft
{
    window.attachEvent('onload', FixSafari);
}

Примечание

Похоже, существует решение для SSRS 2005 , которое я не пробовал, но не думаю, что оно применимо к SSRS 2008, поскольку не могу найти класс "DocMapAndReportFrame".

12 голосов
/ 17 января 2015

Мое решение основано на идеях выше.

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

Это не ограничено определенным идентификатором, плюс вам не нужно включать какую-либо другую библиотеку, такую ​​как jQuery.

11 голосов
/ 19 сентября 2012

Вот решение, которое я использовал для Report Server 2008 R2

Он должен работать независимо от того, для чего сервер отчетов будет выводить для использования в своем атрибуте «id» таблицы. Я не думаю, что вы всегда можете предположить, что это будет "ctl31_fixedTable"

Я использовал сочетание предложенного выше предложения и несколько способов динамической загрузки библиотек jquery на страницу из найденного файла javascript здесь

На сервере перейдите в каталог: C: \ Program Files \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Службы отчетов \ 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();
4 голосов
/ 08 сентября 2011

Вы можете легко это исправить с помощью jQuery - и немного безобразного хака: -)

У меня есть страница asp.net с пользовательским элементом управления ReportViewer.

 <rsweb:ReportViewer ID="ReportViewer1" runat="server"...

В событии готовности документа я затем запускаю таймер и ищу элемент, который нуждается в исправлении переполнения (как предыдущие сообщения):

 <script type="text/javascript">
    $(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 = $('#<%=ReportViewer1.ClientID %>_fixedTable > tbody > tr:last > td:last > div')
                div.css('overflow', 'visible');
            }, 1000);
        }
    });
</script>

Лучше, чем предполагать, что у него есть определенный идентификатор. Вы можете настроить таймер на что угодно. Я установил здесь 1000 мс.

3 голосов
/ 12 марта 2014

К вашему сведению - ничего из вышеперечисленного не помогло мне в 2012 SP1 ... простое решение заключалось в том, чтобы вставить учетные данные в общий источник данных, а затем сказать Safari доверять сайту сервера SSRS. Тогда это работало отлично! Потребовались дни, чтобы отыскать предполагаемые решения, подобные описанным выше, только для того, чтобы выяснить, что встроенная защита не будет надежно работать в Safari - вам придется связываться с цепочкой для ключей на Mac, а затем все равно не будет работать надежно.

2 голосов
/ 08 апреля 2013

Я использовал это. Добавьте ссылку на скрипт в jquery на странице Report.aspx. Используйте следующее, чтобы связать JQuery с событиями Microsoft. Использовал немного предложения Эрика для настройки переполнения.

$(document).ready(function () {
    if (navigator.userAgent.toLowerCase().indexOf("webkit") >= 0) {        
        Sys.Application.add_init(function () {
            var prm = Sys.WebForms.PageRequestManager.getInstance();
            if (!prm.get_isInAsyncPostBack()) {
                prm.add_endRequest(function () {
                    var divs = $('table[id*=_fixedTable] > tbody > tr:last > td:last > div')
                    divs.each(function (idx, element) {
                        $(element).css('overflow', 'visible');
                    });
                });
            }
        });
    }
});
2 голосов
/ 03 октября 2012

Решение, предоставленное Эмануэле, сработало для меня.Я мог видеть отчет, когда обращался к нему напрямую с сервера, но когда я использовал элемент управления ReportViewer на своей странице aspx, я не смог увидеть отчет.После проверки обработанного HTML-кода я нашел div с идентификатором «ReportViewerGeneral_ctl09» ( ReportViewerGeneral - это идентификатор сервера элемента управления средства просмотра отчетов), для которого свойство переполнения было установлено на auto.1005 * Я использовал процедуру, объясненную Эмануэле, чтобы изменить это на следующее:

function pageLoad() {
    var element = document.getElementById("ReportViewerGeneral_ctl09");

    if (element) {
        element.style.overflow = "visible";
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...