SSRS 2008 R2 - SSRS 2012 - ReportViewer: Звіти в Safari / Chrome, але чудово працюють у Firefox / Internet Explorer 8 ... чому?


83

У мене є кілька простих звітів 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.

Я був би дуже вдячний, якщо хтось зможе пролити світло на це.



2
Greg H, подивіться на моє рішення та дайте мені знати, якщо це вирішить проблему
Emanuele Greco

Відповіді:


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: у моєму випадку воно (замість цього знайдено azzlak SQL Server 2012 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. Браузери, що не належать до IE, не мають дивовижного режиму IE, і тому правильно відображають 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, переповнення: автоматичний тег перезаписується, і жоден сценарій його не змінює. Ця детальна інформація пояснює, в чому проблема.

Це трапляється тому, що на сторінці, побудованій з панелями AJAX, лише панелі AJAX змінюють свій стан, не оновлюючи всю сторінку. Отже, події OnLoad, які ви застосували до тегу, запускаються лише один раз: при першому завантаженні вашої сторінки. Після цього зміна будь-якої панелі AJAX більше не спричинить ці події.

Mr.einarq запропонував мені рішення тут .

Інший варіант - перейменувати свою функцію в pageLoad.

Будь-які функції з цим іменем будуть автоматично викликані ASP.NET Ajax, якщо вони існують на сторінці, також після кожного часткового оновлення. Якщо ви зробите це, ви також можете видалити атрибут onload з тегу body

Тож я написав вдосконалений сценарій, який показано в рішенні.


Ну гаразд, я можу підтвердити, що це працює і для мене (SQL 2008 R2).
Вінсент Ванкальберг,

3
Також працює в SSRS 2012. У моєму випадку div має ідентифікатор "ctl31_ctl09". Дякую!
Кріс,

Рішення, надане Емануеле, спрацювало для мого, але у мене була проблема з переглядом звіту за допомогою елемента керування ReportViewer на моїй сторінці aspx. Тож я додав трохи коду на сторінку aspx. Я згадав це тут
Самір К

Мені не вдається запустити подію "pageLoad", хоча я вирізав і вставив її в нижню частину файлу JS, вказаного на моєму сервері звітності SSRS. Будь-які пропозиції щодо того, чому це може не зникнути?
Ben Finkel

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

43

Рішення на основі CSS

Я зміг додати наступне до таблиці стилів служб звітування, і це виправило для мене в 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 .
Mike Bockus

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

1
Оце Так! це була моя проблема, я щойно почав вивчати розгортання звіту SSRS R2, і він відображається в IE, але не в chrome. чи є пояснення, чому це? у будь-якому разі, дякую Райане!
Френсіс Саул

1
Мої були позначені як ctl32_ctl109 у SSRS 2012. Після того, як я це розглянув та використав ваш CSS з моїм значенням, він спрацював чудово.
Matt H

18

Це відома проблема . Проблема полягає в тому, що DIV тег має стиль «переповнення: авто» , який , по- видимому, не реалізується також з WebKit , який використовується в Safari і Chrome (див Emanuele Греко відповідь ). Я не знав, як скористатися пропозицією Емануеле використовувати елемент 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;
}

Збережи це.

Після збереження всі існуючі звіти щодо цього екземпляра служб звітування відображатимуться у всіх браузерах, включаючи Chrome і Safari.

Будь ласка, запиши:

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

Це також дає нам місце, щоб увійти в таблицю стилів за замовчуванням та внести багато інших спеціальних змін, починаючи з чогось, що вже працює. Оскільки це не таблиця стилів за замовчуванням, ваш новий власний файл CSS не перезаписується під час оновлення та виправлення.


"Після збереження всі існуючі звіти щодо цього екземпляру служб звітування відображатимуться у всіх браузерах, включаючи Chrome і Safari." - Так, але вони все одно будуть виглядати жахливо.
Stefan Steiger

4

У моєму випадку DIV-правопорушник - "ctl31_ctl09", тому якщо вищевказане рішення не працює для вас, спробуйте змінити var element = document.getElementById("ctl31_ctl10");наvar element = document.getElementById("ctl31_ctl09");


4

Моє рішення було додати наступне <script>до:

Служби звітування \ 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

Випуск служб звітування SQL Server 2014 додає підтримку браузера Google Chrome, але для iOS поки що немає підтримки. Подробиці дивіться тут .



2

Мені довелося зайти в Chrome F12і помітити , що в моєму div є ctl32 _ctl09, а не ctl31_ctl09.

Це для 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

На жаль, основна відповідь розбиває плаваючі (абсолютні позиції) стовпці у звітах 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 \ [Instance Reporting Services] \ Reporting Services \ ReportManager \ js \ ReportingServices.js щоб включити якийсь код для отримання jQuery, завантажити його на сторінку, а потім знайти всі елементи, де для переповнення встановлено значення auto.

Вставте наступний код у верхній частині файлу 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 = 60%, а звіти SSRS не визначали висоту.

Після того, як я видалив Height, мої звіти відображалися.


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.

Див. Підтримку браузера для служб звітування та Power View .

Я працюю на Chrome 11 і маю таку ж поведінку, як і ви.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.