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

84

J'ai migré nos services de reporting de la version 2008 vers une autre version serveur 2008 R2. Dans la version 2008, les rapports fonctionnent correctement sur Safari. La nouvelle version 2008 R2 les rapports n'apparaissent pas du tout. Tout ce que je vois, c'est la section des paramètres, puis le rapport est vide. Idem dans Chrome. Selon Microsoft Safari, il est pris en charge si de manière limitée. Les rapports ne sont pas complexes. En fait, j'ai créé un rapport qui ne contenait qu'une ligne pour voir s'il apparaîtrait dans Safari, mais non, ce rapport est également complètement vide. Quelqu'un a-t-il rendu les rapports SSRS visibles sur Safari? Dois-je jouer avec une sorte de paramètre de configuration?

Anita C
la source
dupliquer: stackoverflow.com/questions/5428017/…
Tim Partridge

Réponses:

109

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

Remarque : comme azzlak l'a noté, le nom du div n'est pas toujours ctl31_ctl10. Pour SQL 2012 essayez ctl32_ctl09et pour 2008 R2 essayez ctl31_ctl09. Si cette solution ne fonctionne pas, regardez le code HTML de votre navigateur pour voir si le script a correctement fonctionné en changeant la overflow:autopropriété en overflow:visible.


Solution pour le contrôle ReportViewer

Insérez dans la .aspxpage (ou dans un .cssfichier lié , si disponible) cette ligne de style

#reportViewer_ctl09 {
  overflow:visible !important;
 }

Raison

Chrome et Safari sont rendus overflow:autode manière différente par rapport à IE.

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

La page HTML produite par les rapports SSRS 2008 R2 contient un divqui a du overflow:autostyle et 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 passant manuellement overflow:autoà overflow:visibledans la page Web produite à l'aide des outils de développement de Chrome ( F12).


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

Mais il y a toujours un problème: à chaque fois que l'utilisateur change les paramètres (mes rapports utilisent des paramètres!) AJAX actualise le div, le débordement: auto tag est réécrit, 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 toute la page. Par conséquent, les OnLoadévénements que vous avez appliqués sur la <body>balise ne sont déclenchés qu'une seule fois: lors du 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

Ainsi a écrit le script amélioré qui est montré dans la solution.

Emanuele Greco
la source
1
J'ai modifié la fonction page_load en pageLoad afin de déclencher le script. Sinon, cela semble résoudre les problèmes de rendu dans Chrome 13. Malheureusement, l'authentification de base dans SSRS ne semble pas fonctionner avec Safari 5.1, donc je ne peux pas vérifier là-bas.
kermatt le
La raison est FAUX. La vraie raison est que le HTML SSRS est du HTML QuirksMode et dépend des bogues d'IE 5.5. Les navigateurs non-IE n'ont pas le mode quirksmode IE et donc rendent le HTML correctement. Pour les navigateurs qui n'émulent pas les bogues d'IE 5.5 dans leur QuirksMode, il manque la définition de la largeur de la table ... Cela s'applique également à IE 10, car il a un nouveau mode de quirksmode par défaut.
Stefan Steiger
8
Fonctionne parfaitement. Mais pour SQL Server 2012, l'ID div incriminé est ctl32_ctl09.
azzlack
3
plutôt que de rechercher l'id ctl32_ctl09 ou ce qui est généré, essayez: document.querySelector ("[id ^ = VisibleReportContent]"). parentNode;
Para
1
@JustinMangum - l'utilisation de querySelector échouera dans IE dans la vue de compatibilité, qui est presque certainement activée pour les sites intranet SSRS. Le symptôme est que la boîte de dialogue Chargement ne se fermera jamais, les utilisateurs ne pourront donc pas afficher de rapport.
Mike
27

Incluez simplement SizeToReportContent="true"comme indiqué ci-dessous

<rsweb:ReportViewer ID="ReportViewer1" runat="server" SizeToReportContent="True"...
Deepak
la source
4
Je ne sais pas pourquoi ce n'est pas la solution acceptée car a) cela fonctionne bien, et b) cela semble être la solution intégrée. Pas un hack pour faire fonctionner le visualiseur de rapports correctement. Non pas qu'il n'y ait rien de mal à pirater ReportViewer pour le faire fonctionner. On dirait que tout le visionneur de rapports est sur un gros hack.
Raif
3
Cette solution ne s'applique-t-elle pas uniquement à l'incorporation du contrôle ReportViewer dans une application? Si cela s'applique au Gestionnaire de rapports et aux rapports exécutés à partir de l'URL ReportServer, veuillez indiquer où vous devez inclure cette modification.
Utilisateur enregistré le
2
Faites-vous référence à la ligne suivante dans \ SQL \ MSRS11.MSSQLSERVER \ Reporting Services \ ReportServer \ Pages \ ReportViewer.aspx: <RS: ReportViewerHost ID = "ReportViewerControl" runat = "server" />
Utilisateur enregistré le
1
Cela peut fonctionner correctement, mais si vous avez beaucoup d'images (indicateurs / Sparklines) sur un rapport, le temps de rendu expirera atrocement.
Trubs
1
Cela ne fonctionne pas lors de la modification de ReportViewer.aspx dans SSRS 2012.
Keith
23

J'utilise la version 21 de Chrome avec SQL 2008 R2 SP1 et aucun des correctifs ci-dessus n'a fonctionné pour moi. Vous trouverez ci-dessous le code qui a fonctionné, comme pour les autres réponses, j'ai ajouté ce bit de code à ajouter à "C: \ Program Files \ 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";         
    } 
}
Michael Brown
la source
1
Cette solution fonctionne très bien dans notre environnement. Merci Mike
Vince Perta
14

Il s'agit d'un problème connu . Le problème est qu'une balise div a le style "overflow: auto" qui n'est apparemment 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 profiter de la suggestion d'Emanuele d'utiliser l'élément RS: ReportViewerHost, mais je l'ai résolu en utilisant JavaScript.

Problème

entrez la description de l'image ici

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

Remarque

Il semble y avoir une solution pour SSRS 2005 que je n'ai pas essayée mais je ne pense pas qu'elle soit applicable à SSRS 2008 parce que je ne trouve pas la classe "DocMapAndReportFrame".

Tim Partridge
la source
2
Il y a une chose que je ne comprends pas. si vous appliquez la fonction de code FixSari dans \ ReportingServices.js et que vous exécutez ensuite le code pour afficher le rapport dans SSRS, où appliquez-vous la fonction pour exécuter le code de méthode source pour FixSafari? Si je comprends bien, le code d'origine de ReportingServices.js est généré et à la fin vous exécutez le code FixSafari?
What'sUP
12

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

Il n'est pas limité à un certain identifiant et vous n'avez pas besoin d'inclure une autre bibliothèque telle que jQuery.

Jim Bauwens
la source
Mais les éléments que tout le monde cible, comme ctl31_ctl10 et ses variantes, ne contiennent pas nécessairement _fixedTable. Est-ce que je manque quelque chose?
Baodad
@Baodad - La solution ci-dessus utilise le sélecteur enfant pour trouver le div correct. Il commence sur la base d'un élément plus haut dans la chaîne avec un attribut id plus statique, puis guide les enfants dans l'arborescence jusqu'au div souhaité. Je préférerais qu'il utilise un nom plus descriptif et moins surchargé pour la variable, mais c'est une excellente solution par ailleurs. Nom suggéré: reportPayloadElement.
Brian Swift
11

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

Il devrait fonctionner indépendamment de ce que le serveur de rapports produira pour une 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 certaines façons de charger dynamiquement des 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 Modifiez 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();
Eric Weiss
la source
Une question cependant, s'il y a plus d'un tableau de rapport sur la page, cela ne causera-t-il pas plusieurs charges de contrôles? Si tel est le cas, la toute première ligne pourrait être remplacée par: var jQueryScriptOutputted = ((typeof (jQueryScriptOutputted) == 'undefined')? False: true);
rmcsharry
4

Vous pouvez résoudre ce problème facilement avec jQuery - et un petit hack laid :-)

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

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

Dans l'événement de document prêt, je lance ensuite une minuterie et recherche l'élément qui nécessite le correctif de débordement (comme dans les articles 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.

henebb
la source
3

Pour votre information, rien de ce qui précède n'a fonctionné pour moi en 2012 SP1 ... une solution simple consistait à intégrer les informations d'identification dans la source de données partagée, puis à dire à Safari de faire confiance au site du serveur SSRS. Ensuite, cela a très bien fonctionné! Il a fallu des jours pour rechercher des solutions supposées comme ci-dessus pour découvrir que la sécurité intégrée ne fonctionnera pas de manière fiable sur Safari - vous devez jouer avec le trousseau sur le mac et ne fonctionnerait toujours pas de manière fiable.

Gary Melhaff
la source
2

La solution fournie par Emanuele a fonctionné pour moi. Je pouvais voir le rapport lorsque j'y ai accédé directement à partir du serveur, mais lorsque j'ai utilisé un contrôle ReportViewer sur ma page aspx, je n'ai pas pu voir le rapport. En inspectant le HTML rendu, j'ai trouvé un div par l'ID "ReportViewerGeneral_ctl09" ( ReportViewerGeneral est l'ID de serveur du contrôle de la visionneuse de rapports) qui avait sa propriété de débordement 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 cela en visible comme suit:

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

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

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