SSRS 2008 R2 - SSRS 2012 - ReportViewer: Berichte sind in Safari und Chrome leer


84

Ich habe unsere Berichtsdienste von Version 2008 auf eine andere Serverversion 2008 R2 migriert. In Version 2008 funktionieren die Berichte in Safari einwandfrei. In der neuen Version 2008 R2 werden die Berichte überhaupt nicht angezeigt. Ich sehe nur den Parameterabschnitt und dann ist der Bericht leer. Gleiches gilt für Chrome. Laut Microsoft wird Safari nur eingeschränkt unterstützt. Die Berichte sind nicht komplex. Tatsächlich habe ich einen Bericht erstellt, der nur eine Zeile enthält, um zu sehen, ob er in Safari angezeigt wird, aber nein, dieser Bericht ist ebenfalls vollständig leer. Hat jemand SSRS-Berichte auf Safari sichtbar gemacht? Muss ich mich mit einer Art Konfigurationseinstellung herumschlagen?


Antworten:


109

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

Hängen Sie das folgende Skript an die folgende Datei an (auf dem SSRS-Server).
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"; 
    }
}

Hinweis : Wie Azzlak bemerkte, ist der Name des Div nicht immer ctl31_ctl10. Für SQL 2012 versuchen ctl32_ctl09und für 2008 R2 versuchen ctl31_ctl09. Wenn diese Lösung nicht funktioniert, überprüfen Sie den HTML-Code Ihres Browsers, um festzustellen, ob das Skript ordnungsgemäß funktioniert hat, indem Sie die overflow:autoEigenschaft in ändern overflow:visible.


Lösung für die ReportViewer-Steuerung

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

#reportViewer_ctl09 {
  overflow:visible !important;
 }

Grund

Chrome und Safari rendern overflow:autoin Bezug auf den IE unterschiedlich.

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 HTML - Seite von SSRS 2008 R2 erstellten Berichten enthält eine , divdie hat overflow:autoStil, und es stellt sich Bericht in einen unsichtbaren Bericht.

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

Ich kann Berichte in Chrome anzeigen, indem ich mit den Dev Tools ( ) von Chrome manuell overflow:autoauf overflow:visibledie erstellte Webseite wechsle F12.


Ich liebe Tims Lösung , sie 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, das Tag " Überlauf: Auto" wird 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 OnLoadEreignisse , die Sie auf das <body>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.

Benutzer einarq schlug diese 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 schrieb das verbesserte Skript, das in der Lösung gezeigt wird.


1
Ich habe die Funktion page_load in pageLoad geändert, um das Skript auszulösen. Andernfalls scheint es Rendering-Probleme in Chrome 13 zu lösen. Leider scheint die grundlegende Authentifizierung in SSRS nicht mit Safari 5.1 zu funktionieren, sodass ich sie dort nicht überprüfen kann.
Kermatt

Der Grund ist falsch. Der wahre Grund ist, dass SSRS-HTML QuirksMode-HTML ist und von IE 5.5-Fehlern abhängt. Nicht-IE-Browser haben nicht den IE-Quirksmode und rendern daher den HTML-Code korrekt. Für Browser, die keine IE 5.5-Fehler in ihrem QuirksMode emulieren, fehlt die Einstellung der Tabellenbreite ... Dies gilt übrigens auch für IE 10, da es einen neuen Standard-Quirksmode-Modus gibt.
Stefan Steiger

8
Funktioniert perfekt. Für SQL Server 2012 lautet die fehlerhafte Div-ID jedoch ctl32_ctl09.
Azzlack

3
Versuchen Sie: document.querySelector ("[id ^ = VisibleReportContent]"). parentNode;
Para

1
@JustinMangum - Die Verwendung von querySelector schlägt im IE in der Kompatibilitätsansicht fehl, die mit ziemlicher Sicherheit für Intranet-SSRS-Sites aktiviert ist. Das Symptom ist, dass das Dialogfeld "Laden" niemals geschlossen wird, sodass Benutzer keinen Bericht anzeigen können.
Mike

27

Fügen Sie einfach SizeToReportContent="true"wie unten gezeigt hinzu

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

4
Ich weiß nicht, warum dies nicht die akzeptierte Lösung ist, da a) es gut funktioniert und b) es die eingebaute Lösung zu sein scheint. Kein Hack, damit Reportviewer richtig funktioniert. Nicht, dass irgendetwas falsch daran ist, ReportViewer zu hacken, damit es funktioniert. Scheint, als ob der gesamte Reportviewer auf einem großen Hack ist.
Raif

3
Gilt diese Lösung nicht nur für die Einbettung des ReportViewer-Steuerelements in eine Anwendung? Wenn dies für den Berichts-Manager gilt und Berichte über die ReportServer-URL ausgeführt werden, geben Sie an, wo Sie diese Bearbeitung einfügen müssen.
Registrierter Benutzer

2
Verweisen Sie auf die folgende Zeile in \ SQL \ MSRS11.MSSQLSERVER \ Reporting Services \ ReportServer \ Pages \ ReportViewer.aspx: <RS: ReportViewerHost ID = "ReportViewerControl" runat = "server" />
Registrierter Benutzer

1
Es mag gut funktionieren, aber wenn Sie viele Bilder (Indikatoren / Sparklines) in einem Bericht haben, wird die Rendering-Zeit grausam verkürzt.
Trubs

1
Dies funktioniert nicht beim Ändern von ReportViewer.aspx in SSRS 2012.
Keith

23

Ich verwende Chrome Version 21 mit SQL 2008 R2 SP1 und keine der oben genannten Korrekturen hat bei mir funktioniert. Unten ist der Code , die Arbeit getan hat, wie bei den anderen Antworten , die ich dieses Stück Code anhängen hinzugefügt „C: \ Programme \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ Reportmanager \ js \ ReportingServices.js“ (auf der SSRS-Server):

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

1
Diese Lösung funktioniert in unserer Umgebung sehr gut. Vielen Dank Mike
Vince Perta

14

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

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.


2
Eines verstehe ich nicht. Wenn Sie die Codefunktion FixSari in \ ReportingServices.js anwenden und dann den Code ausführen, um den Bericht in SSRS anzuzeigen, wo wenden Sie die Funktion an, um den Quellmethodencode für FixSafari auszuführen? Wenn ich das richtig verstehe, wird der ursprüngliche Code für ReportingServices.js generiert und am Ende führen Sie FixSafari-Code aus?
What'sUP

12

Meine Lösung basiert auf den obigen Ideen.

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

Es ist nicht auf eine bestimmte ID beschränkt und Sie müssen keine andere Bibliothek wie jQuery einbinden.


Aber die Elemente, auf die alle anderen abzielen, wie ctl31_ctl10 und seine Varianten, müssen nicht unbedingt _fixedTable enthalten. Vermisse ich etwas
Baodad

@Baodad - Die obige Lösung verwendet den Child Selector, um das richtige Div zu finden. Es beginnt basierend auf einem Element weiter oben in der Kette mit einem statischeren ID-Attribut und führt die untergeordneten Elemente den Baum hinunter zum gewünschten Div. Ich würde es vorziehen, einen aussagekräftigeren, weniger überladenen Namen für die Variable zu verwenden, aber dies ist eine ansonsten ausgezeichnete Lösung. Vorgeschlagener Name: reportPayloadElement.
Brian Swift

11

Hier ist die Lösung, die ich für Report Server 2008 R2 verwendet habe

Es sollte unabhängig davon funktionieren, wofür der Berichtsserver in seinem Attribut "id" der Tabelle zur Verwendung ausgegeben wird. Ich glaube nicht, dass Sie immer davon ausgehen können, dass es "ctl31_fixedTable" sein wird.

Ich habe eine Mischung aus dem obigen Vorschlag und einigen Möglichkeiten verwendet, um jquery-Bibliotheken dynamisch in eine Seite aus der hier gefundenen Javascript-Datei zu laden

Wechseln Sie auf dem Server in das Verzeichnis: C: \ Programme \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js

Kopieren Sie die jquery-Bibliothek jquery-1.6.2.min.js in das Verzeichnis

Erstellen Sie eine Sicherungskopie der Datei ReportingServices.js Bearbeiten Sie die Datei. Und fügen Sie dies ganz unten hinzu:

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

Eine Frage: Wenn die Seite mehr als eine Berichtstabelle enthält, führt dies dann nicht zu mehreren Ladevorgängen der Steuerelemente? Wenn ja, könnte die allererste Zeile geändert werden in: var jQueryScriptOutputted = ((typeof (jQueryScriptOutputted) == 'undefined')? False: true);
rmcsharry

4

Sie können dies einfach mit jQuery beheben - und ein wenig hässlichem Hack :-)

Ich habe eine asp.net-Seite mit einem ReportViewer-Benutzersteuerelement.

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

Im Dokument Ready-Ereignis starte ich dann einen Timer und suche nach dem Element, das den Überlauf-Fix benötigt (wie in den vorherigen Beiträgen):

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

Besser als anzunehmen, dass es eine bestimmte ID hat. Sie können den Timer nach Belieben einstellen. Ich habe es hier auf 1000 ms eingestellt.


3

Zu Ihrer Information: Keine der oben genannten Funktionen hat 2012 in SP1 für mich funktioniert. Eine einfache Lösung bestand darin, Anmeldeinformationen in die gemeinsam genutzte Datenquelle einzubetten und Safari dann anzuweisen, der SSRS-Server-Site zu vertrauen. Dann hat es super geklappt! Es hat Tage gedauert, vermeintliche Lösungen wie oben zu suchen, nur um herauszufinden, dass integrierte Sicherheit in Safari nicht zuverlässig funktioniert - Sie müssen sich mit dem Schlüsselbund auf dem Mac herumschlagen und funktionieren dann immer noch nicht zuverlässig.


2

Die von Emanuele bereitgestellte Lösung hat für mich funktioniert. Ich konnte den Bericht sehen, als ich direkt vom Server darauf zugegriffen habe, aber als ich ein ReportViewer-Steuerelement auf meiner Aspx-Seite verwendete, konnte ich den Bericht nicht sehen. Bei der Überprüfung des gerenderten HTML-Codes habe ich ein Div mit der ID "ReportViewerGeneral_ctl09" ( ReportViewerGeneral) gefunden ist die Server-ID des Report Viewer-Steuerelements) gefunden, dessen Überlaufeigenschaft auf "auto" gesetzt war.

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

Ich habe das von Emanuele erläuterte Verfahren verwendet, um dies wie folgt sichtbar zu machen:

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

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

2

Ich habe das benutzt. Fügen Sie auf der Seite Report.aspx einen Skriptverweis auf jquery hinzu. Verwenden Sie Folgendes, um JQuery mit den Microsoft-Ereignissen zu verknüpfen. Ich habe ein wenig von Erics Vorschlag zum Einstellen des Überlaufs verwendet.

$(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');
                    });
                });
            }
        });
    }
});
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.