SSRS 2008 R2 - SSRS 2012 - ReportViewer: Звіти порожні в Safari та Chrome


84

Я переніс наші служби звітування з версії 2008 на інший сервер версії 2008 R2. У версії 2008 звіти чудово працюють на Safari. У новій версії 2008 R2 звіти взагалі не відображаються. Все, що я бачу, - це розділ параметрів, а тоді звіт порожній. Те саме в Chrome. Згідно з Microsoft Safari IS підтримується, якщо обмежено. Звіти не є складними. Насправді я створив звіт, на якому був лише рядок, щоб побачити, чи з’явиться він у Safari, але ні, цей звіт також повністю порожній. Хтось робив звіти SSRS доступними для перегляду в Safari? Чи потрібно возитися з якимись налаштуваннями конфігурації?


Відповіді:


109

Універсальне рішення (працює і в SSRS 2012!)

Додайте наступний сценарій до наступного файлу (на сервері SSRS)
C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportManager\js\ReportingServices.js

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

Примітка : Як зазначив azzlak, ім'я div не завжди ctl31_ctl10. Для SQL 2012 спробуйте ctl32_ctl09і для 2008 R2 спробуйте ctl31_ctl09. Якщо це рішення не працює, перегляньте HTML вашого браузера, щоб перевірити, чи правильно працював сценарій, змінивши overflow:autoвластивість на overflow:visible.


Рішення для контролю ReportViewer

Вставте на .aspxсторінку (або у зв’язаний .cssфайл, якщо такий є) цей рядок стилю

#reportViewer_ctl09 {
  overflow:visible !important;
 }

Причина

Chrome і Safari overflow:autoпо-різному відображають IE.

SSRS HTML - це QuirksMode HTML і залежить від помилок IE 5.5. Браузери, що не належать до IE, не мають дивовижного режиму IE, і тому правильно відображають HTML

HTML сторінка виробляється звітами SSRS 2008 R2 містить divякий має overflow:autoстиль, і він перетворює звіт в невидимий звіт.

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

Я бачу звіти в Chrome, вручну переходячи overflow:autoна overflow:visibleстворену веб-сторінку за допомогою Chrome Dev Tools ( F12).


Мені подобається рішення Тіма , воно легке та робоче.

Але проблема все ще є: щоразу, коли користувач змінює параметри (мої звіти використовують параметри!) AJAX оновлює div, переповнення: автоматичний тег перезаписується, і жоден сценарій його не змінює.

Ця детальна інформація пояснює, в чому проблема:

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

Користувач einarq запропонував таке рішення :

Інший варіант - перейменувати свою функцію в pageLoad. Будь-які функції з цим іменем автоматично викликатимуться asp.net ajax, якщо вони існують на сторінці, також після кожного часткового оновлення. Якщо ви зробите це, ви також можете видалити атрибут onload з тегу body

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


1
Я змінив функцію page_load на pageLoad, щоб запустити сценарій. В іншому випадку це, здається, вирішує проблеми з рендерингом у Chrome 13. На жаль, базовий аутентифікатор у SSRS, схоже, не працює з Safari 5.1, тому я не можу перевірити там.
kermatt

Причина неправильна. Справжня причина полягає в тому, що SSRS HTML - це QuirksMode HTML і залежить від помилок IE 5.5. Браузери, що не належать до IE, не мають дивовижного режиму IE, і тому правильно відображають HTML. Для браузерів, які не імітують помилки IE 5.5 у своєму QuirksMode, йому не вистачає встановлення ширини таблиці ... Це, до речі, стосується і IE 10, оскільки він має новий режим quirksmode за замовчуванням.
Stefan Steiger

8
Працює ідеально. Але для SQL Server 2012 образливим ідентифікатором div є ctl32_ctl09.
azzlack

3
замість того, щоб шукати ідентифікатор ctl32_ctl09 або що-небудь генерується, спробуйте: document.querySelector ("[id ^ = VisibleReportContent]"). parentNode;
Пара

1
@JustinMangum - використання querySelector не вдасться в IE у режимі сумісності, який майже напевно увімкнено для сайтів інтрамережі SSRS. Ознакою є те, що діалогове вікно завантаження ніколи не закриється, тому користувачі не зможуть переглянути жоден звіт.
Майк

27

Просто включіть, SizeToReportContent="true"як показано нижче

<rsweb:ReportViewer ID="ReportViewer1" runat="server" SizeToReportContent="True"...

4
Я не знаю, чому це не прийняте рішення, оскільки а) воно працює нормально, і б) воно, схоже, є вбудованим рішенням. Ані хак, щоб змусити програму перегляду звітів працювати належним чином. Не те, щоб у злому ReportViewer було щось погане, щоб він працював. Здається, весь репортаж репортажів переживає великий злом.
Райф,

3
Чи не застосовується це рішення лише для вбудування елемента керування ReportViewer у програму? Якщо це стосується диспетчера звітів, а звіти запускаються за URL-адресою ReportServer, укажіть, куди потрібно включити це редагування.
Зареєстрований користувач

2
Ви посилаєтесь на такий рядок у \ SQL \ MSRS11.MSSQLSERVER \ Reporting Services \ ReportServer \ Pages \ ReportViewer.aspx: <RS: ReportViewerHost ID = "ReportViewerControl" runat = "server" />
Зареєстрований користувач

1
Це може працювати нормально, але якщо у вас у звіті багато зображень (індикаторів / іскрових ліній), це буде жорстоко знижувати час візуалізації.
Трубс

1
Це не працює при зміні ReportViewer.aspx у SSRS 2012.
Кіт,

23

Я використовую Chrome версії 21 з SQL 2008 R2 SP1, і жодне з наведених вище виправлень не працювало для мене. Нижче наведено код, який спрацював, як і в інших відповідях, я додав цей біт коду в Додаток до "C: \ Program Files \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js \ ReportingServices.js" (на Сервер SSRS):

//Fix to allow Chrome to display SSRS Reports
function pageLoad() { 
    var element = document.getElementById("ctl31_ctl09");
    if (element) 
    {
        element.style.overflow = "visible";         
    } 
}

1
Це рішення дуже добре працює в нашому середовищі. Спасибі Майк
Вінс Перта

14

Це відома проблема . Проблема в тому, що тег 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 http://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".


2
Я не розумію однієї речі. якщо ви застосуєте функцію коду FixSari в \ ReportingServices.js, а потім виконаєте код для відображення звіту в SSRS, де ви застосуєте функцію для виконання вихідного коду методу для FixSafari? Якщо я правильно розумію, генерується оригінальний код для ReportingServices.js, і в підсумку ви виконуєте код FixSafari?
What'sUP

12

Моє рішення базується на наведених вище ідеях.

function pageLoad() {
    var element = document.querySelector('table[id*=_fixedTable] > tbody > tr:last-child > td:last-child > div');
    if (element) {
        element.style.overflow = "visible";
    } 
}

Це не обмежується певним ідентифікатором, плюс вам не потрібно включати будь-яку іншу бібліотеку, таку як jQuery.


Але елементи, на які націлені всі інші, такі як ctl31_ctl10 та його варіанти, не обов’язково містять в собі _fixedTable. Мені чогось не вистачає?
Баодад

@Baodad - Наведене вище рішення використовує дочірній селектор, щоб знайти правильний div. Він починається з елемента, що знаходиться вище в ланцюжку, з більш статичним атрибутом id, а потім веде дітей вниз по дереву до потрібного div. Я вважав би за краще використовувати більш описове, менш перевантажене ім'я змінної, але це інакше відмінне рішення. Запропонована назва: reportPayloadElement.
Брайан Свіфт,

11

Ось рішення, яке я використав для Report Server 2008 R2

Він повинен працювати незалежно від того, для чого сервер звітів виводить дані для використання в атрибуті "id" таблиці. Я не думаю, що ви завжди можете припустити, що це буде "ctl31_fixedTable"

Я використав поєднання наведеної вище пропозиції та деякі способи динамічного завантаження бібліотек jquery на сторінку з файлу javascript, знайденого тут

На сервері перейдіть до каталогу: C: \ Program Files \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js

Скопіюйте бібліотеку jquery jquery-1.6.2.min.js у каталог

Створіть резервну копію файлу ReportingServices.js Відредагуйте файл. І додайте це внизу:

var jQueryScriptOutputted = false;
function initJQuery() {

    //if the jQuery object isn't available
    if (typeof(jQuery) == 'undefined') {


        if (! jQueryScriptOutputted) {
            //only output the script once..
            jQueryScriptOutputted = true;

            //output the script 
            document.write("<scr" + "ipt type=\"text/javascript\" src=\"../js/jquery-1.6.2.min.js\"></scr" + "ipt>");
         }
        setTimeout("initJQuery()", 50);
    } else {

        $(function() {     

        // Bug-fix on Chrome and Safari etc (webkit)
        if ($.browser.webkit) {

            // Start timer to make sure overflow is set to visible
             setInterval(function () {
                var div = $('table[id*=_fixedTable] > tbody > tr:last > td:last > div')

                div.css('overflow', 'visible');
            }, 1000);
        }

        });
    }        
}

initJQuery();

Хоча одне питання, якщо на сторінці є більше однієї таблиці звітів, чи це не спричинить багаторазове завантаження елементів керування? Якщо так, то перший перший рядок можна змінити на: var jQueryScriptOutputted = ((typeof (jQueryScriptOutputted) == 'undefined')? False: true);
rmcsharry

4

Ви можете легко це виправити за допомогою jQuery - і трохи потворного зламу :-)

У мене є сторінка asp.net із контролером користувача ReportViewer.

 <rsweb:ReportViewer ID="ReportViewer1" runat="server"...

Потім у події готовності до документа я запускаю таймер і шукаю елемент, який потребує виправлення переповнення (як попередні повідомлення):

 <script type="text/javascript">
    $(function () {
        // Bug-fix on Chrome and Safari etc (webkit)
        if ($.browser.webkit) {
            // Start timer to make sure overflow is set to visible
             setInterval(function () {
                var div = $('#<%=ReportViewer1.ClientID %>_fixedTable > tbody > tr:last > td:last > div')
                div.css('overflow', 'visible');
            }, 1000);
        }
    });
</script>

Краще, ніж припускати, що він має певний ідентифікатор. Ви можете налаштувати таймер на будь-який смак. Я встановив тут 1000 мс.


3

FYI - жодне з перерахованого вище не спрацювало для мене в 2012 SP1 ... простим рішенням було вбудувати облікові дані у спільне джерело даних, а потім сказати Safari довіряти сайту сервера SSRS. Тоді це чудово працювало! Минули дні, щоб переслідувати передбачувані рішення, як зазначено вище, лише для того, щоб з’ясувати, що інтегрована безпека не буде надійно працювати в Safari - вам доведеться возитися з брелоком на Mac, а потім все одно не працюватиме надійно.


2

Рішення, надане Емануеле, спрацювало для мене. Я міг бачити звіт, коли отримував доступ до нього безпосередньо з сервера, але коли я використовував елемент керування ReportViewer на моїй сторінці aspx, я не міг бачити звіт. Перевіривши відтворений HTML, я знайшов div за ідентифікатором "ReportViewerGeneral_ctl09" ( ReportViewerGeneral - це ідентифікатор сервера елемента керування засобом перегляду звітів), для якого властивість переповнення була встановлена ​​на auto.

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

Я використав процедуру, пояснену Емануеле, щоб змінити це на видиме наступним чином:

function pageLoad() {
    var element = document.getElementById("ReportViewerGeneral_ctl09");

    if (element) {
        element.style.overflow = "visible";
    }
}

2

Я цим користувався. Додайте посилання на скрипт до jquery на сторінці Report.aspx. Використовуйте наступне, щоб зв’язати JQuery з подіями Microsoft. Використав трохи пропозицій Еріка щодо встановлення переповнення.

$(document).ready(function () {
    if (navigator.userAgent.toLowerCase().indexOf("webkit") >= 0) {        
        Sys.Application.add_init(function () {
            var prm = Sys.WebForms.PageRequestManager.getInstance();
            if (!prm.get_isInAsyncPostBack()) {
                prm.add_endRequest(function () {
                    var divs = $('table[id*=_fixedTable] > tbody > tr:last > td:last > div')
                    divs.each(function (idx, element) {
                        $(element).css('overflow', 'visible');
                    });
                });
            }
        });
    }
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.