SSRS 2008 R2 - SSRS 2012 - ReportViewer: отчеты в Safari/Chrome, но отлично работает в Firefox/Internet Explorer 8... почему?

У меня есть несколько простых отчетов в SSRS 2008 R2, но они не будут отображаться вообще в Safari или Chrome. Согласно Microsoft Books Online, эти браузеры поддерживаются ограниченным образом. Тем не менее, я ничего не вижу после того, как часы "Загрузка" завершены. Там есть панель параметров и блок навигации для крошек. Кроме того, я могу сохранять/экспортировать в любой формат в Safari и Chrome. Он просто не отобразит сам раздел отчета, который просто пуст.

Я должен использовать сертификаты и защищенные соединения (в настоящее время не настроен с HTTPS, только HTTP)? Существуют ли какие-либо конфигурации на стороне сервера, которые необходимо настроить? Кто-нибудь успел отобразить ЛЮБЫЕ отчеты о Safari/Chrome с использованием предыдущих версий SSRS (2005)?

Я использую Safari 5.0.4 и Chrome 10.0.648.151. Я знаю, что сходство для этих двух браузеров заключается в том, что они оба основаны на WebKit.

Отчет успешно отображается в Internet Explorer 8 (конечно) и Firefox 4.0.

Я бы очень признателен, если кто-то может пролить свет на это.

Ответ 1

Окончательное решение (работает и в SSRS 2012!)

Добавьте следующий script в " C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportManager\js\ReportingServices.js" (на сервере SSRS):

function pageLoad() {
    var element = document.getElementById("ctl31_ctl10");
    if (element)
    {
        element.style.overflow = "visible";
    }
}

На самом деле я не знаю, всегда ли имя div ctl31_ctl10: в моем случае это (вместо этого над SQL Server 2012 azzlak найдено ctl32_ctl09).

Если это решение не работает, посмотрите на HTML из своего браузера, чтобы убедиться, что script работал правильно, изменив свойство переполнения: auto - переполнение: видимое.


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

Вставьте эту строку стиля на страницу .aspx (или в файл .css, если она есть):

#reportViewer_ctl09 {
  overflow:visible !important;
}

Причина

Chrome и Safari отображают переполнение: auto по-разному в отношении Internet Explorer.

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

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

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

Изменение вручную (с помощью окна отладки Chrome) окончательное переполнение HTML: автоматическое переполнение: видимо, я могу видеть отчеты в Chrome.

Я люблю решение Тима; это легко и эффективно.

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

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

Mr.einarq предложил мне решение здесь.

Другой вариант - переименовать свою функцию в pageLoad.

Любые функции с этим именем будут вызываться автоматически ASP.NET Ajax, если он существует на странице, также после каждого частичного обновления. Если вы это сделаете, вы также можете удалить атрибут onload из тега body

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

Ответ 2

Решение на основе CSS

Мне удалось добавить следующее в таблицу стилей для служб Reporting Services, и она исправила ее для меня в Chrome.

Отказ от ответственности: это не полностью проверено на совместимость с несколькими браузерами.

/**************CHROME BUG FIX*****************/
div#ctl31_ctl09,
div#ctl31_ctl10
{
    overflow: visible !important;
}
/*********************************************/

Добавьте это в начало файла ReportingServices.css.

Для меня этот файл находится по адресу:

C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportManager\Styles\ReportingServices.css

Ответ 3

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

Проблема

enter image description here

Решение

Так как "overflow: auto" указан в атрибуте style элемента div с 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 https://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);
}

Примечание

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

Ответ 4

Общесистемное решение на основе CSS

Это не требует каких-либо фреймов JavaScript или Ajax или любой другой оболочки. Он был протестирован в Internet Explorer, Firefox, Safari и Chrome.

Это можно зафиксировать на уровне таблицы стилей в сервере отчетов.

Сначала перейдите в каталог, в котором установлены службы отчетов (SQL Server 2012 SP1):

C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportServer

В этом каталоге вы найдете файл с именем reportserver.config.

См. Настроить таблицы стилей для просмотра HTML и диспетчера отчетов.

В этом файле вставьте одну строку XML, как (из приведенного выше документа):

<Configuration>
...
          <HTMLViewerStyleSheet>SafariChromeFix</HTMLViewerStyleSheet>
...
</Configuration>

Сохраните это.

То, что они не говорят вам в приведенной выше ссылке, состоит в том, что эта запись полностью отменяет таблицу стилей по умолчанию. Мои первые попытки получить отчеты для рендеринга работали, добавив таблицу стилей div, все остальное было сломано. Как только я понял, что это редактирование файла reporserver.config не увеличилось, но фактически заменяет таблицу стилей по умолчанию, я скопировал таблицу стилей по умолчанию, и все началось.

Далее, спуститесь в каталог Styles (C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportServer\Styles).

Сделайте копию файла с именем SP_Full.css и назовите копию SafariChromeFix.css. На этом этапе SafariChromeFix.css должен быть идентичен SP_Full.css.

Измените SafariChromeFix.css и добавьте следующие строки вверху:

div {
    overflow: visible !important;
}

Сохраните его.

Как только это будет сохранено, все существующие отчеты этого экземпляра служб Reporting Services будут отображаться во всех браузерах, включая Chrome и Safari.

Обратите внимание:

Не только возможно, но и очень вероятно, что reporterver.config будет перезаписан обновлениями служб отчетов, поэтому вам может потребоваться добавить в него тег <HTMLViewerStyleSheet>SafariChrome</HTMLViewerStyleSheet>.

Это также дает нам возможность ворваться в таблицу стилей по умолчанию и сделать множество других пользовательских изменений, начиная с того, что уже работает. И поскольку это не стандартная таблица стилей, ваш новый пользовательский CSS файл не будет перезаписан во время обновлений и исправлений.

Ответ 5

В моем случае оскорбительный DIV "ctl31_ctl09" , поэтому, если вышеуказанное решение не работает, попробуйте изменить var element = document.getElementById("ctl31_ctl10"); на var element = document.getElementById("ctl31_ctl09");

Ответ 6

Моим решением было добавить следующие <script> в:

Reporting Services\ReportManager\Pages\ Report.aspx

script нацелен на родительский контент видимого отчета 1 и устанавливает style.overflow:visible каждый раз, когда отчет загружает 2 включая пейджинг через многостраничный отчет.

if (window.addEventListener && document.querySelector) window.addEventListener("load", function () {

    // drop out if Sys.Application.add_load is undefined
    if (!window.Sys || !Sys.Application || !Sys.Application.add_load) return;

    // register a function for when report data is loaded
    Sys.Application.add_load(function () {

        // get the report content control
        var n = document.querySelector("[id^=VisibleReportContent]");

        if (n) {

            // get the report content control parent
            n = n.parentNode;

            if (n) {

                // revert overflow:hidden to "visible"
                n.style.overflow = "visible";

            }
        }

    });
});

1 Это означает, что нам не нужно настраивать генерируемые идентификаторы, которые имеют тенденцию к изменению, т.е. ctl31_ctl09, ctl31_ctl10, ctl32_ctl09 и т.д.
2 См. Sys.Application.add_load()

Ответ 7

Для меня имя было " ctl32_ctl09" (SSRS из SQL Server 2012 SP1, MSRS11).

Ответ 8

Чтобы обойти необходимость жесткого кодирования идентификатора элемента, я отредактировал файл ReportingServices.js на сервере RS @ [Диск]:\Program Files\Microsoft SQL Server\[Экземпляр служб отчетов]\Службы Reporting Services\ReportManager\js\ReportingServices.js, чтобы включить некоторый код для извлечения jQuery, загрузить его на страницу, а затем найти все элементы, для которых переполнение установлено автоматически.

Вставьте следующий код в начало файла ReportingServices.js

var loadjQuery = function (cb) {
    if (typeof (jQuery) == 'undefined') {
        var scr = document.createElement('script');
        scr.setAttribute('type', 'text/javascript');
        scr.setAttribute('src', 'http://code.jquery.com/jquery-latest.js');

        if (scr.readyState) {
            scr.onreadystatechange = function () {
                if (scr.readyState === 'complete' || scr.readyState === 'loaded') {
                    scr.onreadystatechange = null;
                    if (typeof (cb) === 'function') {
                        args = [].slice.call(arguments, 1);
                        cb.apply(this, args);
                    }
                }
            };
        }
        else {
            scr.onload = function () {
                if (typeof (cb) === 'function') {
                    args = [].slice.call(arguments, 1);
                    cb.apply(this, args);
                }
            };
        }

        var head = document.getElementsByTagName('head')[0];
        head.insertBefore(scr, head.firstChild);
    }
}

Затем следующая строка после этого - это то, что было первоначально в файле JS.

После этого добавьте следующий код

var _rmFixReady = false;
function pageLoad() {
    loadjQuery(function () {
        _rmFixReady = true;
    });
    if (_rmFixReady) {
        var overflowElements = $('div').filter(function () { return $(this).css('overflow') == 'auto'; });
        overflowElements.each(function () {
            $(this).css('overflow', 'visible');
        });
    }
}

Я только что закончил тестирование с помощью Chrome 27 и IE 10 на экземпляре RM2012, и он отлично работал.

Ответ 9

Мне нужно было войти в Chrome с помощью F12 и заметил, что у меня есть ctl32 _ctl09, а не ctl31_ctl09 в моем div.

Это для Windows Server 2008 R2 64Bit с SQL Server 2012. Добавьте script, а затем перезапустите SSRS и очистите кеш браузера.

//Исправить, чтобы Chrome отображал отчеты SSRS

    function pageLoad() {
    var element = document.getElementById("**ctl32**_ctl09");
    if (element)
    {
        element.style.overflow = "visible";
    }
}

Ответ 10

В выпуске служб Reporting Services в SQL Server 2014 добавлена ​​поддержка браузера Google Chrome, но пока нет поддержки для iOS. Подробнее см. здесь.

Ответ 11

К сожалению, главный ответ разбивает плавающие (абсолютные позиции) столбцы в отчетах Internet Explorer. Поэтому я немного изменил его, что мне не нравится, поскольку он специально ищет WebKit, но он работает:

//SSRS 2012 Chrome fix
function pageLoad() {
    var element = document.getElementById("ctl32_ctl09");
    var isWebKit = !!window.webkitURL;    // Chrome or safari really (WebKit browsers).
    // We don't want to do this fix in Internet Explorer, because it breaks floating columns
    if (element && isWebKit)
    {
        element.style.overflow = "visible";
    }
}

Ответ 12

Мне никогда не удавалось показывать отчеты в Chrome. Большая часть документации Microsoft даже не перечисляет ее, поэтому я полагаю, что у Chrome не должно быть проблем с интерпретацией чего-либо в ASP.

См. Поддержка браузера для служб Reporting Services и Power View.

Я запускаю Chrome 11 и испытываю то же поведение, что и вы.

Ответ 13

Проблема все еще существует в Chrome 22.0.1229.79.

YMMV, но я обнаружил, что удаление высоты из тега ReportViewer устраняет эту проблему.

У меня была проблема с отчетами SSAS, но не с SSRS. Я не мог понять, почему, пока не проверил различия на страницах (консультант сделал отчеты SSAS). Он устанавливал ReportViewer Height = 60%, а отчеты SSRS не указывали высоту.

Как только я удаляю Height, отображаются мои отчеты.

Ответ 14

Для SSRS 2012 на Windows Server 2008 R2 x64, рабочий script:

function pageLoad()
{
    var element = document.getElementById("ctl31_ctl09");
    if (element)
    {
        element.style.overflow = "visible";
    }

    if (window.addEventListener) // W3C standard
    {
         window.addEventListener('load', FixSafari, false); // NB **not** 'onload'
    }
    else
        if (window.attachEvent) // Microsoft
        {
            window.attachEvent('onload', FixSafari);
        }
}

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

Все предложенные выше версии не работали вообще.

Ответ 15

Одна проблема с исправлением overflow:visible заключается в том, что плавающие заголовки разбиты во всех браузерах. Следующий script оставит Internet Explorer самостоятельно и применит исправление только к обозревателям без Интернета и браузеров. При этом все функции сохраняются для пользователей Internet Explorer и других браузеров все еще могут просматривать отчеты.

function pageLoad() {
    var eval = getInternetExplorerVersion();
    if (eval == -1)
    {
        var element = document.getElementById("ctl31_ctl09");
        if (element)
        {
            element.style.overflow = "visible";
        }
    }
}

function getInternetExplorerVersion()
// Returns the version of Internet Explorer or a -1
// (indicating the use of another browser).
{
    var rv = -1; // Return value assumes failure.
    if (navigator.appName == 'Microsoft Internet Explorer')
    {
        var ua = navigator.userAgent;
        var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
        if (re.exec(ua) != null)
            rv = parseFloat( RegExp.$1 );
    }
    return rv;
}

Ответ 16

Я пробовал подходы, и это сработало для меня, но наши системные администраторы скептически относились к этим изменениям.

Вместо того, чтобы устанавливать высоту до 100% на ReportViewer, я использовал фиксированную высоту, и мне удалось работать в моем приложении для Internet Explorer и Chrome.