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


83

У меня есть несколько простых отчетов 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.

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



2
Грег Х. посмотрите на мое решение и дайте мне знать, решает ли оно проблему
Эмануэле Греко

Ответы:


94

Окончательное решение (работает и в 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 отображают переполнение: автоматически по-разному относительно 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 : автоматически при переполнении: видимое Я могу видеть отчеты в Chrome.

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

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

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

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

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

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

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


Что ж, черт возьми, я могу подтвердить, что это работает и для меня (SQL 2008 R2).
Винсент Ванкалберг

3
Также работает в SSRS 2012. В моем случае div имеет идентификатор «ctl31_ctl09». Спасибо!
Крис,

Решение, предоставленное Emanuele, сработало для меня, но у меня возникла проблема с просмотром отчета с помощью элемента управления ReportViewer на моей странице aspx. Итак, я добавил код на страницу aspx. Я упомянул об этом здесь
Samir K

Я не могу вызвать событие pageLoad, хотя я вырезал и вставил его в нижнюю часть файла JS, указанного на моем сервере отчетов SSRS. Есть предложения о том, почему это может не сработать?
Бен Финкель,

@BenFinkel "pageLoad () вызывается после каждого обновления UpdatePanel" ( encosia.com/document-ready-and-pageload-are-not-the-same ), так что, возможно, проблема в другом .. попробуйте окно отладки браузера, чтобы проверить, не измененный вами текст будет связан, и если есть ошибки Javascript.
Эмануэле Греко

43

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

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

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

/ ************** ИСПРАВЛЕНИЕ ОШИБКИ ХРОМА ***************** /
div # ctl31_ctl09,
div # ctl31_ctl10
{
    переполнение: видно! важно;
}
/ ******************************************** /

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

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

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


3
+1 отлично работает во всех протестированных браузерах (Chrome, Safari, IE9, IE10). На MAC OS X Chrome то же самое ...
YvesR

Если у вас нет доступа к серверу для изменения CSS для всех пользователей, вы можете использовать CSS в этом ответе с расширением браузера, например Stylebot .
Майк Бокус

+1 Хорошее решение! Это дешевле (с точки зрения производительности), чем исправление с помощью Javascript, и его не нужно обновлять каждый раз при обновлении панели AJAX.
KyleMit

1
Вот Это Да! это была моя проблема, я только начал изучать развертывание отчета SSRS R2, и он отображается в IE, но не в Chrome. есть объяснение, почему это так? в любом случае, спасибо, Райан!
Фрэнсис Саул

1
Мои были помечены как ctl32_ctl109 в SSRS 2012. После поиска и использования вашего CSS с моим значением, он работал отлично.
Мэтт Х,

18

Это известная проблема . Проблема в том, что тег div имеет стиль «overflow: auto», который, по-видимому, плохо реализован с WebKit, который используется Safari и Chrome (см. Ответ Эмануэля Греко ). Я не знал, как воспользоваться предложением Эмануэля использовать элемент 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 /programming/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».


7

Общесистемное решение на основе 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 не дополняет, а фактически заменяет таблицу стилей по умолчанию, я скопировал ее в таблицу стилей по умолчанию, и все начало работать.

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


«После сохранения все существующие отчеты в этом экземпляре служб Reporting Services будут отображаться во всех браузерах, включая Chrome и Safari». - Да, но они все равно будут выглядеть ужасно.
Стефан Штайгер

4

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


4

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

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

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

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()


1
Это отлично сработало для меня в SSRS 2008 R2. Это было спасением для нашего пользователя Mac (у которого нет простого способа использовать IE)
Лоусон

2

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



2

Мне пришлось зайти в Chrome F12и заметить, что у меня ctl32 , что в моем div _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";
    }
}

2

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


1

Чтобы обойти необходимость жесткого кодирования идентификатора элемента, я отредактировал файл ReportingServices.js на сервере RS @ [Drive]: \ 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, и он отлично работал.


1

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

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

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

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


1

Для 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
    }
}

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


1

Одна из проблем с 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;
}

1

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

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


1

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

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

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.