SSRS 2008 R2 – SSRS 2012 – ReportViewer: i report sono vuoti in Safari e Chrome

Ho migrato i nostri servizi di reporting dalla versione 2008 a un altro server versione 2008 R2. Nella versione 2008 i report funzionano bene su Safari. La nuova versione 2008 R2 i report non si presentano affatto. Tutto quello che vedo è la sezione dei parametri e quindi il report è vuoto. Lo stesso in Chrome. Secondo Microsoft Safari è supportato se in modo limitato. I rapporti non sono complessi. In effetti ho creato un rapporto che aveva solo una riga su di esso per vedere se sarebbe comparso in Safari, ma no, anche questo rapporto è completamente vuoto. Qualcuno ha reso i report SSRS visualizzabili su Safari? Devo interferire con qualche tipo di impostazione di configurazione?

Soluzione definitiva (funziona anche in SSRS 2012!)

Aggiungere il seguente script al seguente file (sul server 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"; } } 

Nota : come notato da azzlak, il nome del div non è sempre ctl31_ctl10 . Per SQL 2012 prova ctl32_ctl09 e per 2008 R2 prova ctl31_ctl09 . Se questa soluzione non funziona, guarda l’HTML dal tuo browser per vedere se lo script ha funzionato correttamente cambiando l’ overflow:auto proprietà overflow:auto per l’ overflow:visible .


Soluzione per il controllo di ReportViewer

Inserisci nella pagina .aspx (o in un file .css collegato, se disponibile) questa linea di stile

 #reportViewer_ctl09 { overflow:visible !important; } 

Ragionare

Chrome e Safari rendono overflow:auto in modo diverso rispetto a IE.

SSRS HTML è l’HTML di QuirksMode e dipende dagli errori di IE 5.5. I browser non IE non hanno il quirksmode di IE e quindi rendono correttamente l’HTML

La pagina HTML prodotta dai report di SSRS 2008 R2 contiene un div che ha overflow:auto stile overflow:auto e trasforma il report in un report invisibile.

 

Riesco a vedere i rapporti su Chrome modificando manualmente l’ overflow:auto da overflow:visible nella pagina Web prodotta utilizzando gli strumenti di sviluppo di Chrome ( F12 ).


Amo la soluzione di Tim , è facile e funzionante.

Ma c’è ancora un problema: ogni volta che l’utente cambia i parametri (i miei report usano i parametri!) AJAX aggiorna il div, l’ overflow: il tag automatico viene riscritto e nessuno script lo cambia.

Questo dettaglio tecnico spiega qual è il problema:

Questo accade perché in una pagina costruita con pannelli AJAX, solo i pannelli AJAX cambiano il loro stato, senza aggiornare l’intera pagina. Di conseguenza, gli eventi OnLoad applicati sul tag vengono triggersti ​​una volta sola: la prima volta che viene caricata la pagina. Dopodiché, la modifica di qualsiasi pannello AJAX non attiverà più questi eventi.

L’utente einarq ha suggerito questa soluzione :

Un’altra opzione è rinominare la funzione su pageLoad. Qualsiasi funzione con questo nome sarà chiamata automaticamente da asp.net ajax se esiste nella pagina, anche dopo ogni aggiornamento parziale. Se lo fai, puoi anche rimuovere l’attributo onload dal tag body

Così ho scritto lo script migliorato che viene mostrato nella soluzione.

Basta includere SizeToReportContent="true" come mostrato di seguito

  

Sto utilizzando la versione 21 di Chrome con SQL 2008 R2 SP1 e nessuna delle correzioni sopra ha funzionato per me. Di seguito è riportato il codice che ha funzionato, come con le altre risposte Ho aggiunto questo bit di codice per l’aggiunta a “C: \ Programmi \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js \ ReportingServices.js” (in il server SSRS):

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

Questo è un problema noto . Il problema è che un tag div ha lo stile “overflow: auto” che apparentemente non è ben implementato con WebKit utilizzato da Safari e Chrome (vedere la risposta di Emanuele Greco). Non sapevo come sfruttare il suggerimento di Emanuele per utilizzare l’elemento RS: ReportViewerHost, ma l’ho risolto utilizzando JavaScript.

Problema

inserisci la descrizione dell'immagine qui

Soluzione

Poiché “overflow: auto” è specificato nell’attributo style dell’elemento div con id “ctl31_ctl10”, non è ansible sovrascriverlo in un foglio di stile, quindi ho fatto ricorso a JavaScript. Ho aggiunto il seguente codice a “C: \ Programmi \ 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); } 

Nota

Sembra che ci sia una soluzione per SSRS 2005 che non ho provato, ma non penso che sia applicabile a SSRS 2008 perché non riesco a trovare la class “DocMapAndReportFrame”.

Ecco la soluzione che ho usato per Report Server 2008 R2

Dovrebbe funzionare indipendentemente da ciò che verrà generato dal server di report per l’attributo “id” della tabella. Non penso che tu possa sempre presumere che sarà “ctl31_fixedTable”

Ho usato un mix del suggerimento sopra e alcuni modi per caricare dynamicmente le librerie jquery in una pagina dal file javascript trovato qui

Sul server accedere alla directory: C: \ Programmi \ Microsoft SQL Server \ MSRS10_50.MSSQLSERVER \ Reporting Services \ ReportManager \ js

Copia la libreria jquery jquery-1.6.2.min.js nella directory

Creare una copia di backup del file ReportingServices.js Modificare il file. E aggiungilo a fondo:

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

La mia soluzione basata sulle idee di cui sopra.

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

Non è limitato a un determinato ID e non è necessario includere altre librerie come jQuery.

Puoi sistemarlo facilmente con jQuery – e un po ‘brutto hack 🙂

Ho una pagina asp.net con un controllo utente di ReportViewer.

   

Nell'evento pronto per il documento, quindi, avvio un timer e cerco l'elemento che ha bisogno della correzione di overflow (come i post precedenti):

   

Meglio di presumere che abbia un determinato ID. Puoi regolare il timer in base alle tue esigenze. L'ho impostato su 1000 ms qui.

Cordiali saluti – nessuna delle precedenti ha funzionato per me nel 2012 SP1 … la soluzione semplice era incorporare le credenziali nell’origine dati condivisa e quindi dire a Safari di affidarsi al sito del server SSRS. Quindi ha funzionato alla grande! Ci sono voluti giorni a inseguire soluzioni presunte come sopra solo per scoprire che la sicurezza integrata non funzionerebbe in modo affidabile su Safari – è necessario pasticciare con il portachiavi sul Mac e quindi non funzionerebbe in modo affidabile.

La soluzione fornita da Emanuele ha funzionato per me. Ho potuto vedere il rapporto quando ho avuto accesso direttamente dal server, ma quando ho usato un controllo ReportViewer sulla mia pagina ASPX, non sono riuscito a vedere il rapporto. Dopo aver ispezionato l’HTML reso, ho trovato una div dall’identificativo “ReportViewerGeneral_ctl09” ( ReportViewerGeneral è l’id del server del controllo del visualizzatore di report) che aveva la proprietà di overflow impostata su auto.

 
...

Ho usato la procedura spiegata da Emanuele per cambiare questo in visibile come segue:

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

L’ho usato. Aggiungere un riferimento di script a jquery nella pagina Report.aspx. Utilizzare quanto segue per colbind JQuery agli eventi Microsoft. Usato un po ‘del suggerimento di Eric per impostare l’overflow.

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