Usando LINQ con Crystal Reports SDK

En el blog de SAP Community Network, Trevor Dubisnsky de Business Objects Canadá, aporta esta interesante entrada sobre como utilizar LINQ con Crystal Reports desde nuestras herramientas de desarrollo. Puedes leer la entrada original aquí, pero la traduzco, literalmente, para los que aún no se sienten cómodos con el inglés, aunque su estilo no es especialmente brillante:

<Traducción del original>

Si eres como era yo no hace mucho, probablemente no estabas familiarizado con LINQ (Language Integrated Query) o conocías los motivos por los que debías interesarte por él. Simplificando, LINQ es una característica incluida en .NET Framework 3.5 que aporta funcionalidad de queries tipo SQL a los lenguajes .NET.

Al principio, no estaba seguro de si LINQ era útil, puesto que todo lo que se puede hacer con LINQ se puede hacer mediante bucles y sentencias condicionales típicas. Sin embargo, tras un poco de investigación entendí como funciona LINQ y me di cuenta de que es una herramienta potente que puede “limpiar” código, haciéndolo más legible; afrontémoslo, cuando empezamos a anidar múltiples IFs en bucles, el código se hace difícil de seguir con bastante rapidez.

Desde que aprendí como funciona, he tenido ganas de blogar sobre el tema. El problema era que no estaba seguro de cómo podía usar LINQ de forma significativa con alguno de nuestros SDK. De entrada, el SDK de BusinessObjects Enterprise ya dispone de una lenguaje de consultas potente en forma de consultas a CMS y no podía imaginar como usarlo con los demás objetos. Entonces, hace unos días, mientras revisaba un ejemplo de código que escribí para crear un add-ín para Crystal Designer, ¡vi la oportunidad perfecta para usar LINQ!.

Mi add-in de ejemplo es una función de menú que destaca los objetos tipo subreport en amarillo, para que sea más fácil localizarlos, luego los vuelve a hacer transparentes. Este es el código que realiza la función;

//Obtener todos los objetos del informe crReportObjects = rptDoc.ReportDefinition.ReportObjects; //Ciclar a través de la lista de objetos foreach (ReportObject crReportObject in crReportObjects) { //Comprobar si el objeto es un subreport if (crReportObject.Kind == ReportObjectKind.SubreportObject) { //Obtener el objeto subreport crSubreportObject = (SubreportObject)crReportObject; // Si bHiLite es true marcar en amarillo, si no eliminar el // resaltado. if (bHiLite) { crSubreportObject.Border.BackgroundColor = System.Drawing.Color.Yellow; } else { crSubreportObject.Border.BackgroundColor = System.Drawing.Color.Transparent; } }//Pasar al siguiente objeto }

Bastante directo y simple, de manera que decidí implementarlo en LINQ y cambiar el IF-ELSE en un SELECT CASE:

// Usar LINQ para obtener sólo // los objetos subreport del report IEnumerable<SubreportObject> queryResults = from ReportObject crRptObj in rptDoc.ReportDefinition.ReportObjects where crRptObj.Kind == ReportObjectKind.SubreportObject select (SubreportObject)crRptObj; foreach (SubreportObject crSubRptObj in queryResults) { switch (bHiLite) { case true : crSubRptObj.Border.BackgroundColor = Color.Yellow; break; case false : crSubRptObj.Border.BackgroundColor = Color.Transparent; break; } }

La ventaja es que LINQ no sólo encuentra los ReportObjects correctos, si no que hace la conversión (cast) de tipo en una sola sentencia. Dividamos esta sentencia para analizarla:

IEnumerable<SubreportObject> queryResults = Declara la variable queryResults como un result set enumerable o colección del tipo SubreportObject.
from ReportObject crRptObj in rptDoc.ReportDefinition.ReportObjects Declara la variable crRptObj como ReportObject, indica que se busque o se itere en la colección rpt.ReportDefinition.ReportObjects asignando el resultado a la variable crRptObj.
where crRptObj.Kind == ReportObjectKind.SubreportObject Esta es la sentencia de comparación, que permite seleccionar las condiciones a buscar.
Como en una sentencia SQL, es posible establecer varias condiciones mediante cláusulas AND, OR y NOT.
select (SubreportObject)crRptObj; Si se satisface la condición WHERE, entonces se añade una variable al result set. Esta puede ser el elemento actual de la colección o un objeto completamente distinto. En este caso, estamos convirtiendo el objeto actual al tipo SubreportObject y devolviéndolo.
El resultado ha de coincidir con el tipo que hemos definido como QueryResults en el primer elemento.

Espero que sea útil o al menos un poco interesante y que intentes incorporar LINQ en tu código.

Algunas direcciones sobre LINQ:

http://msdn.microsoft.com/en-us/netframework/aa904594.aspx

http://en.wikipedia.org/wiki/Language_Integrated_Query

Y el ejemplo de mi add-in, aunque aún no lo he actualizado al código LINQ:

https://www.sdn.sap.com/irj/scn/go/portal/prtroot/docs/library/uuid/208428c9-eebd-2b10-0c83-8c7579e8e82a

Trevor Dubinsky. Soy Senior Engineer en SAP Business Objects.

<Fin de la traducción>

Anuncios
Esta entrada fue publicada en Crystal Reports, Visual Studio y etiquetada , , , . Guarda el enlace permanente.

Responder

Por favor, inicia sesión con uno de estos métodos para publicar tu comentario:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s