SSRS 2008 R2 - SSRS 2012 - ReportViewer: Berichte in Safari / Chrome, funktionieren aber in Firefox / Internet Explorer 8 einwandfrei… warum?

83

Ich habe einige einfache Berichte in SSRS 2008 R2, aber sie werden in Safari oder Chrome überhaupt nicht angezeigt. Laut Microsoft Books Online werden diese Browser nur eingeschränkt unterstützt. Ich kann jedoch nichts mehr sehen, nachdem die Uhr "Laden" abgeschlossen ist. Die Parameterleiste und der Brotkrumen-Navigationsbereich oben auf der Seite befinden sich alle dort. Außerdem kann ich in Safari und Chrome in jedem Format speichern / exportieren. Der Berichtsabschnitt selbst, der nur leer ist, wird einfach nicht angezeigt.

Soll ich Zertifikate und gesicherte Verbindungen verwenden (derzeit nicht mit HTTPS eingerichtet, sondern nur mit HTTP)? Gibt es serverseitige Konfigurationen, die angepasst werden müssen? Hat jemand Erfolg anzeigt hat ANY Berichte über Safari / Chrome mit früheren Versionen SSRS (2005)?

Ich benutze Safari 5.0.4und Chrome 10.0.648.151. Ich weiß, dass die Ähnlichkeit dieser beiden Browser darin besteht, dass beide auf WebKit basieren .

Der Bericht wird (natürlich) in Internet Explorer 8 und Firefox 4.0 erfolgreich gerendert.

Ich würde es wirklich begrüßen, wenn jemand etwas Licht ins Dunkel bringen könnte.

Greg H.
quelle
Duplikat: stackoverflow.com/questions/5968082/…
Tim Partridge
2
Greg H schauen Sie sich meine Lösung an und lassen Sie mich wissen, ob sie das Problem löst
Emanuele Greco

Antworten:

94

Ultimative Lösung (funktioniert auch in SSRS 2012!)

Fügen Sie das folgende Skript an " C: \ Programme \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js \ ReportingServices.js " (auf dem SSRS-Server) an:

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

Eigentlich weiß ich nicht, ob der Name des Div immer lautet ctl31_ctl10: in meinem Fall ist es (stattdessen über SQL Server 2012 Azzlak gefunden ctl32_ctl09).

Wenn diese Lösung nicht funktioniert, überprüfen Sie den HTML-Code Ihres Browsers, um festzustellen, ob das Skript ordnungsgemäß funktioniert hat. Ändern Sie die Eigenschaft overflow: auto in overflow: visible .


Lösung für die ReportViewer-Steuerung

Fügen Sie diese Stilzeile in die .aspxSeite ein (oder in eine verknüpfte .cssDatei, falls verfügbar):

#reportViewer_ctl09 {
  overflow:visible !important;
}

Grund

Chrome und Safari rendern Überlauf: Auto anders als Internet Explorer.

SSRS-HTML ist QuirksMode-HTML und hängt von IE 5.5-Fehlern ab. Nicht-IE-Browser haben nicht den IE-Quirksmode und rendern daher den HTML-Code korrekt

Die von SSRS 2008 R2-Berichten erstellte HTML-Seite enthält ein div mit Überlauf: auto style und verwandelt den Bericht in einen unsichtbaren Bericht.

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

Manuelles Ändern (mithilfe des Chrome-Debug-Fensters) Endgültiger HTML- Überlauf: Automatisch im Überlauf: sichtbar Ich kann Berichte in Chrome sehen.

Ich liebe Tims Lösung . Es ist einfach und funktioniert.

Es gibt jedoch immer noch ein Problem: Jedes Mal, wenn der Benutzer Parameter ändert (meine Berichte verwenden Parameter!), Aktualisiert AJAX das div, wird das Tag " Überlauf: Auto" neu geschrieben und kein Skript ändert es. Dieses Technote-Detail erklärt, wo das Problem liegt.

Dies liegt daran, dass auf einer Seite, die mit AJAX-Bedienfeldern erstellt wurde, nur die AJAX-Bedienfelder ihren Status ändern, ohne die gesamte Seite zu aktualisieren. Folglich werden die OnLoad-Ereignisse, die Sie auf das Tag angewendet haben, nur einmal ausgelöst: beim ersten Laden Ihrer Seite. Danach löst das Ändern eines der AJAX-Bedienfelder diese Ereignisse nicht mehr aus.

Mr.einarq schlug mir hier die Lösung vor .

Eine andere Möglichkeit besteht darin, Ihre Funktion in pageLoad umzubenennen.

Alle Funktionen mit diesem Namen werden von ASP.NET Ajax automatisch aufgerufen, wenn sie auf der Seite vorhanden sind, auch nach jeder teilweisen Aktualisierung. In diesem Fall können Sie auch das Onload-Attribut aus dem Body-Tag entfernen

Also habe ich das verbesserte Skript geschrieben, das in der Lösung gezeigt wird.

Emanuele Greco
quelle
Verdammt, ich kann bestätigen, dass dies auch für mich funktioniert (SQL 2008 R2).
Vincent Vancalbergh
3
Funktioniert auch in SSRS 2012. In meinem Fall hat der div die ID "ctl31_ctl09". Danke dir!
Chris
Die von Emanuele bereitgestellte Lösung funktionierte für mich, aber ich hatte ein Problem beim Anzeigen des Berichts mithilfe des ReportViewer-Steuerelements auf meiner Aspx-Seite. Also habe ich Code auf der Aspx-Seite hinzugefügt. Ich habe es hier erwähnt
Samir K
Ich kann das Ereignis "pageLoad" nicht auslösen, obwohl ich es ausgeschnitten und in den unteren Bereich der auf meinem SSRS-Berichtsserver angegebenen JS-Datei eingefügt habe. Irgendwelche Vorschläge, warum das nicht geht?
Ben Finkel
@BenFinkel "pageLoad () wird nach jeder UpdatePanel-Aktualisierung aufgerufen" ( encosia.com/document-ready-and-pageload-are-not-the-same ), daher ist das Problem möglicherweise anders. Versuchen Sie das Debug-Fenster des Browsers, um festzustellen , ob Von Ihnen geänderter Text wird verlinkt und wenn Javascript-Fehler vorliegen.
Emanuele Greco
43

CSS-basierte Lösung

Ich konnte dem Stylesheet für Reporting Services Folgendes hinzufügen, und es wurde für mich in Chrome behoben.

Haftungsausschluss: Dies wird nicht gründlich auf Cross-Browser-Kompatibilität getestet.

/ ************** CHROME BUG FIX ***************** /
div # ctl31_ctl09,
div # ctl31_ctl10
{
    Überlauf: sichtbar! wichtig;
}}
/ ************************************************* /

Fügen Sie das am Anfang der ReportingServices.cssDatei hinzu.

Für mich befindet sich diese Datei unter:

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

Ryan
quelle
3
+1 funktioniert in allen getesteten Browsern (Chrome, Safari, IE9, IE10) wie ein Zauber. Unter MAC OS X Chrome das gleiche ...
YvesR
Wenn Sie nicht für alle Benutzer Zugriff auf den Server haben, um das CSS zu ändern, können Sie das CSS in dieser Antwort mit einer Browsererweiterung wie Stylebot verwenden .
Mike Bockus
+1 Schöne Lösung! Dies ist billiger (in Bezug auf die Leistung) als das Beheben mit Javascript und muss nicht jedes Mal aktualisiert werden, wenn das AJAX-Panel aktualisiert wird.
KyleMit
1
Beeindruckend! Dies war mein Problem. Ich habe gerade angefangen, die Bereitstellung von SSRS R2-Berichten zu untersuchen. Sie wird im IE angezeigt, jedoch nicht in Chrome. Gibt es eine Erklärung, warum das so ist? trotzdem danke Ryan!
Francis Saul
1
Meine wurden in SSRS 2012 als ctl32_ctl109 gekennzeichnet. Nachdem ich das nachgeschlagen und Ihr CSS mit meinem Wert verwendet habe, hat es perfekt funktioniert.
Matt H
18

Dies ist ein bekanntes Problem . Das Problem ist, dass ein div-Tag den Stil "overflow: auto" hat, der mit WebKit, das von Safari und Chrome verwendet wird, anscheinend nicht gut implementiert ist (siehe die Antwort von Emanuele Greco ). Ich wusste nicht, wie ich Emanueles Vorschlag nutzen sollte, das RS: ReportViewerHost-Element zu verwenden, aber ich löste es mit JavaScript.

Problem

Geben Sie hier die Bildbeschreibung ein

Lösung

Da "overflow: auto" im style-Attribut des div-Elements mit der ID "ctl31_ctl10" angegeben ist, können wir es in einer Stylesheet-Datei nicht überschreiben, sodass ich auf JavaScript zurückgegriffen habe. Ich habe den folgenden Code an "C: \ Programme \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js \ ReportingServices.js" angehängt.

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

Hinweis

Es scheint eine Lösung für SSRS 2005 zu geben , die ich nicht ausprobiert habe, aber ich glaube nicht, dass sie auf SSRS 2008 anwendbar ist, da ich die Klasse "DocMapAndReportFrame" nicht finden kann.

Tim Partridge
quelle
7

CSS-basierte systemweite Lösung

Dies erfordert keine JavaScript- oder Ajax-Frames oder andere Wrapper. Es wurde auf Internet Explorer, Firefox, Safari und Chrome getestet.

Dies kann auf Stylesheet-Ebene in Report Server behoben werden.

Navigieren Sie zunächst zu dem Verzeichnis, in dem die Berichtsdienste installiert sind. In meinem Fall ( SQL Server 2012 SP1) ist dies:

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

In diesem Verzeichnis finden Sie eine Datei mit dem Namen reportserver.config.

Siehe Anpassen von Stylesheets für HTML Viewer und Report Manager .

Fügen Sie in diese Datei eine einzelne XML-Zeile ein (aus dem obigen Dokument):

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

Rette das.

Was sie Ihnen im obigen Link nicht sagen, ist, dass dieser Eintrag das Standard-Stylesheet vollständig überschreibt. Meine ersten Versuche, die Berichte zum Rendern zu bringen, funktionierten durch Hinzufügen eines Div-Stylesheets. Alles andere war kaputt. Nachdem ich herausgefunden hatte, dass diese Bearbeitung der Datei reporserver.config nicht erweitert wurde, sondern das Standard-Stylesheet ersetzt, kopierte ich das Standard-Stylesheet und alles begann zu funktionieren.

Als nächstes steigen Sie in das Styles-Verzeichnis ab (C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportServer\Styles ) ab.

Erstellen Sie eine Kopie der Datei SP_Full.css und benennen Sie die Kopie SafariChromeFix.css. Zu diesem Zeitpunkt sollte SafariChromeFix.css mit SP_Full.css identisch sein.

Bearbeiten Sie SafariChromeFix.css und fügen Sie die folgenden Zeilen oben hinzu:

div {
    overflow: visible !important;
}

Speichern Sie es.

Sobald dies gespeichert ist, werden alle vorhandenen Berichte zu dieser Instanz von Reporting Services in allen Browsern einschließlich Chrome und Safari gerendert.

Bitte beachten Sie:

Es ist nicht nur möglich, sondern äußerst wahrscheinlich, dass reportserver.config mit Aktualisierungen der Berichtsdienste überschrieben wird. Daher müssen Sie das <HTMLViewerStyleSheet>SafariChrome</HTMLViewerStyleSheet>Tag möglicherweise im Laufe der Zeit hinzufügen .

Dies gibt uns auch die Möglichkeit, in das Standard-Stylesheet einzusteigen und viele andere benutzerdefinierte Änderungen vorzunehmen, beginnend mit etwas, das bereits funktioniert. Und da es sich nicht um das Standard-Stylesheet handelt, wird Ihre neue benutzerdefinierte CSS-Datei bei Upgrades und Patches nicht überschrieben.

Gawain
quelle
"Sobald dies gespeichert ist, werden alle vorhandenen Berichte zu dieser Instanz von Reporting Services in allen Browsern einschließlich Chrome und Safari gerendert." - Ja, aber sie werden immer noch schrecklich aussehen.
Stefan Steiger
4

In meinem Fall lautet der fehlerhafte DIV "ctl31_ctl09". Wenn die oben genannte Lösung für Sie nicht funktioniert, wechseln Sie var element = document.getElementById("ctl31_ctl10");zuvar element = document.getElementById("ctl31_ctl09");

Jabran Ali
quelle
4

Meine Lösung bestand darin, Folgendes hinzuzufügen <script>:

Reporting Services \ ReportManager \ Pages \ Report.aspx

Das Skript zielt auf die übergeordnete 1 des sichtbaren Berichtsinhalts ab und legt jedes Mal fest, wenn der Bericht 2 lädt - einschließlich Paging durch einen mehrseitigen Bericht.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 Das heißt , wir müssen nicht erzeugt ids Ziel , die eine Tendenz zur Veränderung haben, das heißt: ctl31_ctl09, ctl31_ctl10, ctl32_ctl09etc.
2 SeeSys.Application.add_load()

Kanon
quelle
1
Dies hat in SSRS 2008 R2 perfekt für mich funktioniert. Es war ein Lebensretter für einen Mac-Benutzer von uns (der keine einfache Möglichkeit hat, IE zu verwenden.)
Lawson
2

Die SQL Server 2014-Version von Reporting Services bietet Unterstützung für den Google Chrome-Browser, iOS wird jedoch noch nicht unterstützt. Details finden Sie hier .

Frank Goortani
quelle
2

Für mich war der Name " ctl32_ctl09 " (SSRS von SQL Server 2012 SP1, MSRS11).

Alexus1024
quelle
Kann das auch für SQL Server 2012 SP1 bestätigen
azzlack
2

Ich musste mit Chrome gehen F12und bemerkte, dass ich ctl32 hatte _ctl09 hatte, nicht ctl31_ctl09 in meinem div.

Dies ist für Windows Server 2008 R2 64Bit mit SQL Server 2012 . Hängen Sie das Skript an, starten Sie SSRS neu und leeren Sie den Browser-Cache.

// Fix, damit Chrome SSRS-Berichte anzeigen kann

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

Leider unterbricht die Hauptantwort schwebende (absolute Position) Spalten in Internet Explorer-Berichten. Deshalb habe ich es leicht modifiziert, was ich nicht liebe, da es speziell nach WebKit sucht, aber es funktioniert:

//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";
    }
}

Erzengel76
quelle
1

Um zu umgehen, dass die Element-ID fest codiert werden muss, habe ich die Datei ReportingServices.js auf dem RS-Server unter [Laufwerk]: \ Programme \ Microsoft SQL Server \ [Instanz von Reporting Services] \ Reporting Services \ ReportManager \ js \ ReportingServices.js bearbeitet Um Code zum Abrufen von jQuery einzuschließen, laden Sie ihn in die Seite und suchen Sie alle Elemente, bei denen der Überlauf auf auto gesetzt ist.

Fügen Sie den folgenden Code oben in die Datei ReportingServices.js ein

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

Dann ist die nächste Zeile danach das, was ursprünglich in der JS-Datei war.

Fügen Sie danach den folgenden Code hinzu

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

Ich habe gerade das Testen mit Chrome 27 und IE 10 auf einer RM2012-Instanz beendet und es hat großartig funktioniert.

Mike Pugh
quelle
1

Das Problem besteht weiterhin in Chrome 22.0.1229.79.

YMMV , aber ich habe festgestellt, dass das Entfernen der Höhe aus dem ReportViewer-Tag dieses Problem behebt.

Ich hatte dieses Problem mit SSAS-Berichten, aber nicht mit den SSRS-Berichten. Ich konnte nicht herausfinden, warum, bis ich die Unterschiede auf den Seiten überprüft hatte (ein Berater hatte die SSAS-Berichte erstellt). Er hat ReportViewer Height = 60% festgelegt und in den SSRS-Berichten wurde die Höhe nicht angegeben.

Sobald ich Height entfernt habe, werden meine Berichte angezeigt.

Fujiiface
quelle
1

Für SSRS 2012 unter Windows Server 2008 R2 x64 lautet ein funktionierendes Skript:

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

Alle oben vorgeschlagenen Versionen funktionierten überhaupt nicht.

user2160060
quelle
1

Ein Problem mit dem overflow:visibleFix ist, dass schwebende Header in allen Browsern unterbrochen sind. Das folgende Skript lässt Internet Explorer in Ruhe und wendet den Fix nur auf Nicht-Internet Explorer-Browser an. Damit bleiben alle Funktionen für Internet Explorer-Benutzer erhalten, und andere Browser können die Berichte weiterhin anzeigen.

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;
}
ant_iw3r
quelle
1

Ich habe die Ansätze ausprobiert und es hat bei mir funktioniert, aber unsere Systemadministratoren standen diesen Änderungen skeptisch gegenüber.

Anstatt die Höhe auf 100% ReportViewerfestzulegen, habe ich eine feste Höhe verwendet, die in meiner Anwendung für Internet Explorer und Chrome funktioniert hat.

AsitK
quelle
1

Ich hatte noch nie Glück, Berichte in Chrome anzuzeigen. In den meisten Dokumentationen von Microsoft wird es nicht einmal aufgeführt, daher gehe ich davon aus, dass Chrome Probleme beim Interpretieren von Elementen im ASP haben muss.

Siehe Browserunterstützung für Reporting Services und Power View .

Ich verwende Chrome 11 und habe das gleiche Verhalten wie Sie.

Ryan
quelle