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

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

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

Ответы [ 17 ]

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

Окончательное решение (работает и в 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 является QuirksMode HTML и зависит от ошибок IE 5.5. Non-IE браузеры не имеют quirksmode IE и поэтому отображают HTML правильно

HTML-страница, создаваемая отчетами SSRS 2008 R2, содержит div с переполнением : стиль 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

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

43 голосов
/ 31 мая 2013

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

18 голосов
/ 12 августа 2011

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

Проблема

enter image description here

Решение

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

7 голосов
/ 29 августа 2013

Общесистемное решение на основе 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 не перезаписывается во время обновлений и исправлений.

4 голосов
/ 14 января 2015

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

Службы отчетов \ ReportManager \ Pages \ Report.aspx

Сценарий нацелен на видимое содержимое отчета parent 1 и устанавливает style.<a href="https://developer.mozilla.org/en-US/docs/Web/CSS/overflow" rel="nofollow">overflow</a>:<a href="https://developer.mozilla.org/en-US/docs/Web/CSS/overflow#Values" rel="nofollow">visible</a> каждый раз при загрузке отчета 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.<a href="http://msdn.microsoft.com/en-us/library/vstudio/bb383829(v=vs.100).aspx" rel="nofollow">add_load()</a>

4 голосов
/ 23 февраля 2012

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

2 голосов
/ 06 января 2015

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

2 голосов
/ 16 июля 2013

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

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

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

    function pageLoad() {
    var element = document.getElementById("**ctl32**_ctl09");
    if (element)
    {
        element.style.overflow = "visible";
    }
}
2 голосов
/ 23 мая 2013

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

2 голосов
/ 30 декабря 2015

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