lunes, 6 de febrero de 2012

CoreHandler .ashx, Controladores Personalizados WebReportViewer

Hoy les comparto una forma de generar Controladores personalizados, este tema esta ligado a Datadynamics debido a que el "WebReportViewer", o el visor de reportes web. ¿por qué?. Este control de GrapeCity us un core handler para el manejo de eventos y según lo entiendo, lo usa también como archivo de recursos para imágenes y cultura (Quizás otras cosas más), entonces debido a múltiples inconvenientes que podrían ocurrirle (como a mí), presento una compilación de información que me ha ayudado a sacar adelante algunos de los posibles problemas que vas a encontrar.

Al adicionar un control WebReportViewer, tendremos que adicionar un controlador, normalmente llamado "CoreHandler.ashx", cuyo contenido es el siguiente:

<% @ WebHandler language="C#" class="DataDynamics.Reports.Web.CoreHandler, DataDynamics.Reports.Web, Version=1.6.2084.14, Culture=neutral, PublicKeyToken=A597G2F42D260XS3" codebehind="CoreHandler.cs" %>

Muchas veces este código es suficiente para que el control pueda ubicar el controlador; los datos que vemos como version, culture, token lo obtenemos del mismo web.config en la sesión de assemblies.

Otra manera que he encontrado es usando este codigo dentro del dentro del web.config en una etiquta httphandler, por ejemplo:

<% add verb="GET" path="Page/CoreHandler.ashx" type="DataDynamics.Reports.Web.CoreHandler, DataDynamics.Reports.Web, Version=1.6.2084.14, Culture=neutral, PublicKeyToken=D557F2F30A260DA2"  %>

además de localización dentro de las etiquetas de configuration, también dentro del web.config
        
 <location path="CoreHandler.ashx">
    <system.web >
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>


Aún así es posible que tengas un problema en el que actualmente estoy trabajando, y se trata que al correr la aplicación y todo parece correr perfectamente, al generar el reporte este carga, pero las imágenes que van dentro del reporte no aparecen.  Es decir que el src de la imagen es incorrecto y nos encontramos algo parecido a esto:




Al inspeccionar las imágenes el src debería tener la siguiente estructura:

src=/misitio/CoreHandler.ashx?rs:Command=GetResourceItem&ResourceName=Plus.PNG       

pero en mi código al inspeccionar lo encuentro así:

src=/CoreHandler.ashx?rs:Command=GetResourceItem&ResourceName=Plus.PNG       

es decir que está buscando el corehandler.ashx en la raiz de mi localhost y porsupuesto que JAMÁS lo va a encontrar. En los foros de datadynamics se encuentra el siguiente foro  creado en el 2004 y aceptando el error como propio de Datadynamics y cuya solución debía salir en el siguiente release; pues para la fecha de hoy (año 2012, cerca del fín del mundo) y teniendo la última versión me sucede lo mismo. Lo cierto es que la versión anterior si muestra las imágenes correctamente, por lo que he venido pensando que hay alguna configuración que he hecho mal, pero sé con certeza que hallaremos una solución, así sea muy recursiva.

Por lo pronto les comparto un tutorial del tema de los manejadores que podría darle una luz para hallar la solución.....  ///parece que ya puedo ofrecerles una ayuda !!!



Aunque siendo sincero no es la mejor de las opciones fue una "práctica" que me ingenié para solucionar este tedioso error, pero igual hasta conseguir la correcta les comparto mi solución:


Se trata de una función javascript con la cual buscamos las imágenes dentro del iframe que carga el reporte; obteniendo el nombre de nuestro sitio "path", buscamos las imágenes que no tenga este path dentro de su src, entonces les creamos una nueva url con nuestro path y se lo adicionamos a su src. La función es la siguiente:



function CorregirImagenes()
         <               
            // obtiene el nombre de nuestro sitio
            var path =  '<%=Context.Request.ApplicationPath %>'; 
            // Obtiene el iframe donde se presenta el reporte
            var ifReport = document.getElementById('CorePanelWebReportViewer1$coreViewer');
           // obtiene el document del iframe
            var doc =  ifReport.contentDocument || ifReport.contentWindow.document;
           // obtiene el body del iframe
            var iFContent = doc.body; 
            // obtiene todas las imágenes dentro del body, es decir las img del reporte
            var imagenes = iFContent.getElementsByTagName('img');
               for( i=0; i < imagenes. length; i++)
                <    
                    var imagen = imagenes[i].src;
                    var urlimg = imagen.split("/");
                    // debido a que la url de la imagen viene con "/" (http://localhost/sitio/corehandl**), hacemos un split y buscamos en la posición 4 el nombre del sitio, es decir [3], esto nos devolvería la palabra "sitio", si esto es DIFERENTE a nuestro path "/sitio" (al cual le hacemos un substring para compararlo si el "/"), entonces le añadimos nuestro path.
                    if(urlimg[3] != path.substring(1,path.length))
                     <   
                        var newurl = imagen.substring(0, imagen.indexOf("/CoreHandler")) + path +              imagen.substring(imagen.indexOf("/CoreHandler"), imagen.length);                       
                       
                        imagenes[i].src = newurl;                  
                    >
               >           
            return false;
        >



Una vez entendida la función, lo que debemos hacer es implementarla a través de un evento después de cargado el reporte, y aunque a mí nunca me funcionó les comparto este blog para que tengan mejor idea de como lograrlo.


Debido no encontrar forma de implementar mi función para corregir el src de estas imágenes, opté por implementar con la ayuda de mi compañero una función en el HOVER del DIV del Reporte, y obtenemos un solución casi transparente para el usuario.


Espero les funcione...

jueves, 2 de febrero de 2012

WebReportViewer Datadynamics wrong load

Actualmente trabajo sobre una aplicación para generar reportes, la cual trabaja con controles de Datadynamics y específicamente con WebReportViewer. Cuando inicié el proyecto me dieron un instalador que terminaba en .45, en el servidor de compilación las librerías eran .61, por lo cual me generaba algunos errores obvios de compilación, que solucioné estandarizando los ensamblados.... pero este no es el error del que hablamos.
Cuando ejecuté la aplicación el visor de reportes me cargaba totalmente vacío y ninguna de las opciones se visualizaba por lo cual el control nunca iba a funcionar pero no generaba ningún error. Algo como esto:




Este evento ocurre debido al CoreHandler, que no es más que un manejador de eventos que usa datadynamics, para sus controles, y donde además lo usa como referencia de archivo de recursos; al revisarlo me dí cuenta que el xml de este archivo estaba apuntando a la versión anterior, entonces usé la información del ensamblado que registra en el web.config y la actualizé. 

Este error más humano que de tecnología, no tiene algún espacio en los foros de GrapeCity, por lo cual me gustaría compartirlo. De nuevo una aplicación corriendo perfectamente, nos hace la vida más feliz.

miércoles, 1 de febrero de 2012

System.Deployment.Application.DeploymentException (Subscription)

Estuve haciendo unas pruebas del instalador más complicado que he tenido que lidiar; generé el proyecto y el instalador, que porsupuesto probé en mi máquina donde funcionó perfecto, luego la prueba reina en un wserver 2008, donde ya había instalado la revisión anterior y donde el instalador para mi componente ClickOnce había servidor.  En la segunda Instalación me apareció el siguiente error:


System.Deployment.Application.DeploymentException (Subscription) // en resumen del log


En una descripción del mismo, nos dice que ya existe una instalación de este componente, ...Pero yo me he asegurado de desinstalarlo o eso creo ???.
Lo que sucede es que existe una cache para aplicaciones ClickOnce, lo cual en mi ignorancia desconocia, y era esta la causante del dichoso error. Solución, Eliminar la caché, este proceso lo realizamos con el siguiente comando:

rundll32 dfshim CleanOnlineAppCache


Me pareció un aporte muy interesante obtenido del siguiente post


martes, 24 de enero de 2012

ORA - 01036 Datadynamics Report Designer

Posiblemente te haz encontrado con el siguiente error, cuando intentas hacer una consulta usando un dataset en Datadynamics Report Designer, el cual esta pegando a un DataSource con Oracle Provider:


El error no es atendido como tal por GrapeCity y esto es debido a que NO HAY ERROR!!, es simplemente que al crear el parámetro nos confunde ese mensaje, entonces, ¿Por qué la consulta es inválida?. En mi caso ocurre por la costumbre de trabajar en MSSQL ya que a los parametros les añadimos un "@", y esto va de perlas en un datasource sqlserver, pero en este caso (ORACLE) se usa ":", por ejemplo (select * from product where productID=:Id). Probamos de nuevo, y obtenemos una consulta limpia.