01 abril 2008

El temido DataControl de Visual Basic 6

Si hay un control que casi nunca uso en Visual Basic porque va en contra de mis principios morales y la misma epistemología de mi quehacer en la programación de computadoras con Visual Basic 6.0, es el DataControl común y corriente. Yo le tengo terror por experiencias en el pasado: en una ocasión, cuando trabajé en Novacel, hice la prueba de accesar una base de datos guardada en un servidor ubicada en Zacapu, Michoacán desde un programita hecha con VB 6 en mi computadora en Tlaquepaque, Jalisco. El resultado fue desastroso: cada vez que le "picaba" al botón para avanzar a otro registro, el programa tardaba eternidades en mostrar los datos del registro en cuestión. Debido a esa ineficiencia, abandoné para siempre su uso y me puse a accesar datos con el ADO, cosa que se mostró muy eficiente (bueno, lo suficiente como para desquitar su uso en ese tipo de ambientes), tanto así que he dedicado muchos mensajitos de este blog a su uso desde VB 6.

Pero, en contra de mis convicciones morales, me metí a jugar un poco con él porque es probablemente la forma fácil de accesar una base de datos (aunque sea de Access97) desde Visual Basic 6, sobre todo para quienes apenas se están inmiscuyendo en el arte de la programadera. Bueno, después de todo este rollo chorero, voy a platicarles de un proyecto que hice con mis alumnos de 4TIA para ejemplificar su uso.

Antes que nada, encontré en internet un tutorial chiroliro que explica muy bien el uso del DataControl sin problemas. El único inconveniente para algunos es que está en inglés. Esta es la liga, por si les interesa.

Ahora sí, les platico de qué trata el proyecto (que puedes bajar aquí). En primer lugar, hice una base de datos en Access, llamada Datos.mdb, que contiene una tabla, Direcciones, que contiene 8 campos: NoPersona (llave primaria de tipo autonumérico), Nombre, ApellidoP, ApellidoM, Domicilio, CP, Ciudad y Tel (todos de tipo texto). Esta figura tiene lavista diseño de la tabla:


El DataControl tiene problemas con archivos de Access de versiones superiores al 97 (VB 6 salió al mercado mucho antes que el Access 2000), así que convertí la base de datos a una de formato 97, llamada Datos97.mdb. Para hacer esto, en Access accesas (valga la redundancia) el menú Herramientas-Utilidades de la base de datos-Convertir base de datos-A formato de archivo Access 97. Esto lo puedes ver en la siguiente figura:


Aparece la siguiente ventana donde escribes el nombre del archivo en formato 97. Te recomiendo que lo guardes en la misma carpeta donde vas a guardar el proyecto que estamos creando.


¡Listo! Ahora voy a crear una nueva aplicación VB6 con una ventana (en mi caso se llama frmDatos) que tiene algunas etiquetas que contienen texto de ayuda (del Label1 al Label7), cajas de texto para guardar los datos de la tabla (en este caso se llaman txtNombre, txtPaterno, txtMaterno, txtDomicilio, txtCP, txtCiudad y txtTel), un DataControl (Data1) y 4 botones (btnNuevo, btnAnt, btnSig y btnBuscar) para realizar diferentes funciones del programa. La ventana en la vista diseño se ve así:


Hay algunas propiedades que se tienen que establecer para que esto funcione, para vincular Data1 con la tabla Direcciones de mi base de datos Datos97.mdb, y vincular las cajas de texto con Data1. En primer lugar, las propiedades que tengo que modificar en Data1 son estas: Connect que dice el tipo de archivo (hay que dejarlo como Access), DatabaseName que debe contener la ruta al archivo Datos97.mdb, y RecordSource que tiene que contener el nombre de la tabla (en mi caso, Direcciones).

Una vez que Data1 tiene estas propiedades establecidas, se tienen que alterar algunas propiedades de las cajas de texto. La primera que hay que establecer es la propiedad DataSource que guarda el DataControl al que estará vinculado. En mi caso, le pongo el valor de Data1. Después, en la propiedad DataField aparece la lista de campos de la tabla. Allí hay que seleccionar al que va a estar vinculado. Con esto, mi programa ya es funcional y al correrlo se ve así (en mi caso ya tengo datos dados de alta y por eso aparecen en las cajas de texto):


Lo primero que voy a programar es el botón que permita dar de alta un nuevo registro. Para esto, uso la función Data1.Recordset.AddNew y asunto arreglado. Abajo está el código:


Esto hace que todas las cajas de texto aparezcan en blanco y le permiten al usuario teclear datos allí. Al terminar de escribir cada campo, los datos se almacenan en un nuevo registro en tu tabla.

Aunque el DataControl ya tiene botones para avanzar al primer registro, al anterior, al siguiente y al último, voy a programar botones que realicen algunas funciones. Para empezar, voy a programar el botón que te lleva al registro anterior. Lo primero que hago es revisar si no estoy al principio del archivo (esto me lo indica la propiedad BOF que es un acrónimo de Beginning Of File). Si no estoy allí, me muevo al registro anterior (Data1.Recordset.MovePrevious). Si alguien está en BOF, todas las cajas de texto aparecen en blanco y el usuario podría llenar datos para dar de alta un nuevo registro. Para evitar ver cajas en blanco, me posiciono en el siguiente registro (Data1.Recordset.MoveNext o también podría haber usado Data1.Recordset.MoveFirst). Aquí está el código:


La función que avanza al siguiente registro se programa casi igual, solo que en lugar de revisar el BOF, se revisa el EOF que indica cuando estoy al final del archivo (End Of File). Este es el código:


Buscar un dato tiene un poquito más de chiste. Para esto, se usa la función FindFirst (o FindeNext, FindPrevious ó FindLast). La sintaxis de cualquiera de los Finds es esta: Data1.Recordset.FindFirst "campo=valor" (suponiendo que mi DataControl se llama Data1). Por ejemplo, podríamos escribir Data1.Recordset.FindFirst "NoPersona=2" para encontrar el primer registro de una persona cuyo número de registro sea 2. En mi caso, como estoy trabajando con cadenas de texto (voy a buscar solamente por el nombre del fulandango), uso la instrucción LIKE para encontrar cadenas de texto similares a la que escriba el usuario. Para mayor información de la manera en que funciona el LIKE de SQL, escribí este artículo hace tiempo que lo explica mejor, pero a grandes rasgos el LIKE es como el signo igual (=) y al final pongo un apóstrofe (') seguido de un asterisco (*), un espacio, el signo ampersand (&) para unir cadenas, la cadena que se quiere comparar (usé también la función Trim que elimina espacios en blanco antes y después de una cadena), seguido por un espacio, otras comillas, otro asterisco, otra comilla y asunto arreglado. Los asteriscos representan cualquier cadena, incluso una cadena vacía, así que si le escribo en el InputBox que pide el nombre del tipejo la palabra "José", me va a encontrar el primer José, José Antonio, Juan José, etc. Aquí está el código de la función:


Creo que lo demás está más o menos fácil de hacer. Después subiré el proyecto de un juego de Trivia hecha con el DataControl, pero por lo pronto aquí le dejamos. ¡Hasta la próxima!

5 comentarios:

Unknown dijo...

Hey esta buenisimo este simple ejemplo muchas gracias por aportar y si tienes de ADO con VB 6.0 seria excelente.

Tony Valderrama dijo...

En efecto, busca en los temas de mi blog lo relacionado a SQL y luego el de ADO.

¡Saludos!

Unknown dijo...

HEY , MIL GRACIAS!!

Anónimo dijo...

ehy men no me funciona el btnbuscar....si podes volver a escribir el cd o mandelo a juanrojasm21@gmail.com te lo agradeceria

rgeek dijo...

Gracias colega!!! me has sacado de un apuro con tu conocimiento, sigue compartiendo!

El Tony y sus ondas...

Related Posts Plugin for WordPress, Blogger...