ssrs services reportserver por parametros enviar chrome reporting-services ssrs-2008 reportviewer ssrs-2012 reporting-services-2012

reporting-services - services - ssrs url parameters



SSRS 2008 R2-SSRS 2012-ReportViewer: los informes están en blanco en Safari y Chrome (10)

Migré nuestros servicios de informes desde la versión 2008 a otra versión del servidor 2008 R2. En la versión 2008, los informes funcionan bien en Safari. La nueva versión 2008 R2 los informes no aparecen en absoluto. Todo lo que veo es la sección de parámetros y luego el informe está en blanco. Lo mismo en Chrome. De acuerdo con Microsoft Safari IS compatible si de manera limitada. Los informes no son complejos. De hecho, creé un informe que solo tenía una línea para ver si aparecía en Safari pero no, ese informe también está completamente vacío. ¿Alguien hizo que los informes de SSRS fueran visibles en Safari? ¿Tengo que meterme con algún tipo de configuración?


Solución definitiva (¡también funciona en SSRS 2012!)

Añada la siguiente secuencia de comandos al siguiente archivo (en el servidor 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 : Como notó azzlak, el nombre del div no siempre es ctl31_ctl10 . Para SQL 2012 intente ctl32_ctl09 y para 2008 R2 intente ctl31_ctl09 . Si esta solución no funciona, consulte el código HTML de su navegador para ver si el script ha funcionado correctamente cambiando el overflow:auto propiedad overflow:visible .

Solución para el control ReportViewer

Insertar en la página .aspx (o en un archivo .css vinculado, si está disponible) esta línea de estilo

#reportViewer_ctl09 { overflow:visible !important; }

Razón

Chrome y Safari representan un overflow:auto de diferente manera con respecto a IE.

El HTML de SSRS es HTML de QuirksMode y depende de errores IE 5.5. Los navegadores que no son IE no tienen el IE quirksmode y, por lo tanto, procesan el HTML correctamente

La página HTML producida por los informes de SSRS 2008 R2 contiene un div que tiene overflow:auto estilo overflow:auto , y convierte el informe en un informe invisible.

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

Puedo ver informes en Chrome al cambiar el overflow:auto manualmente overflow:auto al overflow:visible en la página web producida usando las herramientas Dev de Chrome ( F12 ).

Me encanta la solución de Tim , es fácil y funciona.

Pero todavía hay un problema: cada vez que el usuario cambia los parámetros (¡mis informes usan parámetros!) AJAX actualiza el div, el desbordamiento: la etiqueta automática se reescribe y ningún script lo cambia.

Este detalle técnico explica cuál es el problema:

Esto sucede porque en una página creada con paneles AJAX, solo los paneles AJAX cambian su estado, sin actualizar toda la página. En consecuencia, los eventos OnLoad que aplicó en la etiqueta <body> solo se activan una vez: la primera vez que se carga la página. Después de eso, cambiar cualquiera de los paneles AJAX ya no activará estos eventos.

El usuario einarq sugirió esta solución :

Otra opción es cambiar el nombre de tu función a pageLoad. Cualquier función con este nombre será llamada automáticamente por asp.net ajax si existe en la página, también después de cada actualización parcial. Si lo hace, también puede eliminar el atributo de carga de la etiqueta del cuerpo

Entonces escribí el script mejorado que se muestra en la solución.


Aquí está la solución que utilicé para Report Server 2008 R2

Debería funcionar independientemente de lo que generará el Servidor de informes para su uso en su atributo "id" de la tabla. No creo que siempre puedas asumir que será "ctl31_fixedTable"

Utilicé una combinación de la sugerencia anterior y algunas formas de cargar dinámicamente las bibliotecas de jquery en una página del archivo javascript que se encuentra here

En el servidor, vaya al directorio: C: / Archivos de programa / Microsoft SQL Server / MSRS10_50.MSSQLSERVER / Reporting Services / ReportManager / js

Copie la biblioteca jquery jquery-1.6.2.min.js en el directorio

Cree una copia de seguridad del archivo ReportingServices.js Edite el archivo. Y añada esto al final:

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


Este es un problema conocido . El problema es que una etiqueta div tiene el estilo "overflow: auto" que aparentemente no está bien implementado con WebKit, que es utilizado por Safari y Chrome (ver la respuesta de Emanuele Greco). No sabía cómo aprovechar la sugerencia de Emanuele para usar el elemento RS: ReportViewerHost, pero lo resolví usando JavaScript.

Problema

Solución

Dado que "overflow: auto" se especifica en el atributo de estilo del elemento div con id "ctl31_ctl10", no podemos anularlo en un archivo de hoja de estilo, así que recurrí a JavaScript. Añé el siguiente código a "C: / Archivos de programa / 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://.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

Parece que hay una solución para SSRS 2005 que no he probado, pero no creo que sea aplicable a SSRS 2008 porque no puedo encontrar la clase "DocMapAndReportFrame".


Estoy usando Chrome versión 21 con SQL 2008 R2 SP1 y ninguna de las correcciones anteriores funcionó para mí. A continuación se muestra el código que funcionó, al igual que con las otras respuestas agregué este bit de código para agregar a "C: / Archivos de programa / Microsoft SQL Server / MSRS10_50.MSSQLSERVER / Reporting Services / ReportManager / js / ReportingServices.js" (en el servidor SSRS):

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


FYI - nada de lo anterior funcionó para mí en 2012 SP1 ... la solución simple era incorporar credenciales en la fuente de datos compartidos y luego decirle a Safari que confíe en el sitio del servidor SSRS. ¡Entonces funcionó genial! Tomó días persiguiendo las supuestas soluciones como las anteriores solo para descubrir que la seguridad integrada no funcionará de manera confiable en Safari; tiene que meterse con el llavero en el mac y luego aún no funcionaría de manera confiable.


La solución provista por Emanuele funcionó para mí. Pude ver el informe cuando accedí directamente desde el servidor, pero cuando utilicé un control ReportViewer en mi página aspx, no pude ver el informe. Al inspeccionar el HTML prestado, encontré un div por el id "ReportViewerGeneral_ctl09" ( ReportViewerGeneral es la identificación del servidor del control del visor de informes) que tenía su propiedad de desbordamiento establecida en automático.

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

Usé el procedimiento explicado por Emanuele para cambiar esto a visible de la siguiente manera:

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


Mi solución basada en las ideas anteriores.

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

No se limita a una determinada identificación, además, no es necesario que incluya ninguna otra biblioteca, como jQuery.


Puedes arreglar esto fácilmente con jQuery, y un poco de feo truco :-)

Tengo una página asp.net con un control de usuario de ReportViewer.

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

En el evento listo para documentos, inicio un temporizador y busco el elemento que necesita la corrección de desbordamiento (como publicaciones anteriores):

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

Mejor que asumir que tiene una cierta identificación. Puede ajustar el temporizador a lo que quiera. Lo configuré a 1000 ms aquí.


Simplemente incluya SizeToReportContent="true" como se muestra a continuación

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


Yo he usado esto Agregue una referencia de script a jquery en la página Report.aspx. Use lo siguiente para vincular JQuery a los eventos de microsoft. Usé un poco de la sugerencia de Eric para establecer el desbordamiento.

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