Está en la página 1de 20

Generacin paso a paso de un sistema de biblioteca usando C# y Visual Studio 2005

Versin 2.7 (Visual Studio 2005) MI. Jess Muoz Torres jesus@desarrolla.com.mx Microsoft Certified Proffesional on Windows & Web applications MCP | MCTS | MCAD | MCT Desarroll@

Introduccin ............................................................................................................................ 2 El sistema................................................................................................................................ 2 El sitio Web ............................................................................................................................ 2 Aspecto general de la aplicacin ............................................................................................ 4 Creacin de una pgina maestra ......................................................................................... 4 Pginas principal y de registro. .......................................................................................... 6 La seguridad ........................................................................................................................... 6 Seguridad .NET para el sitio Web ...................................................................................... 6 Los controles de seguridad ................................................................................................. 8 La base de datos ...................................................................................................................... 8 Modificacin de la base de datos autogenerada ................................................................. 8 El mdulo de mantenimiento a libros y autores. .................................................................. 10 Generacin de los objetos de negocio que controlan las tablas ........................................ 10 Creacin de la pgina que muestra los catlogos de libros y autores ............................... 12 Formulario de solicitud y entrega de libros. ......................................................................... 15 Mdulo de entrega y solicitud de libros ........................................................................... 15 El men de navegacin ......................................................................................................... 19

Introduccin
Este material se crea tomando como base el tutorial Creando una aplicacin en C# de principio a fin, material que alguna vez encontr en la Universidad .NET. Aquel material usaba tcnicas del .NET Framework 1.1 con el que aprend en un instante casi todo lo ms importante del desarrollo con esa versin de la tecnologa .NET. Ahora, es tiempo de migrar a .NET Framework 2.0. As que sin ms ni ms comencemos.

El sistema
En resumen, se trata de un sistema de biblioteca que permite hacer prstamos de libros a la vez que actualiza el inventario con cada prstamo o devolucin. Es posible dar mantenimiento al catlogo de autores, al catlogo de libros y tambin es posible administrar usuarios. Cuenta con seguridad, de manera que solo el usuario administrador puede dar mantenimiento a libros y autores. Cualquier usuario puede darse de alta, pero no ser autorizado a pedir libros a menos que un usuario asistente o administrador lo active.

El sitio Web
Antes que nada, necesitamos un sitio Web que aloje nuestro sistema, as que generemos uno. Antes de comenzar
1. 2. El sitio se va a montar en una carpeta del sistema y no en http. De esta manera podemos llevarnos la aplicacin a cualquier otro sistema. Usaremos el nombre Default.aspx para nombrar a las pginas principales de cada mdulo.

1. Iniciar Visual Studio 2005 2. Generar un nuevo proyecto a. En el men File, seleccionar New Project y seleccionar solucin en blanco, guardarla en la carpeta C:\Comun\Biblioteca2005 y darle el nombre Biblioteca2005. Observar la figura para ms detalles

Ilustracin 1. Creacin de una solucin

b. Presiona Ok. (Ya se, ya se, este paso est de ms, pero alguna vez estaba ya en el paso 10 de 4 de un tutorial en una clase y un alumno me llama y dice - Ya le doy <Enter>? - apenas estaba en el paso 1 )

c.

d.

En el explorador de soluciones solo hay un elemento Solution, selecciona New Web Site de la primera opcin del men contextual de este elemento. (o sea, selecciona el elemento solution que dice Biblioteca 2005 con el derecho del ratn, luego Add y luego New Web Site). Y esto para qu? Bueno, si y luego se me ocurre aadir un proyecto de Windows o un Servicio Web o Windows solo lo aado a la solucin y as esto forma parte de un solo producto. Nmbralo como se muestra:

Ilustracin 2. Creacin de un sitio web

e. No olvides seleccionar el lenguaje C# y crearlo en File System 3. Elimina la pgina Default.aspx que aparece en forma predeterminada. (No sirve, vamos a generar una pgina maestra que aloje a otra Default.aspx) 4. Generemos 3 carpetas en el sitio web seleccionando New Flder del men contextual del sitio Web. Van a contener los elementos visibles a cada rol de usuario.

Ilustracin 3. Creacin de folders para la aplicacin

Aspecto general de la aplicacin


Para que la aplicacin tenga un aspecto uniforme en todas sus pginas vamos a usar Pginas principales o Master Pages que funcionan como una plantilla. Procedamos.

Creacin de una pgina maestra


Antes de comenzar 3. Crearemos una pgina maestra usando marcas div en vez de tablas, porqu? Porque el estandar www indica
que el uso de tablas debe ser nicamente para presentar datos tabulados y no para el ajustar el aspecto de la pgina. Adems los lectores de Internet par discapacitados leen el elemento table con un nombre, eso es un mal diseo (y una descortesa)

1. Genera un tema con una hoja de estilo Este tema contiene la configuracin para cada rea marcada con la propiedad id de cada div. As que habr una regla de estilo por cada id en cada div. a. Crea una nueva carpeta en el sitio con Menu contextual Add ASP.NET folder Theme, Nmbralo como Biblioteca2005 b. Agrega un elemento Style Sheet al flder creado en el inciso a no importa el nombre que le pongas, todas las hojas de estilo que pongas ah son cargadas. Esto abre un editor de estilos que contiene body c. En el men contextual de rea de trabajo selecciona Add Style Rule d. Selecciona la marca Element ID y escribe el nombre Titulo, agrega esto con el botn > y presiona OK e. Ahora en el men contextual del texto #Titulo selecciona Build Style, en Position ajusta las propiedades como se muestra:

Ilustracin 4. Propiedades del estilo #Titulo

Aqu est el resto de la hoja de estilo:


body { } #Titulo { left: 0px; width: 100%; position: absolute; top: 0px; height: 150px; background-color: sienna; } #ColumnaIzquierda { left: 0px; width: 150px; position: absolute; top: 150px; height:400px; background-color: chocolate; } #ContenidoPrincipal { left: 150px; width: 100%; position: absolute; top: 150px; height: 400px; background-color: transparent; } #PieDePagina { left: 0px; width: 100%; position: absolute; top: 550px;

height: 150px; background-color: sienna; } #AreaDeRegistro { width: 300px; position: absolute; top: 0px; height: 150px; right: 0px; background-color: sienna; }

2. Aade al sitio un nuevo elemento de tipo Master page con el nombre predeterminado en
C# y con cdigo en archivo separado.

Ilustracin 5. Crear una pgina maestra 3.

Vamos a crear cuatro reas: Encabezado, ColumnaIzquierda, Contenido y AreaDeRegistro. contenido por lo que se muestra a continuacin:

4. Abre el modo Source de MasterPage.master y trabajemos con algo de HTML. Cambia su


<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" EnableTheming="true"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Sistema de biblioteca con Visual Studio 2005</title> <!-- Este link es temporal, al terminar de desarrollar la aplicacin elimnal o, es solo para diseo --> <link href="App_Themes/Biblioteca2005/StyleSheet.css" rel="stylesheet" type="text/css" /> </head> <body> <form id="form1" runat="server"> <div id="Titulo"> </div> <!-- Contenido de la columna izquierda --> <div id="ColumnaIzquierda"> </div> <!-- Contenido del rea principal --> <div id="ContenidoPrincipal"> <asp:contentplaceholder id="ContentPlaceHolder1" runat="server"> </asp:contentplaceholder> </div> <!-- Contenido del pie de pgina --> <div id="PieDePagina"> </div> <!-- Contenido del rea de registro --> <div id="AreaDeRegistro"> </div> </form> </body> </html>

Pginas principal y de registro.


La pgina principal es Default.aspx. Genera dos nuevas formas Web seleccionando Add new item del men contextual del sitio. Una se va a llamar Default.aspx y la otra Login.aspx (esta ltima es necesaria debido al contenido con seguridad de la aplicacin), mrcales la opcin seleccionar Master Page y selecciona la nica Master Page que hay, esto hace que tengan el mismo aspecto. Del men contextual de Default.aspx selecciona Set As Start Page

La seguridad
La seguridad que vamos a generar contiene una base de datos en SQLServer, tablas, roles, usuarios, permisos, encriptacin y reglas de integridad. Comnmente todo esto toma varios das o semanas en estar listo, (Bueno, tal vez unas horas, pero de que es tardado es tardado. Tiempo estimado para este paso: 10 minutos. Va? Cuntale Ms notas sobre esto al final de este Paso a paso.

Seguridad .NET para el sitio Web


Antes de comenzar 4. La seguridad se va a montar en una carpeta de la propia aplicacin, esto significa que la base de datos ser local
y estar en en la carpeta App_Data. No es obligatorio que as sea, as que si prefieres usar un Server de Oracle, de SQLServer 2005, de MySQL, etc.. solo tienes que correr asp_regsql.exe desde el indicador de comandos de Visual Studio y configurar esta opcin.

1. Ir al sitio de administracin de la aplicacin con: 2. Seleccionar ASP.NET Configuration del men Website

Ilustracin 6. Men de configuracin de ASP.NET

a. O ms fcil, presiona el botn

del explorador de soluciones.

b. Una vez en este sitio se ve algo como:

Ilustracin 7. Herramienta de administracin del sitio

3. Selecciona Security (se tarda un rato despus de esto, en el fondo se est creando una base de datos, tablas, etc.) 4. Selecciona y marca 5. En el paso 3 presiona Next 6. En el paso 4 activa la casilla Enable roles for this Web site 7. Aade 2 roles: Administrador y Asistente. (No aadimos Usuario porque ese no necesita rol) 8. Ahora aparece un elemento para crear nuevo usuario. Crea 3 usuarios: Administrador, Asistente1 y Usuario1 (anota las contraseas por algn lado, luego se te olvidan...y observa que la primer letra va con MAYSCULA) 9. Una vez creados los usuarios, presiona Next 10. Asignemos permisos a las carpetas, observa que al expandir el rbol se ven. a. A la carpeta de Administrador agrega: (Es muy importante que se haga en el orden que se indica) i. Anonymous Users Deny Add This Rule ii. Role Administrador Allow Add This Rule iii. All Users Deny Add This Rule b. A la carpeta de Asistente agrega: i. Anonymous Users Deny Add This Rule ii. Role Asistente Allow Add This Rule iii. Role Administrador Allow Add This Rule iv. All Users Deny Add This Rule c. A la carpe de Usuario solo deniega a Anonymous Users d. Presiona Finish e. Selecciona ahora el link Manage Users f. De cada usuario selecciona su link Edit roles g. Administrador es Administrador y Asistente, mrcalos h. Asistente1 solo es asistente, marca solo asistente i. Usuario1 no tiene rol, es un simple usuario no annimo. j. Presiona Back y cierra el explorador. Terminamos. La seguridad en .NET 2.0 es una maravilla ahorradora de tiempo, si se utiliza esta herramienta dejamos el trabajo a .NET. Ahora, se ha creado una base de datos ASPNETDB.MDF y algunos archivos web.config en cada carpeta que 1 necesite seguridad . De esta manera solo los usuarios autorizados pueden acceder a ciertas partes de la aplicacin, ver partes del men, usar controles, abrir pginas, etc. Esta seguridad ya incluye encriptacin y capacidad de recuperacin de contraseas y aadir usuarios. Adems de lo anterior es
1

Ilustracin 8. Seguridad

Los cambios en el explorador de soluciones solo sern visibles hasta que refresques el contenido con

posible usar la base de datos como cualquier base comn, podemos aadirle ms tablas o ms campos a las tablas que ya existen, crear vistas, procedimientos almacenados, etc. Si al final es necesario migrar esta base de datos un servidor, basta con cambiar la cadena de conexin y configurar el sitio para que lea la base desde otro lado, pero eso ya es otro tema.

Los controles de seguridad


1. Abre la Master Page 2. Arrastra un control LoginView de la paleta Login hasta el area de registro. 3. Del smart tag de este control selecciona view: Anonymous template, esta ser la plantilla que se mostrar a un usuario que no ha iniciado sesin en el sistema. 4. Arrastra un control Login al interior del LoginView 5. Aade al control LoginView de la Master Page un control HyperLink justo debajo del control Login.Cambia sus propiedades Text: Soy nuevo usuario, NavigateURL:~/Registro.aspx. 6. Ahora selecciona la vista LoggedIn template del LoginView 7. Escribe dentro: Bienvenido 8. Aade a la derecha del texto un control LoginName. Esto pondr el nombre del usuario ah. 9. Justo debajo del LoginName arrastra un control LoginStatus el cual nos va a permitir cerrar sesin en el sistema. 10. Alinea todos los componentes de esta seccin a la derecha. 11. Terminamos.

La base de datos
Es momento de modificar la base de datos que gener el asistente de seguridad para que contenga los datos necesarios. Los datos que se necesitan son: Id del usuario (o matrcula de alumno/profesor/usuario), nombre del usuario, apellidos paterno y materno del usuario, direccin del usuario, telfono del usuario, cargo del usuario, permisos del usuario, rol del usuario, nombre completo de autor, id del autor, id del libro, isbn, cantidad en el inventario (libros totales con los que cuenta la biblioteca), cantidad en estantes (libros disponibles), ttulo del libro, fecha del prstamo.

Modificacin de la base de datos autogenerada


Antes de comenzar
Como veremos, no todos los datos van en una sola tabla, hay que normalizar y generar datos en las tablas correspondientes.

1. Abre el explorador de servidores y selecciona la base ASPNETDB.MDF 2. Generemos la tabla biblio_autores, selecciona el nodo tables y con el men contextual aade una nueva tabla. 3. Modifcala como se muestra y marca el id como identity.(en las propiedades de abajo):

Ilustracin 9. La creacin de la tabla biblio_autores

4. Crear la tabla biblio_libros como se muestra:

Ilustracin 10. Creacin de la tabla biblio_libros

5. Crear la tabla solicitudes como se muestra:

Ilustracin 11. Creacin de la tabla biblio_solicitudes

6. Ahora modificaremos la tabla aspnet_Users ya que .NET la gener pero faltan algunas
columnas como nombre, apaterno, amaterno, direccion, telefono. (Sin acentos eeeeh!).

7. Modifica esa tabla como se muestra:

Ilustracin 12. Tabla aspnet_Users modificada

8. Listo! Tenemos ya la base de datos completa.

El mdulo de mantenimiento a libros y autores.


Este mdulo servir para aadir autores y libros (recuerda que hasta el momento la base de datos no tiene nada). Usaremos tcnicas de .NET 2.0 como ObjectDataSource, DataSet, GridView y FormView.

Generacin de los objetos de negocio que controlan las tablas


Antes de comenzar
Anteriormente se usaba el modelo adapter, command, conection. Ahora se trabaja de una manera diferente, un poco ms gil, pero que internamente sigue usando adapters.

1. Con el men contextual de la aplicacin aadir un nuevo elemento de tipo DataSet y


ponerle de nombre ds_autores, cuando pregunte si lo pone en la carpeta App_Code, aceptar. (Realmente lo que se va a agregar es una clase)

Ilustracin 13. Creando un DataSet

2. Aparece la siguiente pantalla:

Ilustracin 14. Pantalla que muestra el nombre de la conexin

3. 4. 5. 6.

Presiona Next y acepta el nombre de la conexin predeterminada, vuelve a presionar Next De las tres opciones selecciona, Create New Stored Procedures. Next Presiona el botn Query Builder para crear una sentencia en diseo. De la lista, selecciona biblio_autores y presiona Add y luego Close, marca todos los campos menos el de *. Modifica el Query para que ahora sea: SELECT FROM WHERE idautor, nombre biblio_autores (nombre LIKE % + @nombreAutor + '%')

Si copias y pegas este texto es necesario reescribir las comillas en el QueryBuilder debido a que las comillas de Word son otro caracter diferente

7. Presiona Next, cambia los nombres de los procedimientos almacenados a biblio_InsertarAutores en vez de NewInsertCommand (con los otros nombres haz lo mismo) 8. Presiona Next, Quita la marca de Fill, (es para llenar, no queremos llenar). 9. El nombre del mtodo que se generar cmbialo de GetData a ObtenerAutoresPorNombre, presiona Next, y luego Finish. 10. Edita el procedimiento almacenado biblio_ActualizarAutores en la base de datos ASPNETDB.MDF que est en el explorador de servidores en el nodo stored procedures para que quede as:

11. Elimina el parmetro @idautor de la coleccin de parmetros de UpdateParameters de UpdateCommand en las propiedades del dataAdapter del DataSet ds_autores.xsd 12. Guarda los cambios y cierra el DataSet. 13. Genera otro DataSet ds_libros pero ahora usa la tabla biblio_libros y cambia el WHERE por idautor= @idDelAutor, intuye los nombres de cada elemento ;) 14. El procedimiento almacenado biblio_ActualizarLibros de ds_libros se muestra:

15. Elimina el parmetro @idlibro de la coleccin de parmetros de UpdateParameters de UpdateCommand en las propiedades del dataAdapter del DataSet ds_libros.xsd 16. Terminamos.

Creacin de la pgina que muestra los catlogos de libros y autores


Antes de comenzar 1. Crea un archivo Catalogos.aspx en la carpeta Administrador. (No olvides la Master Page) 2. Agrega los siguiente componentes en ese orden a. Un TextBox, id:txtNombreAutor, Text:Inserta aqu tu criterio de bsqueda b. Un botn id:btnBuscarAutores, Text: Buscar autores c. Un botn btnAgregarUnAutor, Text: Agregar autor d. Un GridView gvAutores, Width:100px, PageSize: 5 e. Un FormView fvAutores 3. Selecciona el smart tag (El triangulito en la esquina superior derecha) y selecciona Choose Data Source y del DropDown seleccin <New Datasource> 4. De la lista de tipos de Data Source selecciona Object y especifia como nombre DsAutores. Este ser la fuente de datos de nuestro GridView

Ilustracin 15. Tipos de data source (Object)

5. Cuando pida seleccionar el objeto de negocios selecciona el TableAdapter de ds_autores. Presiona Next 6. Deja los valores de los mtodos como estn y presiona Next 7. Te pide definir la forma de llenar el parmetro nombreAutor, lo vamos a llenar con el TextBox txtNombreAutor, as que selecciona a. Parameter source: Control b. Control ID: txtNombreAutor c. Default Value: * 8. Presiona Finish. 9. Del smart tag de gvAutores marca a. Enable Paging b. Enable Editing

10. 11.

12. 13.

c. Enable Deleting d. Enable Sorting e. Enable Selection Del smart tag del fvAutores selecciona Cose Data Source y selecciona DsAutores Cambia las propiedades del fvAutores a: a. DefaultMode: Insert b. Visible: false En el cdigo del evento clic de btnBuscarAutores escribe DataBind(); Modifica el cdigo del evento clic del btnAgregarAutor como sigue: (no lo escribas tal como est, primero haz doble clic sobre el botn para generar el mtodo)

14. En el mtodo ItemInserted de fvAutores poner el siguiente cdigo:


(El rea para teclear este mtodo aparece cuando haces doble clic sobre el nombre del mtodo ItemInserted de las propiedades de fvAutores [F4 + clic en el icono del rayo])

15. Ahora que ya tenemos el mdulo de autores generemos el mdulo de libros.


(En la misma forma Catalogos.aspx solo que ms abajo)

16. 17. 18. 19.

20. 21.

22. 23. 24. 25. 26.

Agrega los siguientes elementos: a. Un botn btnAgregarUnLibro, Text: Agregar libro b. Un GridView gvLibros, Width:100px, PageSize: 5 c. Un FormView fvLibros Selecciona el smart tag de gvLibros(El triangulito en la esquina superior derecha) y selecciona Choose Data Source y del DropDown seleccin <New Datasource> Selecciona Object como el tipo de Data Source y nmbralo DsLibros. Presiona Next y deja los mtodos como estn, presiona Next Enlaza el parmetro idDelAutor con el control gvAutores. (observa que automticamente se activa la propiedad SelectedValue, esto permitir seleccionar los libros del autor seleccionado en el grid de autores). Presiona Finish. Habilita paging, sorting, editing y deleting. Cambia las propiedades de fvLibros as: a. DefaultMode: Insert b. Visible: false Activa la plantilla InsertItem de fvLibros y cambia el primer TextBox por un DropDownList Con smart tag del DropDown cambi su DataSource a dsAutores con data field en nombre y valuefield en idautor. Luego con el men contextual del DropDown activa SelectedValue como propiedad Custom binding con la expresin Bind("idautor"). Copia de fvLibros el contenido de IntemInserting template a EmptyTemplate En el evento clic de btnAgregarLibro escribe:

27. En el evento ItemInserted de fvLibros y en evento clic de Cancelar de la plantilla Insert escribe:

28. En el evento Load de la forma escribe:

29. Ponle un poco de imaginacin al acomodo, colores, y otros adornos que hagan tu pgina
ms agradable. (Por favor no uses colores chillantes ni tipos de letras raras, solo s simple y prctico). As se ve mi pgina en el explorador despus de agregar algunos autores y libros:

Ilustracin 16. El mdulo de catlogos funcionando

30. Y as se ve el modo diseo:

Ilustracin 17. El diseo del mdulo de catlogos

31. Terminamos

Formulario de solicitud y entrega de libros.


Para este formulario necesitaremos presentar al usuario una lista de los libros que ha solicitado, cada uno con un botn Entregar que permita realizar la entrega. Tambin se presentar la lista de autores con caja de bsqueda y libros de cada autor con un botn Solicitar en cada libro que permita hacer la solicitud de prstamo. Hay dos condiciones que cumplir: a) No se debe prestar el libro a alguien que ya lo tiene solicitado. b) Si ya no hay ejemplares disponibles, indicrselo al usuario.

Mdulo de entrega y solicitud de libros


1. Genera un nuevo dataset llamado ds_solicitudes que genere nuevos procedimientos almacenados y con el Query builder genera la siguiente sentencia (o escrbela en el rea correspondiente):

2. Llama Biblio_SeleccionarLibrosSolicitados al Query creado. 3. El nombre del mtodo de seleccin es: ConsultarLibrosSeleccionados 4. Selecciona el nodo Stored Procedures de la base ASPNETDB.MDF y en su men contextual selecciona New Procedure. 5. Inserta el siguiente cdigo:

6. Genera otro procedimiento almacenado y escribe lo siguiente:

7. 8. 9. 10. 11. 12. 13. 14. 15. 16.

Genera en la carpeta Usuarios una nueva forma llamada SolicitarLibro. Copia los controles de Aministrador/Catalogos.aspx en esta forma Elimina los botones btnAgregar y btnAgregarLibro En gvAutores y gvLibros solo deja activa la opcin Allow Selection y Allow Paging. Cambia la leyenda del botn Select del grid de libros a Solicitar desde la opcin Edit colums del smart tag de gvLibros Aade al principio de la forma un grid gvLibrosSolicitados y ajusta Width a 100% Selecciona el smartTag y genera un nuevo datasource Acepta los valores predeterminados y asigna el enlace del parmetro nombreUsuario a la variable de sesin nombreUsuario. Cambia la leyenda del botn Select a Entregar Aade el siguiente campo a la clase de la forma:
static String cadenaDeConexion = ConfigurationManager.ConnectionStrings["ASPNETDBConnectionString"].ConnectionString;

17. Aade lo siguiente al manejador del evento load:


Session["nombreUsuario"] = this.User.Identity.Name;

18. En el manejador del evento clic del botn btnBuscaAutores escribe:


DataBind();

19. Selecciona gvLibrosSolicitados y muestra la lista de eventos en la ventana de propiedades. 20. Haz doble clic sobre el evento SelectedIndexChanged 21. En este manejador escribe el siguiente cdigo:

22. En el manejador del evento SelectedIndexChanged del gridView gvLibros escribe lo siguiente:

23. Aspecto del modo diseo de la forma:

24. Y corriendo

25. Terminamos

El men de navegacin

1. Aade un elemento Site Map a la raiz del sitio 2. Modifcalo para que se vea como sigue (observa el atributo roles):

3. Abre el archivo de configuracin general web.config y modifcalo para que incluya lo siguiente dentro de la propiedad <system.web>

4. Aade un elemento SiteMapDataSource (smdsMapaDelSitio) a la Master Page 5. Aade en la columna izquierda un control TreeView tvMenuDelSitio 6. Selecciona Cose Data Source del smart tag de tvMenuDelSitio, selecciona smdsMapaDelSitio. 7. Modifica algunas propiedades de tvMenuDelSitio. a. ShowLines: True b. ExpandDepth : 1 Ejecuta el sistema. Y Listo. Terminamos. Ahora te toca ponerle detalles

Si tienes comentarios sobre este tutorial (errores de dedo, lgicos o de cdigo) contctanos. Necesitas asesora, desarrollo, entrenamiento o personal entrenado en .net y java? jesus@desarrolla.com.mx Descargar proyecto en *.zip