SSRS 2008 R2 - SSRS 2012 - ReportViewer: Raporty w przeglądarce Safari / Chrome, ale działa dobrze w przeglądarce Firefox / Internet Explorer 8… dlaczego?


83

Mam kilka prostych raportów w programie SSRS 2008 R2, ale nie wyświetlą się one w ogóle w Safari lub Chrome. Według serwisu Microsoft Books Online te przeglądarki są obsługiwane w ograniczonym zakresie. Jednak nic nie widzę po zakończeniu zegara „Ładowanie” danych. Pasek parametrów i sekcja nawigacji okruchów chleba u góry strony są tam dostępne. Mogę również zapisywać / eksportować do dowolnego formatu w Safari i Chrome. Po prostu nie wyświetli samej sekcji raportu, która jest po prostu pusta.

Czy mam używać certyfikatów i zabezpieczonych połączeń (obecnie nie skonfigurowano protokołu HTTPS, tylko HTTP)? Czy są jakieś konfiguracje po stronie serwera, które należy poprawić? Czy ktoś odniósł sukces, wyświetlając JAKIEKOLWIEK raporty w Safari / Chrome przy użyciu poprzednich wersji SSRS (2005)?

Używam Safari 5.0.4i Chrome 10.0.648.151. Wiem, że te dwie przeglądarki są podobne do tego, że obie są oparte na WebKit .

Raport jest pomyślnie renderowany w przeglądarce Internet Explorer 8 (oczywiście) i Firefox 4.0.

Byłbym wdzięczny, gdyby ktoś mógł rzucić na to trochę światła.



2
Greg H spójrz na moje rozwiązanie i daj mi znać, czy to rozwiązuje problem
Emanuele Greco

Odpowiedzi:


94

Ostateczne rozwiązanie (działa również w SSRS 2012!)

Dołącz następujący skrypt do „ C: \ Program Files \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js \ ReportingServices.js ” (na serwerze SSRS):

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

Właściwie nie wiem, czy nazwa div jest zawsze ctl31_ctl10: w moim przypadku tak jest (zamiast tego znaleziono azzlak w SQL Server 2012 ctl32_ctl09).

Jeśli to rozwiązanie nie działa, spójrz na kod HTML z przeglądarki, aby sprawdzić, czy skrypt zadziałał poprawnie, zmieniając właściwość overflow: auto na overflow: visible .


Rozwiązanie dla kontroli ReportViewer

Wstaw tę linię stylu na .aspxstronę (lub do połączonego .csspliku, jeśli jest dostępny):

#reportViewer_ctl09 {
  overflow:visible !important;
}

Powód

Przepełnienie renderowania w Chrome i Safari : automatycznie w inny sposób niż w Internet Explorerze.

HTML SSRS to QuirksMode HTML i zależy od błędów IE 5.5. Przeglądarki inne niż IE nie mają trybu dziwnego IE i dlatego prawidłowo renderują kod HTML

Strona HTML utworzona przez raporty SSRS 2008 R2 zawiera element div, który ma przepełnienie: styl automatyczny i zamienia raport w niewidoczny raport.

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

Ręczna zmiana (za pomocą okna debugowania Chrome) ostateczny przepełnienie HTML : auto w przepełnieniu: widoczne widzę raporty w Chrome.

Uwielbiam rozwiązanie Tima ; to jest łatwe i działa.

Ale wciąż jest problem: za każdym razem, gdy użytkownik zmienia parametry (moje raporty używają parametrów!) AJAX odświeża div, przepełnienie: auto tag jest przepisywane i żaden skrypt go nie zmienia. Ten szczegół techniczny wyjaśnia, na czym polega problem.

Dzieje się tak, ponieważ na stronie zbudowanej przy użyciu paneli AJAX tylko panele AJAX zmieniają swój stan, bez odświeżania całej strony. W rezultacie zdarzenia OnLoad zastosowane do tagu są uruchamiane tylko raz: przy pierwszym wczytaniu strony. Potem zmiana któregokolwiek z paneli AJAX nie będzie już powodować tych zdarzeń.

Pan einarq zasugerował mi tutaj rozwiązanie .

Inną opcją jest zmiana nazwy funkcji na pageLoad.

Wszelkie funkcje o tej nazwie będą wywoływane automatycznie przez ASP.NET Ajax, jeśli istnieją na stronie, również po każdej częściowej aktualizacji. Jeśli to zrobisz, możesz również usunąć atrybut onload z tagu body

Napisałem więc ulepszony skrypt, który jest pokazany w rozwiązaniu.


Cholera, mogę potwierdzić, że to działa również dla mnie (SQL 2008 R2).
Vincent Vancalbergh

3
Działa również w SSRS 2012. W moim przypadku div ma id "ctl31_ctl09". Dziękuję Ci!
Chris,

Rozwiązanie dostarczone przez Emanuele działało dla mojego, ale miałem problem z wyświetlaniem raportu przy użyciu kontrolki ReportViewer na mojej stronie aspx. Więc dodałem kod na stronie aspx. Wspomniałem o
Samir K

Nie mogę uruchomić zdarzenia „pageLoad”, chociaż wyciąłem je i wkleiłem na dole pliku JS wskazanego na moim serwerze raportowania SSRS. Jakieś sugestie, dlaczego to może się nie udać?
Ben Finkel

@BenFinkel "pageLoad () jest wywoływana po każdym odświeżeniu UpdatePanel" ( encosia.com/document-ready-and-pageload-are-not-the-same ), więc może problem jest inny. Spróbuj debugować okno przeglądarki, aby sprawdzić, czy tekst zmodyfikowany przez Ciebie jest połączony i jeśli występują błędy JavaScript.
Emanuele Greco

43

Rozwiązanie oparte na CSS

Udało mi się dodać następujące elementy do arkusza stylów usług Reporting Services i naprawiłem to dla mnie w Chrome.

Zastrzeżenie: to nie jest dokładnie testowane pod kątem zgodności z różnymi przeglądarkami.

/ ************** NAPRAWA BŁĘDU CHROMU ***************** /
div # ctl31_ctl09,
div # ctl31_ctl10
{
    przepełnienie: widoczne! ważne;
}
/ ********************************************* /

Dodaj to na początku ReportingServices.csspliku.

Dla mnie ten plik znajduje się pod adresem:

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


3
+1 działa jak urok we wszystkich testowanych przeglądarkach (Chrome, Safari, IE9, IE10). Na MAC OS X Chrome to samo ...
YvesR,

Jeśli nie masz dostępu do serwera, aby zmodyfikować css dla wszystkich użytkowników, możesz użyć CSS w tej odpowiedzi z rozszerzeniem przeglądarki, takim jak Stylebot .
Mike Bockus

+1 Niezłe rozwiązanie! Jest to tańsze (pod względem wydajności) niż naprawianie za pomocą JavaScript i nie wymaga aktualizacji za każdym razem, gdy panel AJAX aktualizuje się.
KyleMit

1
łał! to był mój problem, właśnie zacząłem studiować wdrażanie raportu SSRS R2 i wyświetla się w IE, ale nie w Chrome. czy istnieje wyjaśnienie, dlaczego tak jest? w każdym razie, dzięki Ryan!
Francis Saul,

1
Moje zostały oznaczone jako ctl32_ctl109 w SSRS 2012. Po sprawdzeniu tego i użyciu CSS z moją wartością, wszystko działało idealnie.
Matt H

18

To znany problem . Problem polega na tym, że znacznik div ma styl „overflow: auto”, który najwyraźniej nie jest realizowany również z WebKit, który jest używany przez Safari i Chrome (patrz Emanuele GRECO odpowiedź ). Nie wiedziałem, jak skorzystać z sugestii Emanuele, aby użyć elementu RS: ReportViewerHost, ale rozwiązałem to za pomocą JavaScript.

Problem

wprowadź opis obrazu tutaj

Rozwiązanie

Ponieważ „overflow: auto” jest określony w atrybucie stylu elementu div o identyfikatorze „ctl31_ctl10”, nie możemy go zastąpić w pliku arkusza stylów, więc zdecydowałem się na JavaScript. Dodałem następujący kod do „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);
}

Uwaga

Wydaje się, że istnieje rozwiązanie dla SSRS 2005 , którego nie próbowałem, ale nie sądzę, aby miało ono zastosowanie do SSRS 2008, ponieważ nie mogę znaleźć klasy „DocMapAndReportFrame”.


7

Rozwiązanie systemowe oparte na CSS

Nie wymaga to żadnych ramek JavaScript ani Ajax ani żadnego innego opakowania. Został przetestowany w przeglądarce Internet Explorer, Firefox, Safari i Chrome.

Można to naprawić na poziomie arkusza stylów na serwerze raportów.

Najpierw przejdź do katalogu, w którym są zainstalowane usługi raportowania, w moim przypadku ( SQL Server 2012 SP1) jest to:

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

W tym katalogu znajdziesz plik o nazwie reportserver.config.

Zobacz Dostosowywanie arkuszy stylów dla przeglądarki HTML i Menedżera raportów .

W tym pliku wstaw pojedynczą linię XML, taką jak (z powyższego dokumentu):

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

Zapisz to.

W powyższym linku nie mówią ci, że ten wpis całkowicie zastępuje domyślny arkusz stylów. Moje pierwsze próby zmuszenia raportów do renderowania działały przez dodanie arkusza stylów div, wszystko inne było zepsute. Kiedy zorientowałem się, że ta edycja pliku reporserver.config nie została rozszerzona, ale faktycznie zastępuje domyślny arkusz stylów, skopiowałem do domyślnego arkusza stylów i wszystko zaczęło działać.

Następnie przejdź do katalogu Styles ( C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportServer\Styles).

Utwórz kopię pliku o nazwie SP_Full.css i nazwij kopię SafariChromeFix.css. W tym momencie SafariChromeFix.css powinno być identyczne z SP_Full.css.

Edytuj SafariChromeFix.css i dodaj następujące wiersze u góry:

div {
    overflow: visible !important;
}

Zapisz to.

Po zapisaniu wszystkie istniejące raporty dotyczące tego wystąpienia usług Reporting Services będą renderowane we wszystkich przeglądarkach, w tym w Chrome i Safari.

Proszę zanotować:

Jest nie tylko możliwe, ale bardzo prawdopodobne, że reporterserver.config zostanie nadpisany aktualizacjami usług raportowania, więc <HTMLViewerStyleSheet>SafariChrome</HTMLViewerStyleSheet>z czasem może być konieczne dodanie do niego tagu.

Daje nam to również miejsce do włamania się do domyślnego arkusza stylów i wprowadzenia wielu innych niestandardowych zmian, zaczynając od czegoś, co już działa. A ponieważ nie jest to domyślny arkusz stylów, Twój nowy niestandardowy plik CSS nie zostanie nadpisany podczas uaktualnień i poprawek.


„Po zapisaniu wszystkie istniejące raporty dotyczące tego wystąpienia usług Reporting Services będą renderowane we wszystkich przeglądarkach, w tym w Chrome i Safari”. - Tak, ale nadal będą wyglądać okropnie.
Stefan Steiger

4

W moim przypadku naruszającym DIV jest „ctl31_ctl09”, więc jeśli powyższe rozwiązanie nie działa, spróbuj zmienić var element = document.getElementById("ctl31_ctl10");navar element = document.getElementById("ctl31_ctl09");


4

Moim rozwiązaniem było dodanie następujących elementów <script>do:

Reporting Services \ ReportManager \ Pages \ Report.aspx

Skrypt jest skierowany do elementu nadrzędnego 1 widocznej zawartości raportu i ustawia za każdym razem, gdy raport ładuje się 2, w tym przeglądanie raportu wielostronicowego.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 oznacza to, że nie mamy się kierować wygenerowane identyfikatory, które mają tendencję do zmian, czyli: ctl31_ctl09, ctl31_ctl10, ctl32_ctl09, itd.
2 widocznySys.Application.add_load()


1
To działało idealnie dla mnie w SSRS 2008 R2. To było uratowanie życia dla naszego użytkownika Maca (który nie ma łatwego sposobu korzystania z IE).
Lawson

2

W SQL Server 2014 Reporting Services dodano obsługę przeglądarki Google Chrome, ale nie ma jeszcze wsparcia dla iOS. Zobacz szczegóły tutaj .



2

Musiałem wejść do Chrome z F12i zauważyłem, że mam ctl32 _ctl09, a nie ctl31_ctl09 w moim div.

Dotyczy to systemu Windows Server 2008 R2 64-bitowego z programem SQL Server 2012 . Dołącz skrypt, a następnie uruchom ponownie usługę SSRS i wyczyść pamięć podręczną przeglądarki.

// Poprawka umożliwiająca Chrome wyświetlanie raportów SSRS

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

2

Niestety główna odpowiedź przerywa zmienne (bezwzględne) kolumny w raportach programu Internet Explorer. Dlatego nieco go zmodyfikowałem, czego nie kocham, ponieważ specjalnie szuka WebKit, ale działa:

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

Aby obejść konieczność zakodowania identyfikatora elementu na stałe, wyedytowałem plik ReportingServices.js na serwerze RS @ [Dysk]: \ Program Files \ Microsoft SQL Server \ [Reporting Services Instance] \ Reporting Services \ ReportManager \ js \ ReportingServices.js aby dołączyć kod do pobrania jQuery, załaduj go na stronę, a następnie znajdź wszystkie elementy, w których przepełnienie jest ustawione na auto.

Wstaw następujący kod u góry pliku 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);
    }
}

Następnie następna linia po tym jest tym, co pierwotnie znajdowało się w pliku JS.

Następnie dodaj następujący kod

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');
        });
    }
}

Właśnie skończyłem testować to z Chrome 27 i IE 10 na instancji RM2012 i działało świetnie.


1

Problem nadal występuje w przeglądarce Chrome 22.0.1229.79.

YMMV , ale odkryłem, że usunięcie wysokości z tagu ReportViewer rozwiązuje ten problem.

Miałem ten problem z raportami SSAS, ale nie z raportami SSRS. Nie mogłem zrozumieć, dlaczego, dopóki nie sprawdziłem różnic na stronach (konsultant zrobił raporty SSAS). Ustawiał wysokość ReportViewer = 60%, a raporty SSRS nie określały wysokości.

Po usunięciu wysokości moje raporty zostały wyświetlone.


1

W przypadku usługi SSRS 2012 w systemie Windows Server 2008 R2 x64 działający skrypt to:

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

Wszystkie sugerowane powyżej wersje w ogóle nie działały.


1

Jednym z problemów z tą overflow:visiblepoprawką jest to, że pływające nagłówki są uszkodzone we wszystkich przeglądarkach. Poniższy skrypt pozostawi przeglądarkę Internet Explorer w spokoju i zastosuje poprawkę tylko do przeglądarek innych niż Internet Explorer. Dzięki temu wszystkie funkcje są zachowane dla użytkowników Internet Explorera, a inne przeglądarki nadal mogą wyświetlać raporty.

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

Wypróbowałem te podejścia i zadziałało to dla mnie, ale nasi administratorzy systemu byli sceptyczni co do tych zmian.

Zamiast ustawiać wysokość na 100% ReportViewer, zastosowałem stałą wysokość i udało mi się to w mojej aplikacji na Internet Explorer i Chrome.



Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.