85 votes

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

J'ai migré nos services de reporting de la version 2008 vers un autre serveur version 2008 R2. Dans la version 2008, les rapports fonctionnent bien sur Safari. Dans la nouvelle version 2008 R2, les rapports ne s'affichent pas du tout. Tout ce que je vois est la section des paramètres et ensuite le rapport est vide. Même chose dans Chrome. Selon Microsoft, Safari EST pris en charge, mais de manière limitée. Les rapports ne sont pas complexes. En fait, j'ai créé un rapport qui ne comportait qu'une ligne pour voir s'il s'afficherait dans Safari, mais non, ce rapport est lui aussi complètement vide. Quelqu'un a-t-il fait en sorte que les rapports SSRS puissent être affichés dans Safari ? Dois-je modifier une sorte de paramètre de configuration ?

110voto

Emanuele Greco Points 5089

Solution ultime (fonctionne aussi 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 fait remarquer azzlak, le nom de la 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, regardez le HTML à partir de votre navigateur pour voir si le script a fonctionné correctement en changeant l'adresse de l'utilisateur. overflow:auto à la propriété overflow:visible .


Solution pour le contrôle ReportViewer

Insérer dans .aspx (ou dans un lien .css si disponible) cette ligne de style

#reportViewer_ctl09 {
  overflow:visible !important;
 }

Raison

Rendu de Chrome et Safari overflow:auto de manière différente par rapport à l'IE.

Le HTML SSRS est un HTML QuirksMode et dépend des bogues d'IE 5.5. Les navigateurs non IE n'ont pas le quirksmode IE et rendent donc le HTML correctement.

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

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

Je peux voir les rapports sur Chrome en changeant manuellement overflow:auto à overflow:visible dans la page web produite en utilisant les outils de développement de Chrome ( F12 ).


J'aime La solution de Tim c'est facile et ça marche.

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

Cette technote détaille explique quel est le problème :

Cela se produit parce que dans une page construite avec des panneaux AJAX, seuls les panneaux AJAX changent leur état, sans rafraîchir la page entière. Par conséquent, les OnLoad les événements que vous avez appliqués sur le <body> ne sont activés qu'une seule fois : au premier chargement de votre page. Après cela, la modification de l'un des panneaux AJAX ne déclenchera plus ces événements.

L'utilisateur einarq a 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 faites cela, vous pouvez également supprimer l'attribut onload de la balise body.

J'ai donc écrit le script amélioré qui est montré dans la solution.

27voto

Deepak Points 141

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

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

23voto

Michael Brown Points 1639

J'utilise la version 21 de Chrome avec SQL 2008 R2 SP1 et aucune des corrections ci-dessus n'a fonctionné pour moi. Voici le code qui a fonctionné, comme pour les autres réponses, j'ai ajouté ce bout de code à Append to (Ajouter à). " C:\Program Fichiers \Microsoft SQL Server \MSRS10_50.MSSQLSERVER\Reporting Services \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";         
    } 
}

14voto

Tim Partridge Points 993

Il s'agit d'un problème connu . Le problème est qu'une balise div a le style "overflow : auto" qui apparemment n'est pas bien implémenté avec WebKit qui est 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 j'ai résolu le problème en utilisant JavaScript.

Problema

enter image description here

Solution

Puisque "overflow : auto" est spécifié dans l'attribut de 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 Fichiers \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 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);
}

Note

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

11voto

Eric Weiss Points 73

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

Cela devrait fonctionner indépendamment de ce que le serveur de rapports produira pour l'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 des moyens de charger dynamiquement les bibliothèques jquery dans une page à partir d'un fichier javascript trouvé. aquí

Sur le serveur, allez dans le répertoire : C:\Program Fichiers \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. Modifiez le fichier. Et ajoutez ceci au bas du fichier :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X