wake-up-neo.com

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

Ich habe einige einfache Berichte in SSRS 2008 R2, aber in Safari oder Chrome werden sie überhaupt nicht angezeigt. Laut der Microsoft-Onlinedokumentation werden diese Browser nur eingeschränkt unterstützt. Ich kann jedoch nichts mehr sehen, nachdem die Uhrzeit für das Laden der Daten abgelaufen ist. Die Parameterleiste und der Navigationsbereich für Semmelbrösel oben auf der Seite sind alle vorhanden. Außerdem kann ich in jedem Safari- und Chrome-Format speichern/exportieren. Es wird nur nicht der Berichtabschnitt selbst angezeigt, der nur leer ist.

Soll ich Zertifikate und gesicherte Verbindungen verwenden (derzeit nicht mit HTTPS eingerichtet, nur HTTP)? Gibt es serverseitige Konfigurationen, die optimiert werden müssen? Hat jemand erfolgreich [~ # ~] irgendwelche [~ # ~] Berichte über Safari/Chrome mit früheren SSRS-Versionen (2005) angezeigt?

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

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

Ich würde es wirklich begrüßen, wenn jemand Licht in diese Sache bringen könnte.

82
Greg H

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 Divs immer ctl31_ctl10 Ist: in meinem Fall ist es (stattdessen wurde über SQL Server 2012 azzlak ctl32_ctl09 Gefunden).

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


Lösung für die ReportViewer-Steuerung

Fügen Sie diese Stilzeile in die Seite .aspx Ein (oder in eine verknüpfte Datei .css, Falls verfügbar):

#reportViewer_ctl09 {
  overflow:visible !important;
}

Grund

Chrome und Safari rendern overflow: auto anders als Internet Explorer.

SSRS-HTML ist QuirksMode-HTML und hängt von IE 5.5-Fehlern ab. Nicht-IE-Browser verfügen nicht über den IE QuirksMode und rendern das HTML daher korrekt

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

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

Manuelles Ändern (über das Chrome-Debug-Fenster) endgültiges HTML Überlauf: automatisch in Überlauf: sichtbar Ich kann Berichte über Chrome anzeigen.

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

Aber es gibt immer noch ein Problem: Jedes Mal, wenn der Benutzer Parameter ändert (meine Berichte verwenden Parameter!) AJAX aktualisiert das div, das overflow: auto -Tag wird umgeschrieben und kein Skript ändert es. Dieses technote Detail erklärt, was das Problem ist.

Dies ist darauf zurückzuführen, dass in einer Seite, die mit AJAX) - Anzeigen erstellt wurde, nur die AJAX= - Anzeigen ihren Status ändern, ohne die gesamte Seite zu aktualisieren. Infolgedessen werden die von Ihnen angewendeten OnLoad-Ereignisse auf dem Tag werden nur einmal ausgelöst: beim ersten Laden Ihrer Seite. Danach werden diese Ereignisse nicht mehr ausgelöst, wenn Sie eines der AJAX Panels ändern.

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

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

Alle Funktionen mit diesem Namen werden von ASP.NET Ajax automatisch aufgerufen, sofern 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.

94
Emanuele Greco

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 browserübergreifende Kompatibilität getestet.

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

Fügen Sie das an den Anfang des ReportingServices.css Datei.

Für mich befindet sich diese Datei unter:

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

43
Ryan

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

Problem

enter image description here

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 https://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);
}

Hinweis

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

18
Tim Partridge

CSS-basierte systemweite Lösung

Hierfür sind keine JavaScript- oder Ajax-Frames oder andere Wrapper erforderlich. Es wurde auf Internet Explorer, Firefox, Safari und Chrome getestet.

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

Navigieren Sie zunächst zu dem Verzeichnis, in dem Reporting Services 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 Stylesheets für HTML Viewer und Report Manager anpassen.

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

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

Rette das.

Was sie im obigen Link nicht sagen, ist, dass dieser Eintrag das Standard-Stylesheet vollständig überschreibt. Meine ersten Versuche, die Berichte durch Hinzufügen eines div-Stylesheets zum Rendern zu bringen, waren fehlerhaft. 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 (C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportServer\Styles).

Erstellen Sie eine Kopie der Datei mit dem Namen 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 in dieser Instanz von Reporting Services in allen Browsern gerendert, einschließlich Chrome und Safari.

Bitte beachten Sie:

Es ist nicht nur möglich, aber sehr wahrscheinlich, dass die Datei reportserver.config mit Updates für Reporting Services überschrieben wird. Daher müssen Sie möglicherweise das <HTMLViewerStyleSheet>SafariChrome</HTMLViewerStyleSheet> im Laufe der Zeit hinein.

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

7
Gawain

In meinem Fall ist die beleidigende DIV "ctl31_ctl09". Wenn die obige Lösung für Sie nicht funktioniert, versuchen Sie, var element = document.getElementById("ctl31_ctl10"); in var element = document.getElementById("ctl31_ctl09"); zu ändern.

4
Jabran Ali

Meine Lösung bestand darin, den folgenden <script> Hinzuzufügen:

Reporting Services\ReportManager\Pages \Report.aspx

Das Skript zielt auf das übergeordnete Element sichtbarer Berichtsinhalt ab1 und setzt bei jedem Laden des Berichts style.overflow:visible2 -Einschließlich Blättern durch einen mehrseitigen Bericht.

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 Dies bedeutet, dass wir keine generierten IDs ansteuern müssen, die dazu neigen, sich zu ändern, d. H .: ctl31_ctl09, ctl31_ctl10, ctl32_ctl09 Usw.
2 Siehe Sys.Application.add_load()

4
canon

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

2
Alexus1024

Ich musste in Chrome mit F12 und bemerkte, dass ich ctl32 _ ctl09 hatte, nicht ctl31_ctl09 in meinem div.

Dies gilt 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 um Chrome zur Anzeige von SSRS-Berichten zuzulassen

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

Die SQL Server 2014-Version von Reporting Services bietet Unterstützung für den Google-Browser Chrome), für iOS gibt es jedoch noch keine Unterstützung. Weitere Informationen finden Sie unter hier .

2
Frank Goortani

Leider bricht die Hauptantwort in Internet Explorer-Berichten schwebende (positionsabsolute) Spalten. Deshalb habe ich es leicht modifiziert, was ich nicht mag, 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";
    }
}
2
archangel76

Ich hatte noch nie Glück damit, Berichte in Chrome anzuzeigen. Die meisten Microsoft-Dokumente führen sie nicht einmal auf, daher gehe ich davon aus, dass Chrome) Probleme mit der Interpretation von ASP-Inhalten haben muss.

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

Ich starte Chrome 11 und erlebe dasselbe Verhalten wie Sie.

1
Ryan

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 in den Seiten überprüfte (ein Berater hatte die SSAS-Berichte gemacht). Er stellte die ReportViewer-Höhe auf 60% ein und in den SSRS-Berichten wurde die Höhe nicht angegeben.

Nachdem ich Height entfernt hatte, wurden meine Berichte angezeigt.

1
fujiiface

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

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

1
AsitK

Ein Problem mit dem overflow:visible Fix ist, dass Floating-Header in allen Browsern fehlerhaft sind. Das folgende Skript lässt Internet Explorer in Ruhe und wendet den Fix nur auf Browser an, die nicht mit Internet Explorer kompatibel sind. 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;
}
1
ant_iw3r

Ich hatte das gleiche Problem beim Anzeigen von Repports auf Chrome. Ich habe es behoben, indem ich Google Chrome die Erweiterung "SSRS Report Fix" hinzugefügt habe. https://chrome.google.com/webstore/detail/ssrs-report-fix/fjbdfjiheheafbioiejbdpalmojkeobk

1
user3328049

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.

1
user2160060

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

Fügen Sie den folgenden Code oben in die ReportingServices.js-Datei 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);
    }
}

Danach folgt die nächste Zeile, die ursprünglich in der JS-Datei enthalten war.

Fügen Sie anschließend 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.

1
Mike Pugh