18/8/15

Enlazar a un informe estático desde un formulario

A veces hay requisitos de usuario que parecen sencillos y que sin embargo requieren mucho trabajo de desarrollo. Lo que técnicamente (en España al menos) se conoce como una chorrada que luego nos lleva horas o días de investigación y desarrollo (= buscar en Google muy fuerte). Esta es una de ellas: imaginad un formulario en CRM con unos cálculos tan complejos que su explicación requiere un PDF de varias páginas. Algo que no podemos simplemente enchufar como una ristra de HTML porque visualmente no encaja. El primer pensamiento es: no pasa nada, creo un webresource con el PDF y otro webresource con el enlace que apunte al primero. Pero hay un problema: los tipos de webresource son:

  • HTML
  • CSS
  • Javascript
  • XML, XSL
  • Imagen (jpg, gif, png)
  • Silverlight
  • Icono

¿Dónde está el tipo PDF? Pues no está, punto. Si creamos un PDF, le cambiamos la extensión, lo subimos como un CSS... muy complicado.

La solución viene de nuestros amigos los informes. La opción más habitual al crear un informe es cargar ficheros RDL con la opción Cargar un fichero existente. Pero nada impide que este fichero existente sea de otros tipos (PDF, DOC, PPT etc.) siempre que el navegador de nuestro cliente sepa qué hacer con él. Una vez subido el fichero, nos fijamos en la URL del formulario de edición del informe. Tendrá aproximandamente este aspecto:

..../CRMReports/reportproperty.aspx?id=%7bFAFAFAFA-AAFA-FAFA-FAFA-111111111111%7d

Nos apuntamos el código GUID del informe, en este caso: FAFAFAFA-AAFA-FAFA-FAFA-111111111111

Y creamos un webresource de tipo HTML con el siguiente código, que incluye una llamada a crmreports/download.aspx que hace justo lo que su nombre sugiere.

<a href="/crmreports/download.aspx?id=%7bFAFAFAFA-AAFA-FAFA-FAFA-111111111111%7d">Descargar PDF</a>

Ojo, no olvidéis el %7b y el %7d, de otra manera no funcionará. Otra buena noticia es que este código sigue funcionando entre distintos entornos, de modo que si incluimos informe y webresource en una solución, exportamos e importamos, el enlace seguirá funcionando.