Archive for 30 abril 2007|Monthly archive page

Capa de Datos Automágicamente Generada con NetTiers y CodeSmith

Como es costumbre en nosotros los desarrolladores, siempre estamos en busca de nuevas formas de escribir menos código, ¿será para mostrar lo listos que somos?, o simplemente porque somos muy flojos.

Sea como sea, la primera librería que utilicé para agilizar la escritura de la capa de datos de mis aplicaciones fue el Data Access Application Blocks, que ahora forma parte de la Enterprise Library, es cierto que esta librería ayuda a la hora de crear la conexión con la base de datos y ejecutar los procedimientos almacenados, pero aún hay mucho código que escribir.

Entonces decidí buscar una nueva alternativa, algo más completo, mi búsqueda por la web me llevó a un nuevo concepto para mi, ORM (Object Relational Mapping), mapeo del modelo orientado a objetos en que programamos al modelo relacional de base de datos, este mapeo es necesario porque como sabemos existe una brecha entre estos dos modelos y hasta que no se desarrollen completamente las bases de datos orientadas a objetos, tendremos que estar saltando esta brecha cada vez que tengamos que persistir un objeto en una base de datos relacional (Sql Server, Oracle, MySql, etc.)

Para lidiar con el problema de estar escribiendo cada vez el código necesario para persistir nuestros objetos, surgen numerosas librerías que nos ayudan a automatizar esta tarea, a continuación enumero algunas:

eXpress Persistent Objects for .NET.- de Developer Express, es uno de los primeros ORM que revisé, es bastante simple de utilizar, a grandes rasgos lo que tenemos que hacer es crear nuestra clase, por ejemplo en C# con sus respectivos campos, luego para que esta clase se pueda persistir tenemos que hacer que herede de la clase XPObject, adicionalmente si queremos hacer asociaciones y cambiar los nombres con que se guardaran las tablas o campos en la base de datos tendremos que utilizar atributos, después de crear nuestras clases, si la base de datos aun no existe se creará automáticamente y podremos persistir nuestras clases en ella. Esta librería soporta la mayoría de las bases de datos conocidas, así que cambiar de gestor de base de datos no representa ningún problema, una desventaja es que esta librería es de pago.

NHibernate for .NET.- Es la versión para .Net del conocido Hibernate para Java, aunque no esta tan desarrollado como su hermano mayor de Java, es una buena alternativa; para persistir las clases no necesita que nuestra clase herede de una clase base como en el caso anterior, lo que necesitamos en este caso es un archivo en formato xml donde indicaremos el mapeo de los campos de la clase con la base de datos, soporta lenguaje de consultas orientado a objetos, además de la mayoría de bases de datos conocidas, y para cambiar de gestor de base de datos en nuestro proyecto solo basta cambiar una línea en un archivo de configuración, en la versión actual todavía no soporta procedimientos almacenados razón por la cual no lo utilizo en mis proyectos, en la siguiente versión ya traerá soporte para procedimientos almacenados. Esta librería es open source, así que pueden utilizarla sin costo alguno.

Cooperator Framework.- Es un framework relativamente nuevo, no he tenido oportunidad de probarlo pero promete bastante, esta hecho por un grupo de desarrolladores argentinos, así que no es mala idea echarle un vistazo.

.netTiers.- .netTiers en realidad es una plantilla para CodeSmith, y CodeSmith es un generador de código que funciona basado en plantillas, uno escribe una plantilla en un lenguaje que tiene sintaxis similar al ASP .Net y luego puede general código para cualquier lenguaje basado en el texto de la plantilla.

Entonces .netTiers es una enorme plantilla que funciona en CodeSmith, se conecta con la base de datos que le indiquemos y comienza a generar todos los procedimientos almacenados que necesitaremos es decir (Insert, Update, Delete y consultas) para cada una de las tablas de nuestra base de datos, luego genera todas las clases correspondientes a las tablas que tenemos en la base de datos, así como los métodos que se corresponden con los procedimientos almacenados, y lo coloca todo en diferentes proyectos que conformarán la capa de datos. Obviamente habrá alguna funcionalidad específica de nuestra aplicación que no se puede generar automáticamente , para lo cual tendremos que escribir el procedimiento almacenado nosotros mismos con una nomenclatura especial, para estos procedimientos también se generaran los respectivos métodos en las clases correspondientes.

De esta manera no tendremos que preocuparnos por hacer consultas Sql, únicamente tendremos que llamar a los métodos necesarios con los parámetros requeridos.

La ventaja de esto es que el código se genera una sola vez, por lo que se gana en velocidad de ejecución, puesto que todo es compilado antes de su distribución.

La desventaja es que por el momento solo funciona con Sql Server, además que la plantilla es de uso libre pero el generador CodeSmith es de pago.

Yo utilizo el .netTiers en mis proyectos porque lo considero una buena opción está en medio camino entre hacer todo a mano y utilizar un ORM que genera todo en tiempo de ejecución como el NHibernate.

Anuncios

Paginación Alfabética de GridView

Hace un rato mi amigo Christian Ruiz, me envió un ejemplo de cómo paginar un GridView alfabéticamente (ya era hora que haga algo él solo), revisé el ejemplo y me pareció de lo más interesante.

Lo primero que ha hecho es interceptar el evento RowDataBound que ocurre cada vez que una fila se enlaza a los datos. Dependiendo del tipo de fila, en este caso si se trata del pie del GridView, inserta dentro controles LinkButton para cada letra del alfabeto desde la “A” hasta la “Z”, y le pasa como argumento del LinkButton la letra que muestra el control.

Luego intercepta el evento RowCommand que ocurre cada vez que se presiona un botón dentro del GridView, recupera el valor del botón que se presionó (es decir sobre que letra se presionó) mediante las propiedades e.CommandName y e.CommandArgument del parámetro que nos proporciona el evento, una vez que sabemos que letra del pie del GridView se pulsó, solo queda hacer una consulta a la base de datos con ese parámetro y enlazarlo con el GridView, el ejemplo queda así:

Paginación Alfabética de GridView

El ejemplo utiliza la tabla Customers de la base de datos Northwind, esta hecho en Visual Basic .Net (no pasa nada con Visual Basic, C# es la voz)

Descargar Ejemplo: Ejemplo GridView paginado alfabéticamente
Favor de darle clic derecho y guardar destino como…, una vez descargado cambiar la extensión a .zip, y descomprimirlo (todo esto porque no me dejan subir archivos zip).

¿Cómo Simular un TabControl para WebForms con MultiView y View?

Otra Consulta de mi amigo Christian (ya se está haciendo costumbre): ¿Hay un componente TabControl para Web?, la respuesta corta NO.

Una mejor respuesta, no, pero se puede hacer, existen muchas formas de hacerlo, pero yo opté por la mas fácil y rápida de todas, para esto tenemos que utilizar dos nuevos controles de ASP .Net 2.0, MultiView y View, estos dos componentes trabajan justos para lograr la funcionalidad que necesitamos.

View.- Sirve como contenedor de otros elementos, es decir actúa como un panel, donde podemos colocar todos los controles que necesitemos.

MultiView.- Como su nombre lo indica es un contenedor que sirve para poner dentro de él uno o más controles View, adicionalmente se encarga de que en un momento dado se visualice sólo uno de los controles View que contiene, para indicarle cual de los controles View queremos visualizar tenemos que utilizar la propiedad ActiveViewIndex.

Ya se habrán dado cuenta que el control MultiView tiene funciones similares al TabControl, en realidad lo único que le hace falta es la parte superior donde se puede seleccionar las páginas, no tiene esta representación gráfica, y que vamos a hacer al respecto, simplemente agregarlo nosotros, la manera más fácil es utilizar un control Menu, lo configuramos para que tenga orientación horizontal ponemos los ítems que queremos y listo. Solo falta interceptar el evento MenuItemClick y ponerle el siguiente código:

void Menu1_MenuItemClick(object sender, MenuEventArgs e)
{
      MultiView1.ActiveViewIndex = Int32.Parse(e.Item.Value);
}

Para hacer esto, es necesario poner en la propiedad value de cada item el índice del control View que le corresponde.

Simulación de TabControl

Esta solución es bastante simple, si quieren hacer algo más elaborado pueden utilizar imágenes para los tabs, el siguiente artículo contiene un ejemplo que utiliza imágenes: A Simple ASP.NET Tab Control Using the MultiView control.

¿Como Actualizar un GridView con Enlace a Datos en Tiempo de Ejecución?

Ayer martes por la mañana, uno de mis amigos me pidió ayuda con la grilla para web de Visual Studio 2005 (GridView), me dijo que no puede realizar actualizaciones de datos haciendo el enlace en tiempo de ejecución, es decir hacer todo por código, sin utilizar los componentes en tiempo de diseño con lo que se puede hacer la actualización de datos en pocos minutos.

Le dije (que no sabes hacer una cosa tan básica) no hay problema, en 20 minutos te mando un ejemplo completo; antes había trabajado de esta manera con el Framework 1.1 y el componente DataGrid sin ningún problema, pero grande fue mi sorpresa al ver que con el GridView las cosas se complicaban enormemente y algo que parecía tan básico no lo era tanto al menos para mi, luego de revisar muchas páginas con ejemplos, casi reventar el monitor con la cabeza y 3 horas de trabajo, al fin logré hacer andar el bendito ejemplo, a continuación algunas pautas para no enloquecer en el intento:

1. No te olvides que estas trabajando en un ambiente Web.- Debo confesarlo esto ya me había pasado antes, Visual Studio te da tantas facilidades para diseñar tus formularios de manera visual, que uno pierde la noción que esta desarrollando una aplicación web, y el error que me estaba volviendo loco esta relacionado simple y llanamente con el código que puse en el evento Load del formulario; como todos saben, el evento Load se dispara cada vez que la pagina se carga, incluido los PostBack necesario para realizar cada acción (por ejemplo pulsar un botón), para resolver el problema simplemente usamos la propiedad IsPostBack de la clase Page, que nos indica si es la primera ves que se carga la pagina o no:

if (Page.IsPostBack)
{
      //Se ejecuta todas las veces que se carga la pagina exepto la
      //primera vez
}
else
{
      // Se ejecuta solo la primera vez que se carga la pagina
{

2. Convertir las columnas en Plantillas.- Para facilitar el trabajo de recuperar los datos del registro que se esta editando, es necesario cambiar los tipos de columnas de BoundField a TemplateField, de esta manera podremos recuperar los datos que se están ingresando en cada uno de controles de la plantilla, utilizando el método FindControl.

3. Implementar los eventos del GridView que necesitemos.- Esta parte es muy importante, puesto que en estos eventos tendremos que poner toda la lógica para realizar la actualización de datos, los eventos más importantes que tenemos que interceptar son: RowEditing, RowUpdating, RowCancelingEdit y RowDeleting.

//método auxiliar para facilitar el trabajo de enlace a datos
void EnlazarDatos()
{
      //sdsEmpelado es un ObjectDataSource previamente configurado
      GridView1.DataSource = sdsEmpleados;
      GridView1.DataBind();
}

void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
      //estableciendo la propiedad EditIndex hacemos que esa fila se
      //ponga en edición
      GridView1.EditIndex = e.NewEditIndex;
      EnlazarDatos();
}

void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
      //recuperamos la fila que estamos editando
      GridViewRow fila = GridView1.Rows[e.RowIndex];
      //inicializamos los parametros para actualizar
      sdsEmpleados.UpdateParameters[“EmployeeID”].DefaultValue =
            (fila.FindControl(“Label1”) as Label).Text;
      sdsEmpleados.UpdateParameters[“LastName”].DefaultValue =
            (fila.FindControl(“TextBox2”) as TextBox).Text;
      sdsEmpleados.UpdateParameters[“FirstName”].DefaultValue =
            (fila.FindControl(“TextBox3”) as TextBox).Text;
      //Ejecutamos la actualización
      sdsEmpleados.Update();
      //para salir del estado de edición
      GridView1.EditIndex = -1;
      EnlazarDatos();
}

void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
      //para salir del estado de edición
      GridView1.EditIndex = -1;
      EnlazarDatos();
}

void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
      //recuperamos la fila que queremos eliminar
      GridViewRow fila = GridView1.Rows[e.RowIndex];
      //Inicializamos los parametros para eliminar
      sdsEmpleados.DeleteParameters[“EmployeeID”].DefaultValue =
            (fila.FindControl(“Label1”) as Label).Text;
      //Ejecutamos la eliminación
      sdsEmpleados.Delete();
      //para que se actualice el grid
      EnlazarDatos();
}

Atención, el código que se muestra es solo un ejemplo, por simplicidad está sin las validaciones necesarias (por ejemplo comprobar que no sean nulos algunos objetos).

Si necesitan revisar un ejemplo totalmente funcional pueden descargar el ejemplo que hice para mi amigo, funciona con la base de datos Northwind con los tres primeros campos de la tabla Employees, utiliza la clase SqlDataSource, también se puede hacer con la clase SqlDataAdapter, pero como estamos trabajando con el .Net Framework 2.0, decidí utilizar la nueva clase SqlDataSource, espero que les sirva de algo.

Descargar Ejemplo: Ejemplo Actualización GridView
Favor de darle clic derecho y guardar destino como…, una vez descargado cambiar la extensión a .zip, y descomprimirlo (todo esto porque no me dejan subir archivos zip).

¿Que Suit de Componentes para .Net Debo Utilizar?

Llega un momento en la vida de todo desarrollador en que se ve con la necesidad de utilizar componentes de terceros, generalmente porque los componentes que nos brinda Visual Studio no son suficientes, es cierto que con la versión 2005 de Visual Studio se incrementaron enormemente la cantidad de componentes, pero aun así definitivamente los componentes de terceros nos ofrecen mayores ventajas.

¿Para que me sirve una suit de componentes en mi trabajo profesional? Nos sirve de mucho, porque nos ahorra el escribir miles de líneas de código para hacer tareas comunes, y eso sin hablar de los Application Frameworks, que será un tema para otro articulo; como bono adicional las suit de componentes desarrollados por terceras empresas nos ofrecen una interfaz de usuario mucho mas profesional, de modo que podemos hacer que nuestros sistemas luzcan como los que hacen las grandes empresas (Office, Outlook, etc.) sin mucho esfuerzo.

Y que suit de componentes debemos utilizar, yo no les voy a decir cual, en realidad hay muchas suits que podemos utilizar y yo no las conozco todas, ni mucho menos las he probado todas, solo les comentare algunas suits que he podido probar y cual es la que mas me gusta, no necesariamente es la que ustedes deberían utilizar pero seria bueno que prueben unas cuantas antes de decidirse cual les conviene más, todas tienen versiones de demostración completamente funcionales que pueden descargar desde su Web.

Developer Express.- Una suit realmente completa, en especial el grid que posee, es muy bueno y versátil, una de los cosas que más me gustan de esta suit es la apariencia visual que tiene, ya trae skins prediseñados y podemos cambiar la apariencia de todo nuestro sistema con una sola instrucción, además viene con editor de skins para crear los que queramos, unas de las cosas que no me gusta es que los componentes para Webforms son un poco lentos, pero en fin nada es perfecto y esta es la suit que utilizo yo, pueden descargar una versión de demostración desde aquí (ya tiene Ribbon, menús estilo office 2007).

Componet One.- Esta suit es una de las mas completas que he visto, tiene infinidad de componentes tanto para Winforms, WebForms, y dispositivos móviles, algo que no me gusta de esta suit es que no tienen una apariencia muy llamativa, tiene muchas funcionalidades pero es difícil lograr una interfaz de usuario espectacular. Durante un proyecto que realice hace poco tuve un problema con el grid de Developer Express, que como mencione antes es muy versátil, pero sucede que no se pueden realizar combinaciones de celdas que están en diferentes columnas, solamente soporta combinación de celdas en la misma columna, y como yo necesitaba esa funcionalidad tuve que utilizar el grid de Component One, que si soporta eso y más, lástima que sea tan difícil hacer que este grid se vea bonito, pueden descargar una versión de demostración desde aquí.

Telerik.- A decir verdad no probé mucho esta suit, me parece que es una de las mejores para WebForms, hace poco liberaron sus componentes para WinForms y según dice en la Web ya soporta la interfaz estilo Vista, pueden descargar una versión de demostración desde aquí (ya tiene Ribbon, menús estilo office 2007).

NetAdvantage.- De Infragistics, me parece que es una de las mas conocidas, pero tampoco lo probé a fondo, al igual que Developer Express, también tiene temas para cambiar la apariencia de la interfaz de usuario, pero no me convence mucho, no son tan bonitos como los de Developer Express, pueden descargar una versión de demostración desde aquí (ya tiene Ribbon, menús estilo office 2007).

Estas suits son las que conozco, si conocen otras pueden ponerlas en los comentarios, todas estas suits son de pago, no conozco ninguna suit open source, así que si conocen no duden en ponerla.

ReSharper una Herramienta de Productividad Adictiva para C#

Cuando tuve la oportunidad de ver las primeras presentaciones de Visual Studio 2005, me quede impresionado por las mejoras que Microsoft hizo en su herramienta de programación, especialmente lo referido a Refactoring, y los avances que tenia en IntelliSense y Code Snippets, no veía la hora te tenerlo en mis manos y poder probar el nuevo juguete.

Hasta que al fin llego el día de probar el nuevo Visual Studio 2005, pude utilizar las nuevas características en un nuevo proyecto que se me presento, en el cual corroboré que realmente estos cambios ayudaban enormemente en la productividad a la hora de escribir código.

Ya estaba feliz con mi nuevo juguete, pero por accidente (como suelen suceder las cosas buenas), encontré navegando en la web una herramienta denominada ReSharper for Visual Studio, de la empresa JetBrains, inmediatamente me despierta la curiosidad y comienzo a investigar para que sirve esta herramienta, lo primero que encuentro es que una de sus funciones es para hacer refactoring en C#, lo cual no me parecía muy interesante debido a que el nuevo juguete ya tiene refactoring de serie, pero solo por curiosidad decidí descargar la versión de demostración de aquí y probarlo, lo primero que hago es revisar la ayuda que trae, la cual es muy concreta y útil, y comienzo a revisarlo, se instala como un Add-in para Visual Studio, y te crea un nuevo menú dentro de Visual Studio. Te desactiva por defecto el IntelliSense de visual Studio y pone el suyo.

Cuando probé las características que tenía, no lo podía creer, yo que pensé que ya era bastante bueno el IntelliSense y Refactoring de Visual Studio, esto lo superaba por mucho, un pequeño resumen de sus características:

•Puede Resaltar los errores en el editor de código, ya se esto lo hace Visual Studio solo, pero además nos ofrece accesos directos para poder corregirlos rápidamente.
•Además de resaltar errores puede resaltar advertencias, que pueden ser configurados para seguir las buenas prácticas de programación.
•Tiene muchas más opciones de refactoring que Visual Studio, listos para ser utilizados.
•Tiene excelentes características de navegación y búsqueda dentro de nuestro código, por ejemplo podemos resaltar todas las ocurrencias de una variable en nuestro código, lo resalta con un color diferente fácil de ver.
•El IntelliSense es mucho mas inteligente que el de Visual Studio, porque te brinda mas información, por poner un ejemplo cuando uno digita comillas de apertura las de cierre se ponen automáticamente, igual sucede con las llaves paréntesis y cualquier carácter que se use como apertura y cierre, algo que personalmente me gusta mucho es que cuando pones el cursor en una llave de cierre por ejemplo, te resalta en la parte superior cual es la llave de apertura y de que instrucción es, esto lo hace aunque la llave de apertura este muy lejos y ya no se vea en el editor de código, en fin es una maravilla.
•Puede formatear código automáticamente, poner los saltos de línea en las instrucciones largas, etc.
•Puede ejecutar las pruebas de unidad de NUnit directamente desde el IDE.
•Y muchas otras cosas más, ya parezco de Jetbrains.

Esta herramienta solo funciona por el momento para C#, pero si eres como yo un amante del C# no dejes de probar esta herramienta, el único inconveniente es que como dice el titulo del post es adictivo, muy adictivo diría yo, una vez que lo pruebas no lo puedes dejar más. La herramienta no es Open Source así que hay que pagar por él, pero me parece que vale la pena.