web-dev-qa-db-fra.com

SSRS 2008 R2 - SSRS 2012 - ReportViewer: les rapports dans Safari / Chrome fonctionnent correctement dans Firefox / Internet Explorer 8 ... pourquoi?

J'ai quelques rapports simples dans SSRS 2008 R2, mais ils ne s'affichent pas du tout dans Safari ou Chrome. Selon la documentation en ligne de Microsoft, ces navigateurs sont pris en charge de manière limitée. Cependant, je ne vois plus rien après la fin du chargement des données. La barre de paramètres et la section de navigation en haut de la page sont toutes présentes. De plus, je peux enregistrer/exporter dans n’importe quel format sur Safari et Chrome. Cela n'affiche tout simplement pas la section de rapport elle-même, qui est simplement vide.

Suis-je censé utiliser des certificats et des connexions sécurisées (actuellement non configuré avec HTTPS, uniquement HTTP)? Y at-il des configurations côté serveur qui doivent être peaufinées? Quelqu'un at-il déjà réussi à afficher [~ # ~] des [~ # ~] rapports sur Safari/Chrome utilisant les versions précédentes de SSRS (2005)?

J'utilise Safari 5.0.4 et Chrome 10.0.648.151 _ . Je sais que la similitude entre ces deux navigateurs est qu'ils sont tous deux basés sur WebKit .

Le rapport s'affiche avec succès sur Internet Explorer 8 (bien sûr) et Firefox 4.0.

J'apprécierais vraiment si quelqu'un pouvait nous éclairer à ce sujet.

82
Greg H

Solution ultime (fonctionne également dans SSRS 2012!)

Ajoutez le script suivant à " C:\Program Files\Microsoft SQL Server\MSRS10_50.MSSQLSERVER\Reporting Services\Gestionnaire de rapports\js\ReportingServices.js " ( sur le serveur SSRS):

function pageLoad() {
    var element = document.getElementById("ctl31_ctl10");
    if (element)
    {
        element.style.overflow = "visible";
    }
}

En fait, je ne sais pas si le nom de la div est toujours ctl31_ctl10: dans mon cas, c’est (plutôt que sur SQL Server 2012, azzlak a trouvé ctl32_ctl09).

Si cette solution ne fonctionne pas, examinez le code HTML de votre navigateur pour voir si le script a fonctionné correctement en modifiant la propriété overflow: auto en overflow: visible =.


Solution pour le contrôle de ReportViewer

Insérer cette ligne de style dans le .aspx page (ou dans une .css fichier, si disponible):

#reportViewer_ctl09 {
  overflow:visible !important;
}

Raison

Chrome et Safari rendent débordement: auto de manière différente par rapport à Internet Explorer.

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;">
...</div>

Modification manuelle (à l'aide de la fenêtre de débogage de Chrome) HTML final débordement: auto dans débordement: visible Je peux voir les rapports sur Chrome.

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 actualise la div, la balise débordement: auto est réécrite et aucun script ne le change. Ce détail technique explique quel est le problème.

Cela est dû au fait que dans une page construite avec des panneaux AJAX, seuls les panneaux AJAX changent d’état sans actualiser la page entière. Par conséquent, les événements OnLoad que vous avez appliqués sur la balise ne sont déclenchés qu’une seule fois: lors du premier chargement de votre page, après quoi, changer l’un des panneaux AJAX ne déclenchera plus ces événements.

Mr.einarq m'a suggéré la solution ici .

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.

J'ai donc écrit le script amélioré présenté dans la solution.

94
Emanuele Greco

Solution basée sur CSS

J'ai pu ajouter ce qui suit à la feuille de style de Reporting Services, et cela a été corrigé dans Chrome.

Disclaimer: la compatibilité entre navigateurs n'est pas testée à fond.

/************** CHROME BUG FIX ****************/
 Div # ctl31_ctl09, 
 div # ctl31_ctl10 
 {
 débordement: visible! important; 
} 
/************** *********************************/

Ajoutez cela au début du ReportingServices.css fichier.

Pour moi, ce fichier se trouve à:

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

43
Ryan

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 qui est utilisé par Safari et Chrome (voir Emanuele Greco - réponse =). Je ne savais pas comment tirer parti de la proposition d’Emanuele d’utiliser l’élément RS: ReportViewerHost, mais j’ai résolu le problème 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 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);
}

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

18
Tim Partridge

Solution système basée sur CSS

Cela ne nécessite ni JavaScript, ni images Ajax, ni aucun autre wrapper. Il a été testé sur Internet Explorer, Firefox, Safari et Chrome.

Cela peut être corrigé au niveau de la feuille de style dans Report Server.

Tout d'abord, accédez au répertoire dans lequel les services de génération de rapports sont installés. Dans mon cas ( SQL Server 2012 SP1), il correspond à:

C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportServer

Dans ce répertoire, vous trouverez un fichier nommé reportserver.config.

Voir Personnaliser les feuilles de style pour l'afficheur HTML et le gestionnaire de rapports.

Dans ce fichier, insérez une seule ligne XML comme celle-ci (tirée du document ci-dessus):

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

Sauf que.

Ce qu'ils ne pas vous disent dans le lien ci-dessus, c'est que cette entrée remplace complètement la feuille de style par défaut. Mes premières tentatives pour obtenir le rendu des rapports en ajoutant une feuille de style div, tout le reste était cassé. Une fois, j’ai compris que cette modification dans le fichier reporserver.config n’augmentait pas, mais remplaçait la feuille de style par défaut, j’ai copié la feuille de style par défaut et tout a commencé à fonctionner.

Ensuite, descendez dans le répertoire Styles (C:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportServer\Styles).

Faites une copie du fichier nommé SP_Full.css et nommez la copie SafariChromeFix.css. À ce stade, SafariChromeFix.css doit être identique à SP_Full.css.

Editez SafariChromeFix.css et ajoutez les lignes suivantes en haut:

div {
    overflow: visible !important;
}

Sauvegarde le.

Une fois que cela est enregistré, tous les rapports existants sur cette instance de Reporting Services seront rendus sur tous les navigateurs, y compris Chrome et Safari.

Remarque:

Il est non seulement possible, mais également très probable que reportserver.config soit écrasé par des mises à jour des services de génération de rapports. Vous devrez donc éventuellement y ajouter la balise <HTMLViewerStyleSheet>SafariChrome</HTMLViewerStyleSheet>.

Cela nous donne également un endroit pour pénétrer dans la feuille de style par défaut et effectuer de nombreuses autres modifications personnalisées à partir de quelque chose qui fonctionne déjà. Et comme ce n'est pas la feuille de style par défaut, votre nouveau fichier CSS personnalisé ne sera pas écrasé lors des mises à niveau et des correctifs.

7
Gawain

Dans mon cas, le DIV incriminé est "ctl31_ctl09" donc, si la solution ci-dessus ne fonctionne pas, essayez de remplacer var element = document.getElementById("ctl31_ctl10"); par var element = document.getElementById("ctl31_ctl09");

4
Jabran Ali

Ma solution a été d’ajouter le <script> Suivant à:

Reporting Services\ReportManager\Pages \Report.aspx

Le script cible le contenu du rapport visible parent1 et définit style.overflow:visible à chaque chargement du rapport2 -y compris la pagination dans un rapport multipage.

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 Cela signifie que nous n'avons pas à cibler les identifiants générés qui ont tendance à changer, c'est-à-dire: ctl31_ctl09, ctl31_ctl10, ctl32_ctl09, Etc.
2 Voir Sys.Application.add_load()

4
canon

Pour moi, le nom était " ctl32_ctl09 " (SSRS de SQL Server 2012 SP1, MSRS11).

2
Alexus1024

Je devais entrer dans Chrome avec F12 et remarqué que j'avais ctl32 _ ctl09, pas ctl31_ctl09 dans mon div.

Ceci est pour Windows Server 2008 R2 64 bits avec SQL Server 2012 . Ajoutez le script, puis redémarrez SSRS et effacez le cache du navigateur.

// Correction pour permettre à Chrome d'afficher les rapports SSRS

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

La version SQL Server 2014 de Reporting Services ajoute la prise en charge du navigateur Google Chrome mais il n’existe pas encore de prise en charge pour iOS. Voir détails ici .

2
Frank Goortani

Malheureusement, la réponse principale coupe les colonnes flottantes (position absolue) dans les rapports Internet Explorer. Par conséquent, je l'ai légèrement modifié, ce que je n'aime pas, car il recherche spécifiquement WebKit, mais cela fonctionne:

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

Je n'ai jamais eu de chance avec l'affichage de rapports dans Chrome. La plupart de la documentation de Microsoft ne l'énumérant même pas, j'assume donc Chrome doit avoir du mal à interpréter quelque chose dans l'ASP.

Voir Prise en charge du navigateur pour Reporting Services et Power View.

J'utilise Chrome 11 et ai le même comportement que vous.

1
Ryan

Le problème existe toujours dans Chrome 22.0.1229.79.

YMMV , mais j'ai constaté que la suppression de la hauteur de la balise ReportViewer résout ce problème.

J'avais ce problème avec les rapports SSAS, mais pas avec ceux du SSRS. Je ne pouvais pas comprendre pourquoi jusqu'à ce que je vérifie les différences entre les pages (un consultant avait établi les rapports SSAS). Il fixait ReportViewer Height = 60% et les rapports SSRS ne spécifiaient pas la hauteur.

Une fois que j'ai supprimé Height, mes rapports sont affichés.

1
fujiiface

J'ai essayé les approches et cela a fonctionné pour moi, mais nos administrateurs système étaient sceptiques quant à ces changements.

Au lieu de régler la hauteur à 100% sur le ReportViewer, j'ai utilisé une hauteur fixe et cela a réussi à fonctionner dans mon application pour Internet Explorer et Chrome.

1
AsitK

Un problème avec le overflow:visible _ correctif: les en-têtes flottants sont dissociés de tous les navigateurs. Le script suivant laissera Internet Explorer seul et n'appliquera le correctif qu'aux navigateurs autres qu'Internet Explorer. Avec cela, toutes les fonctionnalités sont conservées pour les utilisateurs d'Internet Explorer et les autres navigateurs peuvent toujours afficher les rapports.

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

J'ai eu le même problème avec l'affichage des rapports sur Chrome. Je l'ai corrigé en ajoutant l'extension "SSRS Report Fix" à Google Chrome. https://chrome.google.com/webstore/detail/ssrs-report-fix/fjbdfjiheheafbioiejbdpalmojkeobk

1
user3328049

Pour SSRS 2012 sur Windows Server 2008 R2 x64, un script de travail est le suivant:

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

Toutes les versions suggérées ci-dessus ne fonctionnaient pas du tout.

1
user2160060

Pour éviter d'avoir à coder en dur l'ID d'élément, j'ai modifié le fichier ReportingServices.js sur le serveur RS @ [Lecteur]:\Program Files\Microsoft SQL Server\[Instance Reporting Services]\Reporting Services\ReportManager\js\ReportingServices.js pour inclure du code permettant d'extraire jQuery, de le charger dans la page, puis de rechercher tous les éléments pour lesquels le dépassement de capacité est défini sur auto.

Insérez le code suivant en haut du fichier ReportingServices.js

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

Ensuite, la ligne suivante est celle qui se trouvait à l’origine dans le fichier JS.

Après cela, ajoutez le code suivant

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

Je viens juste de terminer le test avec Chrome 27 et IE 10 sur une instance RM2012 et cela a très bien fonctionné.).

1
Mike Pugh