Professional Documents
Culture Documents
Para el ejemplo que vamos a desarrollar vamos a partir de la idea de que el lector ya tiene conocimientos
básicos de .NET, de manejo y análisis de bases de datos utilizando “DBDesigner” y SQL, por lo mismo no voy a
abundar en detalles de algunas acciones realizadas en este manual.
Se trata de llevar el control de las ventas de de productos de una refaccionaria X de piezas para autos,
debe mostrar un punto de venta e imprimir facturas, esta refaccionaria pertenece exclusivamente a un
taller mecánico por lo tanto se necesita llevar control de los vehículos que tiene cada cliente
(probablemente esto ultimo es absurdo e inútil, pero nos va a servir como práctica de relación maestro-
detalles de las tablas).
Tenemos 5 tablas relacionadas y una tabla auxiliar para controlar los números de las facturas, si te preguntas de
donde salió la tabla “detallesVenta” recuerda que al hacer una relación de muchos a muchos se genera
automáticamente una nueva tabla, a la que en este caso editamos agregándole 3 campos mas.
Aureliux Página 1
Hasta ahora tenemos el “dibujo” de nuestra base de datos, pero a nosotros lo que realmente nos interesa es
crear la base de datos y no solo dibujarla, para eso desde DBDesigner crearemos un script el cual manejaremos
desde MySQL, para ello debemos seleccionar la opción File ->
Export -> SQL Create Script…
Aureliux Página 2
Crear la base de datos utilizando MySQL para Windows.
Aureliux Página 3
Como podremos observar tenemos un esquema de base de datos vacío, sin tablas,
sin nada, debemos hacer que todo lo que dibujamos en “DBDesigner” se convierta
en algo mas que un simple dibujo de un diagrama, para ellos vamos a utilizar el
script que generamos anteriormente (refaccionaria.sql), el cual habíamos dicho
que por si solo no sirve para nada, pero ahora utilizando “MySQL Query Browser”
es un complemento que nos liberará de diseñar las tablas manualmente.
Para ellos vamos al menú File -> Open Script y abrimos el archivo “refaccionaria.sql”, podemos ver que en la
ventana de resultados de en medio aparece el código SQL del script, en la parte superior de la ventana hay un
botón que dice “Execute”, pulsamos sobre el.
Aureliux Página 4
Capa de datos (Configurando el acceso a datos a MySQL)
A partir de este momento ya podemos comenzar a diseñar nuestro sistema desde visual studio 2008, el lenguaje
que utilizaremos es Visual basic.net por ser mas sencillo y desde mi punto de vista (respeto todos los puntos de
vista) el mas enfocado para trabajar con bases de datos entre todos los lenguajes de visual studio, o por lo
menos el mas ameno para hacerlo.
Creamos un nuevo proyecto utilizando “Visual basic” y como plantilla seleccionamos “Aplicación de Windows
Forms”, guárdalo donde tu quieras (Supongo que esto ya lo deben dominar a la perfección).
La primera gran tarea es configurar nuestro acceso a datos con MySQL, es decir, lograr que “visual basic” logre
establecer comunicación con MySQL, por si solo no puede hacerlo ya que por defecto su administrador de bases
de datos es “SQL Server” y viene configurado para trabajar con el, sin embargo en un principio dije que
deberíamos instalar “MySQL Connector” ya que este paquete nos permite establecer conexión entre “Visual
studio” y “MySQL” si no lo tenemos instalado será imposible configurar nuestro acceso a datos.
Agregar origen de datos: En la ventana de orígenes de datos damos clic en donde dice “Agregar nuevo
origen de datos” (Si la ventana orígenes de datos no aparece debes mostrarla seleccionando el menú
Datos -> Mostrar orígenes de datos).
Al hacer esto inicia un asistente que permite configurar el origen de datos, la primera pantalla nos pide
elegir el tipo de origen de datos, marcamos la que dice “Base de datos” y damos clic en el botón
Aureliux Página 5
siguiente, la siguiente ventana es muy importante ya que nos pide elegir la conexión de datos, si es la
primera vez que entras seguramente te aparecerá un cuadro como este (o por lo menos algo parecido).
Es necesario rellenar los campos que pide, como ya habíamos dicho anteriormente, el nombre del
servidor en este ejemplo es localhost, el usuario es root y la contraseña es sysdba.
Acto seguido se nos muestra la misma ventana que estaba originalmente pero ahora ya tiene
establecido los parámetros correspondientes a la conexión con el servidor de datos y el archivo de base
de datos, nos pregunta si queremos incluir los datos de estos parámetros en la cadena conexión o si
queremos excluirlos, lo correcto es marcar la opción que dice “Si incluir los datos confidenciales…”, otro
dato importante a considerar es que enla cadena conexión aparecen los datos de lo que estamos
hablando.
Aureliux Página 6
Teniendo claro lo anterior damos clic en el botón “Siguiente”.
En la siguiente ventana debemos guardar la cadena conexión con algún nombre, por defecto se le asigna
uno el cual podemos cambiar, en este caso le pondremos refaccionariaxCnn.
Finalmente podemos crear el dataset correspondiente, podemos crear un dataset para todas las tablas
o dividir dependiendo de la lógica diferentes dataset’s.
En este ejemplo y para mayor simplicidad utilizaremos uno solo, al cual le pondremos como nombre
“refaccionariaxDs” y marcamos todas las tablas, con esto tenemos que en un solo dataset estarán
incluidas todas las tablas, y damos clic en el botón “Finalizar”.
Aureliux Página 7
Con todo esto ya tenemos configurado nuestro acceso a datos, ya podemos
comenzar nuestra aplicación, pero como un último dato antes de continuar
podemos ver en la ventana de orígenes de datos reflejado nuestro dataset con sus
respectivas tablas, y en la ventana del explorador de
soluciones el archivo creado para ese dataset, si en
momento deseamos eliminar el dataset por el motivo
que sea basta con eliminar este archivo del explorador
de soluciones y listo.
Capa de negocios
Estamos utilizando la arquitectura de N capas, que en ese caso son en realidad tres capas, la primera capa es la
de datos (ya a hicimos anteriormente al configurar la conexión), la segunda capa es la de negocio en donde
creamos todas las rutinas y métodos que ayudan a crear ciertas tareas para acceder y manipular los datos de la
base de datos.
Una manera fácil para comenzar a realizar nuestra capa de negocios es editando el dataset creado
anteriormente,
Aureliux Página 8
Antes de empezar se debe tener muy claro las rutinas que se desea hacer con cada tabla, en este
ejemplo solo lo plasmaremos en una sola tabla tomando en cuenta que el proceso es el mismo para
todas las demás.
o Guardar datos
Damos clic derecho sobre la tabla artículos del
submenú escogemos Agregar -> Query
Aureliux Página 9
En el cuadro de diálogo “Especifique una
instrucción de SQL” nos muestra el código
que permite guardar los datos, este código
podríamos modificarlo (aunque no es
recomendable hacerlo en este caso), si
utilizas campos autoincrementables,
seguramente este no aparecerán aquí, ya
que como se genera automáticamente el
sistema no los incluye en esta operación.
o Borrar datos
Así como hicimos una rutina SQL para insertar los datos directamente en la base de datos, también
podemos hacer una para eliminarlos, el proceso es similar al anterior, damos clic derecho sobe la
tabla y ejecutamos Agregar -> Query y avanzamos hasta el cuadro de dialogo donde nos pide elegir
un tipo de consulta.
Aureliux Página 10
En este cuadro debemos remarcar la opción que dice “DELETE” y damos clic en el botón siguiente. A
continuación nos aparece el cuadro donde debemos especificar una instrucción DELETE de SQL
Como dije anteriormente el código es muy confuso, ya que para borrar el registro bastaría tan solo
mandar como única parámetro el campo llave, es decir algo como esto:
Aureliux Página 11
Pues bien, modifiquemos el código, podemos seleccionarlo y borrarlo (no es necesario borrarlo todo
solo la parte que queremos modificar) de tal manera que nos quede de la siguiente manera:
Si todo está correcto debemos dar clic en botón “Aceptar” y nos regresa al cuadro que estaba
originalmente, en donde podemos dar clic en el botón “Siguiente” avanzamos y guardamos la
instrucción SQL con el nombre que quieras, en este caso la guardamos con el nombre:
“DeleteArticulo” y seguimos avanzando hasta finalizar, veremos que en el editor del dataset
aparecerá listada esta instrucción en la sección que dice “articulosTableAdapter” junto con
“InsertArticulo”.
Es importante aclarar que si la esta tabla no estuviera relacionada hasta aquí bastaría, sin
embargo podemos ver que la tabla ”detallesVenta” depende de esta tabla ya que los detalles de
la venta dependen de los artículos, por lo tanto se debe eliminar primero los datos que
coincidan con este campo en la tabla “detallesVenta” pero a su vez la tabla detalles venta
también depende de la tabla “ventas”, asi que también hay que borrar en la tabla ventas, algo
asi como un borrado en cascada, esto con el fin de evitar inconsistencia en la integridad de los
datos, los querys nos quedarían como se muestran en las figuras de abajo.
Aureliux Página 12
El primero lo llamaremos “DeleteDetallesVenta” y el segundo “DeleteVenta”, este asunto de
borrar datos no es nada irrelevante, al contrario es tan importante que de un mal borrado
podríamos dejar datos sueltos y que a la larga podrían darnos problemas.
Aparte de insertar y eliminar otra tarea importante es buscar datos, consultar, podemos hacer
tantas consultas como necesitemos, por ejemplo podemos buscar por código, por nombre, etc…
podemos buscar un solo dato específico o un conjunto de datos que cumplan con un mismo
criterio por ejemplo todos aquellos cuya existencia sea menor de 50 artículos, bueno
primeramente hagamos una búsqueda por código, para ello el proceso es similar a los anteriore
querys: Agregar -> Query, avanzamos hasta el cuadro que nos pide elegir un tipo de consulta en
el cual remarcamos la opción que dice “SELECT que devuelve filas”, vemos que nos aparece un
cuadro similar a los vistos en los ejemplos anteriores, en el cual se nos muestra un código de
consulta que debemos modificar
para poder establecer que
queremos buscar por medio del
código, damos clic en el botón
“Generado de consultas” el cual nos
abrirá un el mismo cuadro donde
configuramos el “DELETE”.
Vemos el que código también ha cambiado, damos clic en “Aceptar” y avanzamos hasta
guardar el query con el nombre “FillByCodigo” y donde dice Nombre del método pongámosle
“GetDataByCodigo”, y avanzamos hasta finalizar.
Aureliux Página 13
Podemos hacer otra consulta, donde nuestro criterio sea el nombre del artículo (descripción),
pues bien , repitamos todo el proceso anterior, lo único que vamos a cambiar es nuestro
criterio, quedando como se muestra en la figura:
Si ya manejas SQL seguramente este criterio te va a ser familiar, ya que utilizamos el operador
“LIKE”, funciona de manera similar al operador “=” pero con la diferencia que es aplicado solo a
cadenas y que nos permite utilizar comodines para buscar al principio de la cadena, al final, en
medio, etc…, por ejemplo si buscamos una palabra podemos buscarla en el principio, en el final
o en medio, ya lo retomaremos mas adelante, pero si no sabes como funciona te recomiendo
que lo investigues ya que en un principio dije que no abundaría en detalles.
Hasta ahora tenemos insertar, borra y consultar, pero nos falta un query que nos permita
modificar datos, es importante determinar cuales queremos modificar, en este ejemplo solo
podremos modificar la descripción del producto, el precio y el punto de venta, podríamos hacer
un query por separado para cada uno, o uno solo que modifique a los tres, en este caso haremos
este último.
En el generador de consultas
debemos modificar
Aureliux Página 14
directamente el código tal como lo hicimos cuando queríamos borrar registros, para modificar
solo necesitamos especificar el nombre de la tabla, los campos a modificar con sus respectivos
parámetros y una referencia que en este caso es el campo llave.
Ya configuramos el acceso a datos, ya hicimos las rutinas necesarias para manejar los datos, ahora solo falta
diseñar la interfaz del usuario, se muy bien que a veces cuando empezamos a hacer un sistema lo que queremos
es comenzar a diseñar y tirar código a diestra y siniestra, pero también se que eso es un error muy grande que
nos hace perder tiempo y regresar a modificar y corregir (si es que se puede corregir) muchas situaciones que no
se previeron, así que al desarrollar un sistema nos debemos armar de mucha paciencia y hacer las cosas en el
orden correcto.
Disculpen por ser tan insistente en este punto, pero debo repetir que no voy a ser tan detallado en algunas
acciones que realice, ya que este no es un tutorial de VB.NET si alguna de las cosas que aquí realizo no saben
como se hicieron lo mejor es investigarle en manuales que abundan en internet.
Aureliux Página 15
En este manual solo vamos a realizar las operaciones para la tabla “artículos” y cuando sea necesario nos
extenderemos a otras tablas.
o Menú principal
Mediante la herramienta “MenuStrip” creemos el menú principal el cual debe quedar como se muestra
en la figura de abajo, o por lo menos algo parecido, las imágenes puedes personalizarlas a tu manera.
Y si ya sabes utilizar las demás propiedades puedes personalizarlas a tu gusto, puedes ejecutar el
programa(pulsando F5) para ver como va quedando la aplicación y corregirle lo que no te haya gustado.
Como es de imaginarse cuando seleccionemos alguna opción del menú se debe abrir un nuevo
formulario, asi que debemos crear todos los formularios que necesitemos, comencemos con el formlario
Aureliux Página 16
que permitirá controlar los datos de los productos (para seguir con los ejemplos con los que comencé
desde un principio), pero por ahora en el botón “Salir”coloquemos el siguiente código:
o Catalogo de productos
Enseguida podremos agregar un nuevo formualario al cual debemos colocarle un nombre, para ello en
el nuevo cuadro de diálogo que aparece debemos escribir el nombre del formulario sin borrar la
extensión “.vb”, en nuestro
ejemplo le llamaremos
productos.
Pulsamos el botón
“Agregar” y acto seguido
podremos ver en el
explorador de soluciones un
nuevo elemento con el
nombre del formulario que
acabamos de crear.
S
i
Aureliux Página 17
“Cambiar nombre” y sin borrar la extensión .vb escribimos “menuPrincipal”, ahora tenemos dos
furmarios (y pronto tendremos mas) facilmente identificables.
Sin embargo lo que a primera vista podremos ver cuando creamos un nuevo formulario es precisamente
un formulario vacío, el cua debemos darle forma y crear lo que queremos, podemos hacerlo de una
manera muy fácil aprovechando las herramientas que nos ofrece visual studio.
Las propiedades que vamos a cambiar a este formulario para ir iguales son:
Aureliux Página 18
La primera línea es para que el formulario aparezca en el centro de la pantalla, la segunda para indicar
que el formulario “productos” va aser una ventana hija de formulario “menuPrincipal”, y la ultima es
para mostrar la ventana, podemos correr el programa y veamos que está pasando.
Al ejecutar el programa y dar clic en el menu “Productos” podemos ver que aparece el formulario que
creamos.
Para poder realizar cualquier operación con los datos se puede hacer de distintas maneras, algunas mas
fáciles que otras, de igual forma algunas menos funcionales que otras, respeto todas las formas de
diseñar en VB.NET, pero en este artículo voy a explicar la mía.
Aureliux Página 19
Primeramente vamos a crear una nueva clase que nos
permita administrar los datos y los métodos que
configuramos en la capa de negocios.
Damos clic en el botón “Aceptar” y podemos ver el nuevo elemento en el “Explorador de soluciones” en
la ventana de diseño vemos el editor de texto de la clase vacía.
Todo lo que necesitamos está en el “dataset” configurado anteriormente, es decir solo debemos invocar
los métodos que se encuentran en “articulosTableAdapter”.
Aureliux Página 20
Como podemos observar hemos declarado el dataset y el adaptadro, asi mismo hemos creado un método
que devuelve todos los registros de la tabla “articulos”, ahora regresamos el formulario “productos” y
damos doble clic sobre el para ir al evento “Load”, nos aparece el editor de código en el evento Load, pero
antes de programar este evento debemos crear el objeto de la clase que definimos anteriormente, y luego
afectar las propiedades “datasource” y “datamember” del datagridView para establecer la fuente de datos
y después de ello invocar el métdo “todosArticulos” tal y como se muestra en la figura siguiente:
Ahora podemos correr el programa y navegar en el menú “Productos” veremos que al cargarse el
formulario, este aparecerá con los datos de la tabla “articulos”, por supuesto que por ahora todavía está
vacía.
o Agregar datos
Comenzaremos agregando datos a nuestra tabla para poder ver como se vería cuando insertáramos datos,
para ello podríamos hacerlo directamente en este mismo formulario, sin embargo para una mejor
Aureliux Página 21
presentación utilizaremos uno nuevo que nos permita capturar los datos y guardarlos, para eso agreguemos
un nuevo formulario con el nombre “addProductos”.
A este nuevo formulario agreguémosle 5 textBox, 5 Label y 2 botones, y debemos configurarlo de tal
manera que nos quede como se muestra en la figura:
txCodigo
txPrecio txDescripcion
txExistencia
btnGuardar
txPVenta
btnCancelar
Es evidente que al presionar el botón “Guardar” los datos deben almacenarse en la tabla y contrariamente
al presionar “Cancelar” el formulario debe cerrarse sin que nada suceda.
Debemos retomar la clase “adminDatabase” y crear un método que permita guardar los datos, agregamos
un método como este:
Ahora este método lo vamos a invocar desde el botón “Guardar” asi que damos doble clic sobre este botón
situado el en formulario “addProductos” y escribimos el siguiente código:
Aureliux Página 22
Y en el botón “Cancelar” el siguiente código:
Y por último en el evento “Load” del formulario debemos limpiar los “TextBox” ya que siempre se quedan
con la última información utilizada y eso es muy molesto:
Hemos terminado con la codificación que nos permite guardar los datos, ahora debemos hacer que al pulsar
el botón “Agregar” del formulario “Productos” aparezca lo que hemos hecho, para ello escribimos el
siguiente código:
Aureliux Página 23
Para poder validar cada “TextBox“ se debe hacer mediante el evento “Validating” en este ejemplo
comencemos con “txCodigo” dando doble clic sobre el evento “validating” y ahí validemos que no deje el
control en blanco:
Para que veas para que sirve esto, corre el programa sin modificar
esta propiedad y luego córrela modificándola, verás que sin
modificarla no puedes avanzar hasta que corrijamos el error, de la
otra forma nos muestra el error pero nos deja continuar.
Un asunto importante es validar el botón “Guardar” para que no deje guardar nada vacío, para esto
debemos desactivar el botón “Guardar” para tener mayor control al momento de guardar, es decir mientras
haya algún TextBox vacío este debe permanecer desactivado y se activará hasta que todos los controles
tengan algún valor. Agreguemos una función que retorna verdadero cuando haya algún TextBox vacío:
Aureliux Página 24
Hemos terminado de trabajar con nuestro formulario para guardar los datos, podemos personalizar otras
propiedades, en este ejemplo lo dejamos hasta aquí, es probable que se nos haya escapado algún detalle
pero debe ser mínimo.
o Eliminar datos
Eliminar registros será una tarea fácil, primeramente debemos agregar un método a la clase
“adminDatabase” que permita borrar un registro:
Regresamos al formulario “productos”, debemos saber que fila del dataGridView tenemos seleccionada
para que sea precisamente esa la fila a eliminar, para ello vamos a la propiedad RowStateChanged de
“grdArticulos” y escribimos:
Ahora puedes agregar nuevos artículos a tu tabla y eliminarlos sin ningún problema, sin embargo como dije
anteriormente eliminar no es algo que no tenga repercusiones futuras, ya que antes de eliminar debemos
tener en cuenta si esta tabla tiene relaciones con otras tablas, en nuestro ejemplo si tiene, así que debemos
eliminar primero en las tablas que estén relacionadas (pero esto lo haremos después), por ahora dejémoslo
así.
o Modificar datos
Primero recordemos que en la capa de negocios definimos un método que permitía modificar los datos
de los artículos, pero dijimos que solo podríamos modificar la descripción del producto, el precio y el
punto de venta, el método lo llamamos “UpdateArticulos”.
Aureliux Página 25
Creemos un nuevo formulario llamado “updateProducto” similar que utilizamos cuando dimos de alta a
un artículo.
Luego de eso debemos regresar al formulario “updateProducto” hacer el siguiente código en el evento
“Load” del mismo:
Con esto logramos que al ejecutarse el formulario aparezca con los datos que en ese momento estén
seleccionados en el datagridView del formulario “Productos”.
Aureliux Página 26
Hasta ahora no hemos hecho nada para modificar los datos, para ello primeramente debemos regresar
nuevamente a la clase “adminDatabase” y agregar otro método que permita modificar los datos:
e
n
e
Por último en el botón “Cancelar”
colocamos:
o Reportes (Imprimir)
Ya podemos hacer altas, bajas, modificaciones, nos falta el reporte de los datos para verlo en pantalla o
mandarlo a la impresora, en este caso vamos a imprimir todos los artículos listados dados de alta.
Primeramente debemos colocar tres controles del cuadro de herramientas sobre el formulario
“productos”: El primero será un “PrintDialog”, el segundo será un “PrintDocument”, y el tercero un
“PrintPreviwDialog”, los configuraremos asi como se muestra en la figura:
Es importante fijarnos que la propiedad “document” apunta a al control documento, pues bien,
documento contendrá la información que se mandará a la impresora, este control es que debemos
Aureliux Página 27
codificar, el control “impresora” nos mostrará un cuadro de diálogo que nos permitirá seleccionar la
impresora en la que queremos imprimir, asi como el número de copias, etc.., y por último “contenido”
nos mostrará una vista preliminar del documento antes de imprimirlo.
Antes de continuar debemos hacer una clase que nos permita hacer todo el trabajo de la impresiones,
se podrían utilizar algunas herramientas como CrystalReports o el generador de reportes que trae por
defecto visual studio que nos liberaría de código, pero repito que yo voy a enseñar este método que me
ha funcionado, si alguien quiere implementar sus métodos de reportear debe funcionar perfectamente
con este ejemplo.
Agreguemos una nueva clase a la que le llamaremos “reporte.vb”, primeramente declaremos las
variables que queremos utilizar:
Aureliux Página 28
Explicar el código sería muy extenso así que si quieres saber como funciona cada instrucción vas a tener que
investigar por tu cuenta, pero funciona a la perfección.
Aureliux Página 29
Ya inicializamos la impresión, pero no la hemos mandado a la impresora, para ello debemos ahora
codificar el evento PrintPage y colocamos el siguiente código:
Ahora para poder ver el reporte debemos codificar el botón “Imprimir” colocando el siguiente código:
o Busquedas (Consultas)
Para este ejemplo vamos a hacer una búsqueda por nombre, es decir que cuando se teclee el nombre
que lo busque en los datos de la tabla, para eso primeramente vamos a modificar un poquito nuestro
formulario añadiendo un TextBox y un Label, de tal manera que quede como se muestra en la figura (Al
TextBox lo llameremos “nameProduct”)
Antes de dontinua debemos agregar un método a nuestra clase “adminDatabase” que permita buscar
por medio del nombre:
De regreso a nuestro formulario “productos”, vamos a hacer nuestra búsqueda de tal manera que
cuando se vaya tecleando el nombre del producto se vaya filtrando la tabla al mismo tiempo, para ello
debemos codificar el evento KeyUp de “nameProduct” colocando el siguiente código:
Listo hemos terminado nuestro sistema, con muchas carencias que en otros textos se irán
enriqueciendo.
Aureliux Página 30
Examen:
En base al texto anterior debes realizar un sistema de altas, bajas, modificaciones, consultas y
reportes del siguiente caso:
Una biblioteca desea tener el control de sus libros y de sus préstamos internos y externos de
libros, asi como un control de sus usuarios registrados.
Hacer un sistema que permita dar de alta los libros y los usuario, debe permitir buscar a los
libros por medio de su nombre lo mismo con los empleados.
Calificar:
Sistema 80%
Aureliux Página 31