web-dev-qa-db-fra.com

SSRS 2008 R2 - SSRS 2012 - ReportViewer: les rapports sont vides dans Safari et Chrome

J'ai migré nos services de génération de rapports de la version 2008 vers un autre serveur version 2008 R2. En version 2008, les rapports fonctionnent correctement sur Safari. La nouvelle version 2008 R2, les rapports ne s'affichent pas du tout. Tout ce que je vois est la section des paramètres, puis le rapport est vide. Même chose en Chrome. Selon Microsoft Safari IS est pris en charge de manière limitée. Les rapports ne sont pas complexes. En fait, j’ai créé un rapport contenant uniquement une ligne pour voir s’il serait affiché dans Safari mais non, ce rapport est également entièrement vierge. Est-ce que quelqu'un a rendu les rapports SSRS visibles sur Safari? Dois-je jouer avec un type de paramètre de configuration?

84
Anita C

Solution ultime (fonctionne également dans SSRS 2012!)

Ajoutez le script suivant au fichier suivant (sur le serveur 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"; 
    }
}

Note : Comme l'a souligné azzlak, le nom du div n'est pas toujours ctl31_ctl10. Pour SQL 2012, essayez ctl32_ctl09 Et pour 2008 R2, essayez ctl31_ctl09. Si cette solution ne fonctionne pas, examinez le code HTML de votre navigateur pour voir si le script a fonctionné correctement en remplaçant la propriété overflow:auto Par overflow:visible.


Solution pour le contrôle de ReportViewer

Insérer dans la page .aspx (Ou dans un fichier lié .css, Si disponible) cette ligne de style

#reportViewer_ctl09 {
  overflow:visible !important;
 }

Raison

Chrome et Safari rendent overflow:auto De manière différente par rapport à IE.

SSRS HTML est QuirksMode HTML et dépend de IE 5.5 bugs. Les navigateurs non-IE ne disposent pas du IE quirksmode et donc restituent correctement le code HTML

La page HTML produite par les rapports SSRS 2008 R2 contient un style div qui a le style overflow:auto Et transforme le rapport en rapport invisible.

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

Je peux voir les rapports sur Chrome en remplaçant manuellement overflow:auto Par overflow:visible Dans la page Web produite à l'aide des outils de développement de Chrome (F12).


J'aime la solution de Tim , c'est facile et efficace.

Mais il y a toujours un problème: chaque fois que l'utilisateur modifie les paramètres (mes rapports utilisent des paramètres!) AJAX rafraîchit la div, le débordement: auto la balise est réécrite et aucun script ne le change.

Ce détail technique explique quel est le problème:

Cela se produit car, dans une page construite avec des panneaux AJAX, seuls les panneaux AJAX changent d’état, sans actualiser la page entière. Par conséquent, le OnLoad Les événements que vous avez appliqués à la balise <body> ne sont déclenchés qu'une seule fois: lors du premier chargement de votre page, après quoi, modifier l'un des panneaux AJAX ne déclenchera plus ces événements). .

Utilisateur einarq suggéré cette solution :

Une autre option consiste à renommer votre fonction en pageLoad. Toute fonction portant ce nom sera appelée automatiquement par asp.net ajax si elle existe sur la page, également après chaque mise à jour partielle. Si vous le faites, vous pouvez également supprimer l'attribut onload de la balise body.

Ainsi écrit le script amélioré présenté dans la solution.

107
Emanuele Greco

Il suffit d'inclure SizeToReportContent="true" comme indiqué ci-dessous

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

J'utilise Chrome version 21 avec SQL 2008 R2 SP1 et aucun des correctifs ci-dessus ne fonctionnaient pour moi. Voici le code qui a fonctionné. À l'instar des autres réponses, j'ai ajouté ce code à Ajouter à "C:\Programmes\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Services de génération de rapports\ReportManager\js\ReportingServices.js" (sur le serveur SSRS):

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

Ceci est un problème conn . Le problème est qu’une balise div a le style "overflow: auto" qui, apparemment, n’est pas bien implémenté avec WebKit utilisé par Safari et Chrome (voir la réponse d’Emanuele Greco)). Je ne savais pas. comment tirer parti de la suggestion d'Emanuele d'utiliser l'élément RS: ReportViewerHost, mais je l'ai résolu en utilisant JavaScript.

Problème

enter image description here

Solution

Puisque "overflow: auto" est spécifié dans l'attribut style de l'élément div avec l'id "ctl31_ctl10", nous ne pouvons pas le remplacer dans un fichier de feuille de style, j'ai donc eu recours à JavaScript. J'ai ajouté le code suivant à "C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Services de génération de rapports\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);
}

Remarque

Il semble y avoir un solution pour SSRS 2005 que je n’ai pas essayé mais je ne pense pas que cela soit applicable à SSRS 2008 car je ne trouve pas la classe "DocMapAndReportFrame".

14
Tim Partridge

Ma solution basée sur les idées ci-dessus.

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

Cela ne se limite pas à un certain identifiant et vous n'avez pas besoin d'inclure une autre bibliothèque telle que jQuery.

12
Jim Bauwens

Voici la solution que j'ai utilisée pour Report Server 2008 R2

Il devrait fonctionner indépendamment de ce que Report Server générera pour utilisation dans son attribut "id" de la table. Je ne pense pas que vous puissiez toujours supposer que ce sera "ctl31_fixedTable"

J'ai utilisé un mélange de la suggestion ci-dessus et de plusieurs méthodes pour charger dynamiquement les bibliothèques jquery dans une page à partir d'un fichier javascript trouvé ici

Sur le serveur, accédez au répertoire: C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\ReportManager\js

Copiez la bibliothèque jquery jquery-1.6.2.min.js dans le répertoire.

Créez une copie de sauvegarde du fichier ReportingServices.js Editez le fichier. Et ajoutez ceci au bas de celui-ci:

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();
11
Eric Weiss

Vous pouvez y remédier facilement avec jQuery - et un petit bidouillage laid :-)

J'ai une page asp.net avec un contrôle utilisateur ReportViewer.

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

Dans l'événement "document ready", je démarre un minuteur et recherche l'élément qui nécessite le correctif de débordement (comme dans les messages précédents):

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

Mieux que de supposer qu'il a un certain identifiant. Vous pouvez régler la minuterie à votre guise. Je l'ai mis à 1000 ms ici.

4
henebb

Pour votre information - aucune de ces solutions n'a fonctionné pour moi en 2012 SP1 ... une solution simple consistait à intégrer des informations d'identification dans la source de données partagée, puis d'indiquer à Safari de faire confiance au site du serveur SSRS. Ensuite, cela a très bien fonctionné! Il a fallu des jours à la recherche de solutions supposées comme ci-dessus uniquement pour découvrir que la sécurité intégrée ne fonctionnerait pas de manière fiable sur Safari - vous devez jouer avec le trousseau de clés sur le Mac et ensuite ne pas fonctionner de manière fiable.

3
Gary Melhaff

La solution fournie par Emanuele a fonctionné pour moi. Je pouvais voir le rapport lorsque je l'avais accédé directement depuis le serveur, mais lorsque j'utilisais un contrôle ReportViewer sur ma page aspx, je ne pouvais pas voir le rapport. Lors de l'inspection du code HTML affiché, j'ai trouvé une division portant l'id "ReportViewerGeneral_ctl09" (ReportViewerGeneral est l'ID serveur du contrôle du visualiseur de rapports) dont la propriété de débordement était définie sur auto.

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

J'ai utilisé la procédure expliquée par Emanuele pour changer ceci en visible comme suit:

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

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

J'ai utilisé ça. Ajoutez une référence de script à jQuery sur la page Report.aspx. Utilisez ce qui suit pour lier JQuery aux événements Microsoft. Utilisé un peu de la suggestion d'Eric pour régler le débordement.

$(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');
                    });
                });
            }
        });
    }
});
2
MeyC