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

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

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

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

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

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


person Greg H    schedule 25.03.2011    source источник
comment
дубликат: stackoverflow.com/questions/5968082/   -  person Tim Partridge    schedule 12.08.2011
comment
Грег Х. посмотрите на мое решение и дайте мне знать, решает ли оно проблему.   -  person Emanuele Greco    schedule 15.09.2011


Ответы (17)


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

Добавьте следующий сценарий в «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-код в своем браузере, чтобы узнать, правильно ли работал сценарий, изменив свойство overflow: auto на overflow: visible.


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

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

#reportViewer_ctl09 {
  overflow:visible !important;
}

Причина

Chrome и Safari отображают overflow: auto иначе, чем Internet Explorer.

SSRS HTML - это HTML QuirksMode, зависящий от ошибок 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;">
...</div>

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

Мне нравится решение Тима ; это легко и работает.

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

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

Мистер Эйнарк предложил мне решение здесь.

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

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

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

person Emanuele Greco    schedule 29.08.2011
comment
Что ж, черт возьми, я могу подтвердить, что это работает и для меня (SQL 2008 R2). - person Vincent Vancalbergh; 19.09.2012
comment
Также работает в SSRS 2012. В моем случае div имеет идентификатор ctl31_ctl09. Спасибо! - person Chris; 19.09.2012
comment
Решение, предоставленное Emanuele, сработало для меня, но у меня возникла проблема с просмотром отчета с помощью элемента управления ReportViewer на моей странице aspx. Поэтому я добавил код на страницу aspx. Я упомянул об этом здесь - person Samir K; 03.10.2012
comment
Я не могу вызвать событие pageLoad, хотя я вырезал и вставил его в нижнюю часть файла JS, указанного на моем сервере отчетов SSRS. Есть предложения о том, почему это может не сработать? - person Ben Finkel; 26.10.2012
comment
@BenFinkel pageLoad () вызывается после каждого обновления UpdatePanel (encosia .com / document-ready-and-pageload-are-not-the-same) так что, возможно, проблема в другом .. попробуйте отладить окно браузера, чтобы увидеть, есть ли ссылка на измененный вами текст и есть ли Javascript ошибки. - person Emanuele Greco; 26.10.2012
comment
Спасибо за советы, я их опробую. Мне удалось заставить его работать, поместив скрипт pageLoad на мою страницу ASPX с элементом управления ReportViewer, но я так и не смог заставить его срабатывать из файла ReportingServices.js. - person Ben Finkel; 26.10.2012
comment
не работает в моем случае. Я создал один div, а затем использовал элемент управления для просмотра отчетов - person pedram; 25.03.2016

Решение на основе 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

person Ryan    schedule 31.05.2013
comment
+1 отлично работает во всех протестированных браузерах (Chrome, Safari, IE9, IE10). На MAC OS X Chrome то же самое ... - person YvesR; 27.06.2013
comment
Если у вас нет доступа к серверу для изменения CSS для всех пользователей, вы можете использовать CSS в этом ответе с расширением браузера, например Stylebot. - person Mike Bockus; 22.09.2014
comment
+1 Хорошее решение! Это дешевле (с точки зрения производительности), чем исправление с помощью Javascript, и его не нужно обновлять каждый раз при обновлении панели AJAX. - person KyleMit; 29.10.2014
comment
Я использовал вариант JS, у которого было намного больше голосов, а затем недавно обновился до последнего пакета обновления (3). Он по какой-то причине перестал работать, поэтому я попробовал это. А + работает как шарм. - person Isaac Fife; 16.12.2014
comment
Просто записка из будущего, когда я недавно столкнулся с этой проблемой. Исправление сработало после того, как я изменил поставляемый CSS следующим образом: div.ctl31_ctl09, div.ctl31_ctl10 вместо знаков фунта. Это было при новой установке SSRS 2008 R2. Возможно, это очевидно, но я действительно не знаю CSS, поэтому мне пришлось немного с этим бороться. - person Razzle Dazzle; 08.10.2015
comment
Ух ты! это была моя проблема, я только начал изучать развертывание отчета SSRS R2, и он отображается в IE, но не в Chrome. есть объяснение, почему это так? в любом случае, спасибо, Райан! - person Francis Saul; 03.09.2016
comment
Мои были помечены как ctl32_ctl109 в SSRS 2012. После поиска и использования вашего CSS с моим значением, он работал отлично. - person Matt H; 22.10.2016
comment
Прекрасно работает. Мы только что перешли с IE на Chrome по всей компании, и до этого исправления у нас были проблемы! - person Eric; 18.04.2018

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

Проблема

введите описание изображения здесь

Решение

Поскольку «overflow: auto» указано в атрибуте style элемента div с идентификатором «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 ".

person Tim Partridge    schedule 12.08.2011

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

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

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

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

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

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

См. Настройка таблиц стилей для средства просмотра HTML и Менеджер отчетов.

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

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

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

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

Затем спуститесь в каталог стилей (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.

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

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

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

person Gawain    schedule 29.08.2013
comment
После сохранения все существующие отчеты в этом экземпляре служб Reporting Services будут отображаться во всех браузерах, включая Chrome и Safari. - Да, но они все равно будут выглядеть ужасно. - person Stefan Steiger; 31.08.2015

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

person Jabran Ali    schedule 23.02.2012

Мое решение заключалось в добавлении следующего <script> в:

Службы Reporting Services \ ReportManager \ Pages \ Report.aspx

Сценарий нацелен на видимое содержимое отчета родительский 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's 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()

person canon    schedule 14.01.2015
comment
Это отлично сработало для меня в SSRS 2008 R2. Это было спасением для нашего пользователя Mac (у которого нет простого способа использовать IE). - person Lawson; 31.03.2015

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

person Frank Goortani    schedule 06.01.2015

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

person Alexus1024    schedule 23.05.2013
comment
Могу подтвердить, что и для SQL Server 2012 SP1 - person azzlack; 29.05.2013

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

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

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

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

К сожалению, основной ответ нарушает плавающие (абсолютные) столбцы в отчетах 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";
    }
}

person archangel76    schedule 30.12.2015

Чтобы обойти необходимость жесткого кодирования идентификатора элемента, я отредактировал файл ReportingServices.js на сервере RS @ [Диск]: \ Program Files \ Microsoft SQL Server \ [Экземпляр служб Reporting Services] \ 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, и он отлично работал.

person Mike Pugh    schedule 23.05.2013

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

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

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

После удаления высоты отображаются мои отчеты.

person fujiiface    schedule 03.10.2012

Для SSRS 2012 на Windows Server 2008 R2 x64 рабочий сценарий:

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
    }
}

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

person user2160060    schedule 12.03.2013

Одна проблема с overflow:visible исправлением заключается в том, что плавающие заголовки не работают во всех браузерах. Следующий сценарий оставит Internet Explorer в покое и применит исправление только к браузерам, отличным от 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;
}
person ant_iw3r    schedule 14.04.2014

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

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

person AsitK    schedule 23.07.2014

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

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

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

person Ryan    schedule 04.05.2011

У меня была такая же проблема с просмотром отчетов в Chrome. Я исправил это, добавив в Google Chrome расширение «SSRS Report Fix». https://chrome.google.com/webstore/detail/ssrs-report-fix/fjbdfjiheafbioiejbdpalmojkeobk

person user3328049    schedule 28.09.2016