You are on page 1of 29

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

4.4 Preparando la conexin a la base de datos. - 4.4.1 Objeto Recordset. - 4.4.1.1 Propiedades del objeto Recordset. - 4.4.1.2 Manejo de cursores. - 4.4.1.3 Control de concurrencia. - 4.4.1.4 Lectura de los campos de un Recordset. - 4.4.1.5 Moverse por los registros de un Recordset. - 4.4.1.6 Modificacin de registros en un Recordset. - 4.4.1.7 Eliminar el registro activo del Recordset. - 4.4.1.8 Insercin de registros en el Recordset. - 4.4.1.8 Establecer y leer la posicin de un registro en el Recordset. - 4.4.1.9 Ordenacin de los registros de un Recordset. - 4.4.1.10 Bsqueda de registros. - 4.4.1.11 Verificar el estado del Recordset. - 4.4.2 Eventos del objeto Recordset. - 4.4.2.1 Sucesos de recuperacin de datos. - 4.4.2.2 Sucesos de navegacin. - 4.4.2.3 Sucesos de modificacin de datos. - 4.4.3 Generacin de reportes.

4.4 PREPARANDO LA CONEXIN A LA BASE DE DATOS Al principio de este captulo mencione que la principal herramienta tecnolgica que utilizaramos en este libro para conectar a una base de datos sera ADO. Esto es, porque considero que es la herramienta ms completa y potente de la que dispone Visual Basic para conectar a un origen de datos. El modelo de datos ADO dispone de un objeto llamado CONNECTION que permite establecer una conexin a un origen de datos que puede ser una base de datos, un origen ODBC o cualquier otro origen que disponga un proveedor OLE. El objeto Connection le permitir especificar todos los parmetros necesarios antes de abrir una base de datos. Cmo establecer la conexin Para establecer la conexin el objeto Connection dispone del mtodo Open, seguida de los parmetros necesarios para la conexin. Su sintaxis es: Open [ConnectionString], [UserID], [Password], [Options] El primer argumento ConnectionString representa una serie de parmetros necesarios para establecer la conexin a la base de datos. Estos parmetros son por ejemplo, el proveedor ODBC, el nombre de la base de datos, el nombre de usuario, la contrasea y el nombre del servidor. Ejemplo 1: Dim cn As New ADODB.Connection Linea necesaria para establecer la conexin.

cn.Open Provider=Microsoft.Jet.OLEDB.4.0; & Data Source=c:\clientes.mdb El cdigo del ejemplo anterior abre una base de datos llamada clientes.mdb que se encuentra en el disco local C, mediante el proveedor ODBC Microsoft.Jet.OLEDB.4.0 que permite conectar a bases de datos de Access 2000 y Access 97 sin ningn problema.

LECCION 4.3 Conectando BD en VB6

Pgina 1

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


Ejemplo 2: Dim cn As New ADODB.Connection cn.Open Provider=SQLOLEDB; & Server=ServerNT; & User ID=jose;Password=abc; _ & Data Source=empleados El cdigo del ejemplo anterior abre una base de datos llamada empleados que se encuentra en un servidor denominado ServerNT. Tambin especificamos el nombre y la contrasea de usuario. Los argumentos UserID y Password son opcionales. Estos no deben especificarse si lo escribe directamente en el argumento ConnectionString, tal y como lo vemos en el segundo ejemplo. El argumento opcional Options determina si este mtodo debe volver despus o antes de que la conexin se establezca. Este argumento puede tomar los valores -1-adConnectUnspecified (Valor por defecto), que abre una conexin sncrona con la base de datos y el valor 16-adAsyncConnect abre una conexin asncrona con la base de datos. Una conexin sncrona indica que Visual Basic no ejecutar la instruccin que sigue al mtodo Open hasta que se establezca la conexin, en consecuencia la aplicacin no responder a los eventos del usuario. Por otro lado, una conexin asncrona, permite que el usuario trabaje con el programa aun la conexin no se halla establecido. Y lo mejor de todo, permite informar el estado en que se encuentra la conexin. Este tipo de conexin ser el caso de estudio en otra seccin de este mismo capitulo, mientras tanto, trabajaremos con conexiones sncrona. Este son algunos de los argumentos que podr utilizar en el atributo ConnectionString al momento de abrir una conexin. Argumento Data Source Descripcin El nombre del servidor SQL o el nombre de la base de datos MDB a la que se desee conectar. Cuando se conecte a un origen ODBC, este argumento puede ser tambin el nombre de un origen de datos (DSN). Nombre del origen ODBC registrado en la mquina actual; este argumento puede sustituir al argumento Data Source. Archivo que contiene informacin sobre la conexin; este argumento puede ser un archivo ODBC DSN o un archivo Microsoft Data Link (UDL). Nombre de la base de datos predeterminada sobre la conexin. Cuando se conecte a un origen de datos ODBC, tambin podr utilizar el argumento Database. Contrasea del usuario. Cuando se conecte a un origen ODBC, podr utilizar el argumento PWD. No tendr que pasar su ID y contrasea de usuario si se est conectando a un servidor SQL y utiliza seguridad integrada. True si ADO almacena el ID y la contrasea de usuario en el vnculo de datos. Nombre de un proveedor OLE; el valor predeterminado es MSDASQL, el proveedor para orgenes ODBC. Nombre del usuario. Cuando se conecte a un origen ODBC, podr utilizar en su lugar el argumento UID.

DSN

FileName

Initial Catalog

Password

Persist Security Info Provider

User ID

Hasta ahora usted esta en la capacidad de realizar una conexin a una base de datos y nada ms. Necesita ahora conocer la forma en que puede obtener los datos que se encuentran en la base de datos y mostrarlos en cajas de texto, en un DataGrid o en otro control en la que se puede mostrar datos. En la siguiente seccin veremos la forma de hacer esto y al finalizarla crearemos nuestra primera aplicacin de base de datos.

LECCION 4.3 Conectando BD en VB6

Pgina 2

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


- 4.4.1 Objeto Recordset Adems del objeto Connection, ADO posee un objeto denominado Recordset, que contiene todos los datos que se leer de una base de datos o que enviar a la misma. Un Recordset puede incluir varias filas y columnas de datos. Cada fila es un registro y cada columna es un campo del registro. Slo podr acceder simultneamente a una fila, la denominada fila actual o registro actual. Podr examinar un Recordset modificando el registro actual. - 4.4.1.1 Propiedades del objeto Recordset Posiblemente la propiedad ms importante del objeto Recordset es la propiedad Source que contiene el nombre de la tabla, el nombre del procedimiento almacenado o el texto de una consulta SQL utilizada para llenar el Recordset. Para cargar un Recordset usted debe realizar tres pasos que son realmente necesarios, el primero, es crear el objeto Recordset, lo segundo es, indicar la fuente de datos que alimentar al objeto Recordset, tercero, abrir el Recordset con el mtodo Open y llenar el Recordset con un texto de una consulta SQL. A continuacin, se muestran algunos ejemplos de cmo abrir una base de datos y un Recordset. Ejemplo 1: Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Creamos el objeto Connection. Creamos el objeto Recordset.

Abrimos la base de datos ventas.mdb. cn.Open Provider=Microsoft.Jet.OLEDB.4.0; & Data Source=c:\ventas.mdb rs.Source = clientes Especificamos la fuente de datos. En este caso la tabla clientes.

rs.Open select * from clientes, cn Abrimos el Recordset y lo llenamos con la consulta SQL. En este ejemplo creamos el objeto Connection y luego creamos el objeto Recordset. Luego abrimos la base de datos utilizando el mtodo Open del objeto Connection, tal y como vimos anteriormente. En la cuarta lnea de cdigo especificamos el origen de los datos, que en este caso es la tabla clientes de la base de datos ventas.mdb. Por ltimo, utilizamos el mtodo Open del objeto Recordset para abrirlo. El texto select * from clientes es una consulta SQL que permite seleccionar todos los registros de la tabla. En este caso el Recordset se llenar con todos los registros de la tabla clientes. Ejemplo 2: (Otra forma de abrir el Recordset) Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset Creamos el objeto Connection. Creamos el objeto Recordset.

Abrimos la base de datos ventas.mdb. cn.Open Provider=Microsoft.Jet.OLEDB.4.0; & Data Source=c:\ventas.mdb rs.Source = clientes rs.ActiveConnection = cn Especificamos la fuente de datos. En este caso la tabla clientes. Activa la conexin asocindolo a la conexin existente.

rs.Open select * from clientes Abrimos el Recordset y lo llenamos con la consulta SQL.

En este ejemplo se omite el parmetro de conexin en el mtodo Open por la propiedad ActiveConnection del objeto Recordset.

LECCION 4.3 Conectando BD en VB6

Pgina 3

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

Ejemplo 3: (Otra forma es abrir la base de datos de forma implcita) Dim rs As New ADODB.Recordset Creamos el objeto Recordset.

Activamos y especificamos lo parmetros de la conexin en el objeto Recordset. rs.ActiveConnection = Provider=Microsoft.Jet.OLEDB.4.0; & Data Source=c:\ventas.mdb rs.Source = clientes Especificamos la fuente de datos. En este caso la tabla clientes.

rs.Open select * from clientes Abrimos el Recordset y lo llenamos con la consulta SQL. - 4.4.1.2 Manejo de cursores Un cursor es un conjunto de registros que constituyen el resultado de una consulta. Los cursores son necesarios definirlo para indicar el comportamiento y la funcionalidad disponibles de los registros en el Recordset. Para definir el tipo de cursor debe indicar donde se debe almacenar los cursores, en la estacin de trabajo (cliente) o en el servidor. Tambin debe especificar el tipo del cursor y la opcin de bloqueo. La propiedad CursorLocation del objeto Recordset permite definir el lugar donde se almacenarn los cursores. Esta propiedad puede tomar los valores 2-adUseServer (valor por defecto) o 3-adUseClient. El valor 2adUseServer es el predeterminado para cuando este trabajando con el Proveedor OLE DB para controladores ODBC y para SQL Server, es un cursor de slo avance creado en el servidor. Este tipo de cursor del lado del servidor es el ms eficaz debido a que ofrecen un mejor rendimiento y ms tipos de cursores. Los cursores del lado del cliente son frecuentemente utilizados cuando tiene un control DataGrid u otro control complejo que est unido al Recordset. Al definir un cursor, tambin deber especificar el tipo de cursor con la propiedad CursorType que comunica el tipo de cursor que debera crearse en el servidor o en el cliente. Los distintos tipos que se puede crear son: ForwardOnly (Slo hacia delante). Static (Esttico). Keyset (Conjunto de clave). Dynamic (Dinmico). El cursor ForwardOnly (Slo hacia delante): Un cursor ForwardOnly (Slo avance) esta disponible solo del lado del servidor. Es el cursor ms simple que existe. Slo permite desplazamiento hacia delante y al abandonar un registro ste deja de estar disponible, esto hace que sea el cursor ms rpido e ideal para operaciones dnde debemos abrir un conjunto de registros e ir haciendo una lectura secuencial hasta llegar al final. Un ejemplo tpico es llenar una lista de opciones con los valores de una tabla. Al abrir un cursor de este tipo se leen un numero de registros y se pasan a la cach (en funcin del valor de la propiedad CacheSize), y a medida que se va avanzando por el cursor, ADO recupera el conjunto siguiente de registros. Este tipo de cursor es realmente eficiente si define la propiedad LockType a adReadOnly y CacheSize igual a 1. Este tipo de cursor se define con el valor 0-adOpenForwardOnly en la propiedad CursorType del Recordset. El cursor Static (Esttico): Un cursor esttico es muy similar a un cursor slo hacia delante, con la salvedad de que admite desplazamiento en todas las direcciones (MoveFirst, MovePrevious, MoveNext, MoveLast y Move), el propio motor de ADO recuperar en la cach los registros que necesite al desplazarnos por el mismo.

LECCION 4.3 Conectando BD en VB6

Pgina 4

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


El comportamiento de este cursor no muestra los cambios realizados por otros usuarios a los datos de los registros del cursor, de la misma forma que no muestra los registros aadidos ni eliminados, es por ello que se denomina esttico. Este es el nico cursor posible del lado del cliente y no tendr que definirlo si pasa el valor 2adUseClient a la propiedad CursorLocation. Aunque estos cursores son menos eficaces que los cursores de slo avance y aumentan la carga de trabajo del sistema en el que residen, su rendimiento es razonable y suelen ser una buena opcin, especialmente cuando el Recordset no incluye demasiados registros. Los cursores estticos suelen ser la mejor opcin para recuperar datos de un procedimiento almacenado. Utilice este tipo de cursores cuando la estacin de trabajo cliente cuente con suficiente memoria. Este tipo de cursor crea asignando el valor 3-adOpenStatic en la propiedad CursorType del objeto Recordset.

El cursor Keyset (Conjunto de clave): Los cursores Keyset (conjunto de clave) son los cursores ms potentes y ms complejos de la dispone un programador. Bsicamente su comportamiento permite tanto actualizar los datos como ver los cambios que los otros usuarios puedan hacer en los registros del cursor, pero se provocar un error si accede a un registro que otro usuario haya borrado. Lo que no permite ver son registros aadidos por otros usuarios a la base de datos. El cursor Keyset (conjunto de clave) slo est disponible como cursor del lado del servidor. Este tipo de cursor se crea asignando el valor 1-adOpenKeyset en la propiedad CursorType del objeto Recordset. El cursor Dynamic (Dinmico): El cursor dinmico es muy parecido a cursor de conjunto de claves. La diferencia est en que cada vez que el cliente solicita otro conjunto de registros el conjunto de claves se vuelve a crear antes de devolver estos registros. Esto provoca que si abrimos un conjunto de registros dinmico y contamos el nmero de registros, luego nos desplazamos secuencialmente hasta el final y volvemos a contar el nmero de registros, no tiene por que ser el mismo ya que otros usuarios pueden haber insertado registros. No resulta sorprendente que estos cursores sean los ms exigentes desde el punto de vista del rendimiento y del trfico en la LAN porque, cada vez que se desplaza a otro registro, se necesita realizar un viaje hasta el servidor para recuperar los valores actuales. Este tipo de cursor slo se encuentra disponible del lado del servidor. Prueba de rendimiento A continuacin, se muestra una prueba de rendimiento encontrada en la Web donde se puede apreciar la potencia de cada tipo de cursor: La prueba se hizo en una maquina con las siguientes caractersticas: Pentium 4 a 2,8 GHz con 512 Mb RAM Windows 2000 PRO + SP 4 SQL Server 2000 + SP 3 VB 6.0 + SP 5 MDAC 2.7

La consulta fue la siguiente: SELECT * FROM Historico (selecciona todos los registros de la tabla Historico de 22 columnas con clave principal INT IDENTITY, con 567.430 registros). Al abrir el RecordSet y leerlo hasta el final utilizando cada cursor obtuvimos los siguientes datos: Tipo de cursor ForwardOnly Duracin de la consulta (en segundos) 6,02

LECCION 4.3 Conectando BD en VB6

Pgina 5

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


Static KeySet Dynamic Static (extremo cliente) 65,48 90,13 89,84 39,00

- 4.4.1.3 Control de concurrencia El control de concurrencia consiste en un conjunto de estrategias de bloqueo que utilizan los programadores para evitar que varios usuarios que acceden simultneamente a una base de datos modifiquen al mismo tiempo un determinado registro. Los bloqueos son extremadamente necesarios para no crear bases de datos inconsistentes. Dependiendo de la forma en que desarrolle sus aplicaciones, un bloqueo puede disminuir de forma significativa el rendimiento de su aplicacin, y puede, incluso, provocar errores fatales si no genera una buena estrategia de resolucin de bloqueo. Cuando se bloquea un registro que esta siendo modificado ningn usuario podr acceder a dicho registro. Mediante la propiedad LockType (tipo de bloqueo) del objeto RecordSet usted podr indicar el tipo de bloqueo que se va a utilizar sobre los datos de la base de datos. Esta propiedad puede tomar los siguientes valores: 1adLockReadOnly, 2-adLockPessimistc, 3-adLockOptimistic y 4-adLockBatchOptimistic. El valor 1-adLockReadOnly (bloqueo de solo lectura) es el predeterminado por ADO, que crea arreglos no actualizables. Es la opcin ms eficaz porque no impone sobre los datos un bloqueo de escritura. El valor 2adLockPessimistic (bloqueo pesimista), ADO bloquea el registro inmediatamente un usuario lo este modificando. El registro estar bloqueado hasta que se ponga en marcha el mtodo Update del objeto Recordset. Mientras el registro este bloqueado ningn otro usuario podr acceder al mismo para escribir en l, lo que reduce severamente la posibilidad de escalar la aplicacin. El valor 3-adLockOptimistic (bloqueo optimista) tiene un mejor comportamiento que el bloqueo pesimista, pero requiere que el programador este ms atento. Con el bloqueo optimista, ADO bloquea el registro actual slo cuando est siendo actualizado lo que, normalmente, tardar slo un pequeo intervalo de tiempo. El valor 4-adLockBatchOptimistic (bloqueo optimista diferido) es un modo especial de bloqueo que slo esta disponible para los cursores estticos del lado del cliente. En los bloqueos optimistas diferidos, descargar todos los datos en la mquina cliente, permitir que el usuario realice todas las modificaciones necesarias y, posteriormente, enviar todos los cambios en una nica operacin. Los bloqueos optimistas son la mejor opcin si decide trabajar con cursores del lado del cliente debido a que disminuyen el trfico en la red. El nico problema de este tipo de bloqueo es que los usuarios podrn acceder a un mismo registro que esta siendo usado, lo que obligar a que usted desarrolle una estrategia para evitar este y otros tipos de conflictos. - 4.4.1.4 Lectura de los campos de un Recordset Los nombres de los campos y los valores de cada capo del registro actual se almacenan en la coleccin Fields del objeto Recordset. Para leer uno o varios campos del registro actual deber pasar un ndice numrico o el nombre del campo, tal y como se muestra en el siguiente ejemplo: Supngase que tenemos una base de datos llamada agenda y dentro de esta tenemos una tabla llamada contactos. La tabla contactos esta compuesta por los campos nombre, apellido, telfono y direccin. Para leer cada uno de los campos del registro actual del objeto Recordset escribimos un cdigo similar al que se muestra a continuacin: Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset 'Creamos el objeto Connection. 'Creamos el objeto Recordset.

'Abrimos la base de datos "agenda.mdb". cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=c:\agenda.mdb" rs.Source = "contactos" 'Especificamos la fuente de datos. En este caso la tabla "contactos". rs.CursorType = adOpenKeyset 'Definimos el tipo de cursor. rs.LockType = adLockOptimistic 'Definimos el tipo de bloqueo.

LECCION 4.3 Conectando BD en VB6

Pgina 6

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

rs.Open "select * from contactos", cn 'Abrimos el Recordset y lo llenamos con una consulta SQL. Agregamos los campos del registro actual al control ListBox. List1.AddItem rs.Fields(0) & & rs.Fields(1) & & rs.Fields(2) & & rs.Fields(3) En el ejemplo anterior agregamos el primer registro del Recordset al control ListBox, debido a que es el primer registro seleccionado cuando cargamos por primera vez el Recordset. Los valores dentro de los parntesis representan los campos o los valores de cada campo de la tabla. En la coleccin Fields el orden de los campos comienzan por cero. En nuestro caso, el valor 0 representa el primer campo, es decir, el nombre, el valor 2 el apellido, y as sucesivamente. Otra forma de leer los valores de cada campo es especificando el nombre del campo en vez de un nmero, por ejemplo: List1.AddItem rs.Fields(nombre) & & rs.Fields(apellido) & & rs.Fields(telefono) & _ & rs.Fields(direccion) Los valores de cada campo del registro seleccionado se almacena en la propiedad Value de la coleccin Fields, aunque este no es necesario especificarlo debido a que es el valor predeterminado por ADO. Por ejemplo, el cdigo explicito para leer los valores de cada campo sera: List1.AddItem rs.Fields(nombre).Value & & rs.Fields(apellido).Value & & _ rs.Fields(telefono).Value & & rs.Fields(direccion).Value La coleccin Fields tambin permite leer el nombre de cada campo del registro actual. Esto es posible mediante la propiedad Name. Por ejemplo, si se quiere agregar al ListBox el nombre del campo y su valor al lado hacemos lo siguiente: List1.AddItem rs.Fields(0).Name & = & rs.Fields(0).Value & & rs.Fields(1).Name & = & _ rs.Fields(1).Value & & rs.Fields(2).Name & = & rs.Fields(2).Value & & rs.Fields(3).Name & _ = & rs.Fields(3).Value Si no conoce el nmero de campos que contiene el registro puede utilizar la propiedad Count para leer cada uno de los campos, ejemplo: Dim i As Long For i = 0 To rs.Fields.Count - 1 List1.AddItem rs.Fields(i).Name & "=" & rs.Fields(i).Value Next i Si queremos leer todos los registros hasta el final del Recordset tendremos que consultar la propiedad EOF (fin del archivo) y asociarla a un bucle para repetir hasta que se lean todos los registros, ejemplo: rs.MoveFirst Do Until rs.EOF 'Nos posicionamos en el primer registro del Recordset. 'Repite hasta que se lea todo el Recordset.

List1.AddItem rs.Fields(0) & " " & rs.Fields(1) & " " & rs.Fields(2) & " " & rs.Fields(3) rs.MoveNext Loop 'Nos movemos al siguiente registro.

LECCION 4.3 Conectando BD en VB6

Pgina 7

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


Despus de haber visto las distintas formas de cmo abrir una base de datos y la forma de explorar los registros de un Recordset estamos lista para hacer nuestros primeros ejercicios con ADO. En nuestro primer ejercicio crearemos una base de datos en MS Access donde almacenaremos el nombre, apellido, telfono y direccin de nuestros contactos. La base de datos llevar por nombre agenda y la tabla se llamar contactos. Para realizar este ejercicio tendremos que utilizar MS Access aunque supongo que tiene los conocimientos bsicos de este SGBD explicar detalladamente los pasos para crear la base de datos. Iniciemos Access haciendo clic en el men Inicio Programas Microsoft Office Microsoft Access. En algunas maquinas solo tendremos que realizar tres pasos: Inicio Programas Microsoft Access. Al iniciar Access aparecer la siguiente pantalla:

Haga clic en Base de datos en blanco. Aparecer una ventana solicitando el nombre de la base de datos. El nombre por defecto es bd1, borre ese nombre y escriba c:\agenda. Escribimos c:\ para que la base de datos se almacene en el disco local c. Aparecer una ventana con tres opciones: Crear una tabla en vista de diseo, Crear una tabla utilizando el asistente y Crear una tabla introduciendo datos. De estas tres opciones las que nos interesa es la primera. Haga clic sobre la primera opcin Crear una tabla en vista de diseo. Aparecer la ventana que nos permitir crear la tabla de la base de datos. Esta ventana esta compuesta por tres columnas y la seccin de propiedades de los campos. En la primera columna especificaremos el nombre de

LECCION 4.3 Conectando BD en VB6

Pgina 8

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


los campos de la tabla y en la segunda columna el tipo de datos para cada campo. En la columna descripcin no especificaremos nada.

En la primera columna escriba: Nombre del campo Nombre Apellido Telefono Direccion Correo En la segunda columna seleccione los siguientes tipos de datos: Tipo de datos Texto Texto Texto Texto Texto Algunas versiones de Access agregan automticamente el tipo de dato Texto a los campos agregados a la tabla. Si la versin de Access agrega el tipo de datos Texto no tendr que especificarlo. Si no esta familiarizado con lo que estamos haciendo les recomiendo un curso bsico de base de datos. De todos modos les explico: estamos creando la tabla de la base de datos especificando los campos y el tipo de datos para cada campo. Ahora estamos listos para almacenar la tabla en la base de datos. Haga clic en el botn guardar de la barra de herramientas estndar. Aparecer un cuadro solicitando el nombre de la tabla:

LECCION 4.3 Conectando BD en VB6

Pgina 9

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

Borre el texto Tabla1 y escriba Contactos. Luego haga clic en el botn Aceptar. Access les preguntar si desea crear una clave principal. Conteste que No. La tabla se agregar en la ventana de objetos:

Haga doble clic en la tabla Contactos. Access les mostrar la tabla para que usted agregue registros a la misma. En nuestro caso agregaremos cuatro registros a la tabla para que pueda ver cmo podemos visualizarlos y modificarlos desde Visual Basic. No piense que utilizaremos Access para agregar informacin a la tabla, esto lo haremos desde nuestra aplicacin en Visual Basic. En nuestro caso hemos agregado informacin (registros) para que observe como se puede navegar por la base de datos desde una aplicacin en Visual Basic. Complete la tabla con los siguientes registros:

LECCION 4.3 Conectando BD en VB6

Pgina 10

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


Ahora que hemos agregado informacin en la tabla, haga clic en el botn Guardar. Los datos sern almacenados en la tabla. Despus de esto, cierre el programa Access. Diseemos ahora nuestra aplicacin en Visual Basic para leer nuestra base de datos. Abra un nuevo proyecto. Haga clic en el men Project (Proyecto). Seleccione la opcin References (Referencias). Aparecer la ventana de referencias:

Busque la referencia ActiveX Data Objects 6.0 Library y seleccinela. A continuacin, haga clic en el botn OK. Esto que estamos haciendo es necesario para poder utilizar ADO desde nuestra aplicacin. Si no tiene la versin ActiveX Data Objects 6.0 Library seleccione la versin ms actual o la mayor. Inserte una ListBox y un botn de comando en el formulario:

LECCION 4.3 Conectando BD en VB6

Pgina 11

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


En el evento Click del botn Mostrar registros escriba: Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset 'Creamos el objeto Connection. 'Creamos el objeto Recordset.

'Abrimos la base de datos "agenda.mdb". cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=c:\agenda.mdb" rs.Source = "contactos" 'Especificamos la fuente de datos. En este caso la tabla "contactos". 'Definimos el tipo de cursor. 'Definimos el tipo de bloqueo.

rs.CursorType = adOpenKeyset rs.LockType = adLockOptimistic

rs.Open "select * from contactos", cn 'Abrimos el Recordset y lo llenamos con una consulta SQL.

rs.MoveFirst Do Until rs.EOF

'Nos posicionamos en el primer registro del Recordset. 'Repite hasta que se lea todo el Recordset.

List1.AddItem rs.Fields("nombre") & " " & rs.Fields("apellido") & " " & rs.Fields("telefono") & " " _ & rs.Fields("direccion") & " " & rs.Fields("correo") rs.MoveNext Loop 'Nos movemos al siguiente registro.

Corra la aplicacin. Haga clic en el botn Mostrar registros. Si todo esta bien, se mostrarn en la ListBox todos los registros que se agregaron en Access. Detenga la aplicacin y gurdela con los nombres FormEjercicio1-8 para el formulario y Ejercicio1-8 para el proyecto. - 4.4.1.5 Moverse por los registros de un Recordset Una forma ms elegante y profesional para visualizar los registros de un Recordset es moverse por el Recordset cada vez que sea necesario, es decir, avanzar o retroceder uno o varios registros. Para tal fin, el objeto Recordset dispone de los mtodos MoveFirst (mueve al primer registro), MovePrevious (mueve al registro anterior), MoveNext (mueve al siguiente registro) y MoveLast (mueve al ltimo registro). Para que pueda entender el correcto funcionamiento de estos mtodos crearemos una aplicacin que contendr cuatro botones de comando que permitirn desplazarse por cada uno de los registros del Recordset. Para crear nuestra segunda aplicacin haga lo siguiente: Abra un nuevo proyecto. Haga clic en el men Project (Proyecto) y ejecute la opcin References (Referencias). En el cuadro que aparece busque la referencia ActiveX Data Objects 6.0 Library y seleccinela. A continuacin, haga clic en el botn OK. Si no tiene la versin ActiveX Data Objects 6.0 Library seleccione la versin ms actual o la mayor. Inserte cuatro etiquetas y al lado de cada etiqueta una caja de texto. Tambin, inserte cinco botones de comando en la parte inferior del formulario. Tal y como se muestra en la imagen de la siguiente pgina

LECCION 4.3 Conectando BD en VB6

Pgina 12

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

Establezca los valores necesarios para que los controles tengan la misma apariencia que la imagen anterior. Haga doble en cualquier parte del formulario y en la seccin general (no en el evento Load) escriba: Dim cn As New ADODB.Connection Private WithEvents rs As ADODB.Recordset 'Creamos el objeto Connection. 'Creamos el Recordset con soporte de eventos.

Dentro del evento Load del formulario escriba: Set rs = New ADODB.Recordset 'Activamos el Recordset.

'Abrimos la base de datos "agenda.mdb" cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=c:\agenda.mdb" 'Especificamos la fuente de datos. En este caso la tabla "contactos". rs.Source = "contactos" rs.CursorType = adOpenKeyset 'Definimos el tipo de cursor. rs.LockType = adLockOptimistic 'Definimos el tipo de bloqueo. 'Abrimos el Recordset y lo llenamos con una consulta SQL. rs.Open "select * from contactos", cn rs.MoveFirst 'Nos movemos al principio del Recordset.

'Cargamos los datos en las cajas de texto. Text1.Text = rs.Fields("Nombre") 'Ponemos el nombre del registro actual. Text2.Text = rs.Fields("Apellido") 'Ponemos el apellido del registro actual. Text3.Text = rs.Fields("Telefono") 'Ponemos el telfono del registro actual. Text4.Text = rs.Fields("Direccion") 'Ponemos la direccin del registro actual. Text5.Text = rs.Fields("Correo") 'Ponemos el correo del registro actual. Dentro del evento Click del botn Primero escriba: 'Movemos al primer registro del Recordset. rs.MoveFirst Dentro del evento Click del botn Anterior escriba:

LECCION 4.3 Conectando BD en VB6

Pgina 13

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


'Verificamos si no estamos antes del principio del Recordset. If rs.BOF = False Then rs.MovePrevious 'Movemos al registro anterior. End If

Dentro del evento Click del botn Siguiente escriba: 'Verificamos si no estamos despus del ltimo elemento del Recordset. If rs.EOF = False Then rs.MoveNext 'Movemos al siguiente registro. End If

Dentro del evento Click del botn ltimo escriba: 'Movemos al ltimo registro del Recordset. rs.MoveLast

Dentro del evento Click del botn Salir escriba: rs.close cn.close Cerramos el Recordset. Cerramos la conexin.

'Salimos de la aplicacin. End

Ahora vamos a escribir el evento que ocurre cada vez que el usuario se mueve por el Recordset. Este es el evento MoveComplete (Movimiento completo). Este evento nos permite determinar si el usuario se movi a otro registro del Recordset para luego mostrarlo al usuario, ya sea en cajas de textos, en un grid o en un control Listview. Para crear nuestro evento MoveComplete haga doble clic en cualquier parte del formulario para cargar el editor de cdigo. Luego desplcese al final del editor de cdigo y haga clic en la zona blanca para colocar el punto de insercin o indicador y escriba: Private Sub rs_MoveComplete(ByVal adReason As ADODB.EventReasonEnum, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) 'Si estamos antes del principio del Recordset. If rs.BOF = True Then rs.MoveFirst 'Movemos al principio del Recordset. 'Si estamos despus del ultimo elemento del Recordset. ElseIf rs.EOF = True Then rs.MoveLast 'Movemos al final del Recordset. Else 'Si se cambio del registro actual del Recordset a otro. Text1.Text = rs.Fields("Nombre") 'Ponemos el nombre del registro actual. Text2.Text = rs.Fields("Apellido") 'Ponemos el apellido del registro actual. Text3.Text = rs.Fields("Telefono") 'Ponemos el telfono del registro actual. Text4.Text = rs.Fields("Direccion") 'Ponemos la direccin del registro actual.

LECCION 4.3 Conectando BD en VB6

Pgina 14

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


Text5.Text = rs.Fields("Correo") End If End Sub Corra la aplicacin. Utilice los botones para desplazarse por los registros de la base de datos. Detenga la aplicacin y gurdela con los nombres FormEjercicio2-8 para el formulario y Ejercicio2-8 para el proyecto. 'Ponemos el correo del registro actual.

- 4.4.1.6 Modificacin de registros en un Recordset La modificacin de un registro consiste en la actualizacin de uno o ms campos del registro que se encuentra cargado en el Recordset. Esto es posible mediante el mtodo Update del objeto Recordset que permite la actualizacin simultanea de varios registro, utilizando la siguiente sintaxis:

Update [Campos], [Valores] Campos: Este argumento es un tipo Variant que contiene el nombre de un campo, un ndice de campo o un array de nombres de campo o ndices. Valores: Este argumento es un tipo Variant que contiene un valor nico o un array de valores. En este se deben especificar los nuevos valores que sern establecidos en el argumento Campos. Ambos argumentos son opcionales, pero solo uno de ellos podr omitir. Si incluye ambos argumentos deber especificar los mismos nmeros de campos y valores en ambos argumentos. Por ejemplo, si va a modificar dos campos uno llamado Nombre y otro Apellido deber especificar los valores que tendrn ambos campos en el argumento Valores. El siguiente ejemplo muestra la forma en que usted puede actualizar varios campos utilizando la siguiente sintaxis: Actualizar cinco campos en una sola operacin. rs.Update Array(Nombre, Apellido, Telefono, Direccion, Correo), _ Array(Carlos, Rodrguez, 809-598-3696, Calle #6, Alma Rosa, carlos@gmail.com) rs.move 0 Hace que el registro se actualice. Al utilizar el mtodo Update el registro no se modifica inmediatamente hasta que se desplace a otro registro del Recordset o hasta que se emplee un mtodo como el utilizado en el ejemplo anterior. ADO dispone del mtodo CancelUpdate para cancelar una operacin de actualizacin que se halla realizado sobre un registro y dejarlo como estaba al principio. Si utiliza conjuntamente el mtodo Update con el mtodo CancelUpdate podr ofrecer al usuario la posibilidad de confirmar o cancelar las modificaciones realizadas sobre el registro activo: Si el registro aun no se ha modificado. If rs.EditMode = adEditInProgress Then Dim Respuesta Respuesta = MsgBox("Desea guardar los cambios realizados?", vbYesNo) If Respuesta = vbYes Then rs.Update

Actualizamos el registro.

LECCION 4.3 Conectando BD en VB6

Pgina 15

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


Else rs.CancelUpdate End If Practiquemos como actualizar un registro de nuestra base de datos agregando un botn de comando a nuestra aplicacin anterior. Escribe en la propiedad Caption el texto Actualizar. Dentro del evento Click del nuevo botn escriba: rs.Update Array("nombre", "apellido", "telefono", "direccion", "correo"), _ Array(Text1.Text, Text2.Text, Text3.Text, Text4.Text, Text5.Text) rs.Update 'Actualizamos el registro. 'Verificamos si no ocurri ningn problema. If rs.State = 1 Or rs.State = 0 Then MsgBox ("El registro se ha actualizado con xito.") Else MsgBox ("Ha ocurrido un error al actualizar el registro.") End If Cancelamos la actualizacin.

Ahora podr modificar los datos de cada campo y luego actualizarlo haciendo clic sobre el botn Actualizar. - 4.4.1.7 Eliminar el registro activo del Recordset Podr eliminar el registro actual cargado en el Recordset utilizando el mtodo Delete mediante la siguiente sintaxis: rs.Delete [AffectRecords] AffectRecords (Registros afectados) es opcional, si este se omite se borrar el registro actual. El argumento AffectRecords es utilizando cuando queremos borrar varios registros que resultan de una consulta realizada sobre la base de datos. Para borra el registro actual escriba: rs.Delete rs.MoveNext Nos movemos al siguiente registro para no provocar un error. If rs.EOF Then rs.MoveLast Si es el fin del archivo nos movemos al ltimo registro. - 4.4.1.8 Insercin de registros en el Recordset Para agregar nuevos registros al Recordset utilizamos el mtodo AddNew. Su empleo es bastante sencillo, tal y como se muestra en el siguiente ejemplo: rs.AddNew rs(nombre) = Juan rs(apellido) = Rodrguez rs.Update Llamamos el mtodo. Agregamos un nombre en el campo nombre. Agregamos un apellido en el campo apellido. Actualizamos.

En el ejemplo anterior hemos agregados los datos directamente para cada campo, pero puede almacenar los datos contenidos en cajas de texto, una variable u otro objeto. El siguiente ejemplo muestra como agregar un nuevo registro con valores obtenidos desde cajas de texto. rs.AddNew

LECCION 4.3 Conectando BD en VB6

Pgina 16

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


rs(nombre) = txtNombre.Text rs(apellido) = txtApellido.Text rs(telefono) = txtTelefono.Text rs(direccion) = txtDireccion.Text rs(correo) = txtCorreo.Text rs.Update Para el ejemplo anterior debe tener en cuenta que las cajas de texto estn etiquetadas en la propiedad Name con los nombres especificados. Si agregamos un botn de comando en nuestra aplicacin donde las cajas de texto tienen los nombres por defecto el cdigo entonces sera el siguiente: rs.AddNew rs(nombre) = Text1.Text rs(apellido) = Text2.Text rs(telefono) = Text3.Text rs(direccion) = Text4.Text rs(correo) = Text5.Text rs.Update - 4.4.1.8 Establecer y leer la posicin de un registro en el Recordset El objeto Recordset dispone de algunas propiedades que les ayudarn a saber en que lugar del Recordset se encuentra. Este es muy importante cuando quiera activar o desactivar ciertas operaciones o definir marcadores con el propsito de volver rpidamente a un registro que haya visitado. La primera propiedad a analizar es la propiedad EOF (End of file), que devuelve un valor verdadero cuando el puntero del registro actual se encuentra situado despus del final del Recordset. Esta propiedad es til cuando recorra todos los registros del Recordset utilizando un bucle: Contar todos los empleados que ganen mas de 15,000 pesos. rs.MoveFirst Nos movemos al principio del Recordset. Dim Contador As Long Do Until rs.EOF Repetimos hasta el final del Recordset. Verificamos el sueldo del registro actual. If rs(sueldo) > 15000 Then Contador = Contador + 1 rs.MoveNext Nos movemos al siguiente registro. Loop Otro ejemplo: Contar todos los empleados contratados antes del 1 de enero de 1994. rs.MoveFirst Nos movemos al principio del Recordset. Dim Contador As Long Do Until rs.EOF Repetimos hasta el final del Recordset. Verificamos la fecha de contrato del registro actual. If rs(FechaContrato) < #1/1/1994# Then Contador = Contador + 1 Nos movemos al siguiente registro. rs.MoveNext Loop

El objeto Recordset tambin dispone de la propiedad BOF (Begin of file) que es similar a la propiedad EOF. Esta devuelve un valor verdadero cuando el puntero del Recordset se encuentra antes del primer registro. Con frecuencia es crucial conocer los valores de la propiedad EOF y BOF, debido a que cuando una de ellas es True (verdadera), la mayora de los mtodos y propiedades devuelven un error porque no existe un registro actual. Por

LECCION 4.3 Conectando BD en VB6

Pgina 17

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


ejemplo, si trata de leer el valor de un campo de algn registro y no verifica primero si una de estas propiedades es True se provocar entonces un error en tiempo de ejecucin y la aplicacin finalizar. Si las dos propiedades, BOF y EOF, son True, entonces el Recordset estar vaci. Cada registro en el Recordset tiene un valor de tipo Variant que usted podr leer con la propiedad Bookmark y luego usarlo para volver rpidamente a dicho registro. Solo debe reasignar el mismo valor a la propiedad Bookmark, tal y como se muestra en el siguiente cdigo: Dim posicion As Variant posicion = rs.Bookmark rs.movelast rs.Bookmark = posicion

Leemos la posicin del registro actual. Nos desplazamos al ltimo registro. Puede ser a cualquier otro. Vuelve al registro marcado.

- 4.4.1.9 Ordenacin de los registros de un Recordset Podr ordenar los registros contenidos en un Recordset utilizando la propiedad Sort. Para esto, se debe indicar el nombre o los nombres de los campos por el cual se ordenar la columna, por ejemplo: rs.Sort = nombre Ordena el Recordset por el campo nombre.

Podemos indicar dos campos para ordenar los registros del Recordset como se muestra en el siguiente ejemplo: rs.Sort = nombre, apellido Ordena el Recordset por el campo nombre y apellido.

Los registros se ordenan automticamente de forma ascendente, pero podr elegir un orden descendente utilizando el calificador DESC: Ordena el Recordset empezando con los empleados con mayores sueldos hasta los menores. rs.Sort = Sueldo DESC - 4.4.1.10 Bsqueda de registros El objeto Recordset dispone de un mtodo muy sencillo que permite localizar un registro que cumpla un determinado criterio de seleccin. Este es el mtodo Find que tiene la siguiente sintaxis: Find CriterioBsqueda, [RegistrosOmitidos], [DireccinBsqueda], [Inicio] CriterioBsqueda es una cadena que contiene la condicin de bsqueda, que constar de un nombre de campo seguido de un operador y de un valor. Los operadores que podr utilizar son = (igual), < (menor que), > (mayor que) y LIKE (Patrn de coincidencia). El valor puede ser una cadena encerrada entre comilla, un numero, el valor de una variable, el valor de un objeto o una fecha encerrada entre caracteres #. RegistrosOmitidos es un nmero opcional que indica la cantidad de registros que se van a ignorar antes de comenzar la bsqueda. DireccinBsqueda indica la direccin en la que se procesar la bsqueda; los valores admitidos son 1adSearchForward (Bsqueda hacia delante, valor predeterminado) o 1-adSearchBackward (Bsqueda hacia atrs). Inicio es un marcador opcional que especifica el registro desde el que se debe comenzar la bsqueda, el valor predeterminado es el registro actual. Podr omitir todos los parmetros excepto el primero, en este caso la bsqueda iniciara desde el registro actual. Si la bsqueda tiene xito, entonces, el registro que cumpla con el criterio establecido se convertir en el registro activo; si la bsqueda no tiene xito, el registro actual se convertir en el ltimo registro del Recordset. Deber verificar el estado de las propiedades BOF y EOF antes de leer el valor de los campos del registro cuando realice una bsqueda, de lo contrario provocar un error y abortar la aplicacin. Cuando la bsqueda tiene xito ambas propiedades contienen el valor False. En el siguiente ejercicio ver como utilizar el mtodo Find para localizar uno o varios registros en el Recordset.

LECCION 4.3 Conectando BD en VB6

Pgina 18

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

Abra un nuevo proyecto. Agregue la referencia a la base de datos en el men Project\References: Microsoft ActiveX Data Objects 2.8 Library. Puede agregar la ms reciente. Identifique los controles que se muestra en la siguiente imagen y establezca los valores necesarios en las propiedades requeridas.

Seleccione la caja combinada (ComboBox). En la propiedad List escriba los siguientes valores:

Seleccione la primera caja de texto y en la propiedad Name escriba: txtBuscarTexto Seleccione la segunda caja de texto y en la propiedad Name escriba: txtNombre Seleccione la tercera caja de texto y en la propiedad Name escriba: txtApellido Seleccione la cuarta caja de texto y en la propiedad Name escriba: txtTelefono Seleccione la quinta caja de texto y en la propiedad Name escriba: txtDireccion Seleccione la sexta caja de texto y en la propiedad Name escriba: txtCorreo Dentro del evento Click del botn Buscar escriba: 'Comprobamos que la caja combinada de la bsqueda no se este vaca. If Len(Trim(Combo1.Text)) = 0 Then MsgBox ("Debe especificar el tipo de bsqueda") Combo1.SetFocus

LECCION 4.3 Conectando BD en VB6

Pgina 19

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

'Verificamos si la caja del texto a buscar esta vaca. ElseIf Len(Trim(txtBuscarTexto.Text)) = 0 Then MsgBox ("Debe especificar el texto a buscar") txtBuscarTexto.SetFocus Else 'Verificamos el tipo de bsqueda. If LCase(Combo1.Text) = LCase("Apellido") Then rs.Find "Apellido = '" & txtBuscarTexto.Text & "'", , , 1 'Buscamos por el Apellido. End If If LCase(Combo1.Text) = LCase("Nombre") Then rs.Find "Nombre = '" & txtBuscarTexto.Text & "'", , , 1 'Buscamos por el Nombre. End If If LCase(Combo1.Text) = LCase("Telefono") Then rs.Find "Telefono = '" & txtBuscarTexto.Text & "'", , , 1 'Buscamos por el Telfono. End If 'Verificamos si la bsqueda tiene xito y ponemos los datos en las cajas de texto. If rs.BOF = False And rs.EOF = False Then txtNombre.Text = rs.Fields("Nombre") 'Ponemos el nombre del registro actual. txtApellido.Text = rs.Fields("Apellido") 'Ponemos el apellido del registro actual. txtTelefono.Text = rs.Fields("Telefono") 'Ponemos el telfono del registro actual. txtDireccion.Text = rs.Fields("Direccion") 'Ponemos la direccin del registro actual. txtCorreo.Text = rs.Fields("Correo") 'Ponemos el correo del registro actual. Else 'Mostramos un mensaje si la bsqueda no tiene xito. MsgBox ("No se ha podido localizar el registro con el parmetro especificado") End If End if

En la seccin General del formulario escriba: Dim cn As New ADODB.Connection Private WithEvents rs As ADODB.Recordset 'Creamos el objeto Connection. 'Creamos el Recordset con soporte de eventos.

Escriba dentro del evento Load del formulario el siguiente bloque de cdigo: Set rs = New ADODB.Recordset 'Abrimos la base de datos "agenda.mdb". cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=c:\agenda.mdb" rs.Source = "contactos" 'Especificamos la fuente de datos. En este caso la tabla "contactos". rs.CursorType = adOpenKeyset 'Definimos el tipo de cursor. rs.LockType = adLockOptimistic 'Definimos el tipo de bloqueo. rs.Open "select * from contactos", cn 'Abrimos el Recordset y lo llenamos con una consulta SQL. 'Cargamos los datos en las cajas de texto. rs.MoveFirst 'Nos movemos al principio del Recordset. Dentro del evento Click del botn Salir escriba: 'Sale de la aplicacin.

LECCION 4.3 Conectando BD en VB6

Pgina 20

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


End

Corra la aplicacin. Ahora, para probar nuestra aplicacin seleccione el tipo de bsqueda y el texto que desea buscar. Debe tener en cuenta que los datos que especifique en la caja de texto deben estar en la base de datos que creamos al principio, de lo contrario la bsqueda no tendr xito. Recuerde los datos que contiene la base de datos son los que se muestran a continuacin:

Si en el tipo de bsqueda usted especificar Nombre, entonces, en la caja del texto a buscar podr escribir uno de los nombres de la primera columna. De igual manera podr hacer con el Apellido y el Telfono. Si existen ms de un registro con el mismo parmetro de bsqueda especificado, solo el primero de ellos ser el que se active. Esto es, debido a que hemos especificado el valor 1 (busca siempre desde el principio) en el argumento Inicio del mtodo Find. Si desea que la bsqueda continu a partir del registro actual cada vez que hagamos clic en el botn Buscar, entonces, deber omitir el valor del argumento Inicio y especificar el valor 1 en el argumento RegistrosOmitidos, ejemplo: rs.Find "Apellido = '" & txtBuscarTexto.Text & "'", 1 rs.Find "Nombre = '" & txtBuscarTexto.Text & "'", 1 rs.Find "Telefono = '" & txtBuscarTexto.Text & "'", 1 Detenga la aplicacin y gurdela con los nombres FormEjercicio3-8 para el formulario y Ejercicio3-8 para el proyecto. Podr utilizar un bucle para recorrer todos los registros que cumplan un determinado criterio, tal y como se muestra en el siguiente ejemplo: Buscar todos los empleados que hayan sido contratados despus del 1 de enero de 2003. rs.MoveFirst Nos colocamos al principio del Recordset. rs.Find FechaContrato > #1/1/2003# Hacemos nuestra primera bsqueda. Do Until rs.EOF Si encontramos los registros los vamos agregando en una ListBox. List1.AddItem rs(Nombre), rs(Apellido), rs(FechaContrato) Buscar el siguiente registro que cumpla el criterio de bsqueda pero ignoramos el actual. rs.Find FechaContrato > #1/1/2003# Loop Para realizar bsquedas ms complejas puede utilizar el operador LIKE. Este operador acepta dos smbolos comodines: el asterisco (*) equivale a ninguno o ms caracteres y el subrayado (_) equivale exactamente a un nico carcter. A continuacin algunos ejemplo:

LECCION 4.3 Conectando BD en VB6

Pgina 21

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

rs.Find Nombre LIKE 'C*' rs.Find Nombre LIKE '*A*'

Buscar registros cuyo nombre comience con la letra C. Buscar registros donde la segunda letra de los nombres sea la A.

- 4.4.1.11 Verificar el estado del Recordset En muchas ocasiones necesitar verificar el estado del Recordset para mostrar los resultados a los usuarios de alguna operacin, o bien, para verificar si alguna operacin tuvo o no xito. Para consultar el estado del Recordset verifique la propiedad Status (utilizando una sentencia If o Case). En esta propiedad puede tener uno de los siguientes valores: Constante adRecOK adRecNew adRecModified adRecDeleted adRecUnmodified adRecInvalid adRecMultipleChanges adRecPendingChanges adRecCanceled adRecCantRelease adRecConcurrencyViolation adRecIntegrityViolation adRecMaxChangesExceeded adRecObjectOpen Valor 0 1 2 4 8 &H10 &H40 &H80 &H100 &H400 &H800 &H1000 &H2000 &H4000 Descripcin Se ha actualizado el registro con xito. El registro es nuevo. Se ha modificado el registro. Se ha borrado el registro. El registro no se ha modificado. No se ha guardado el registro porque su marcador no es vlido. No se ha guardado el registro porque afecta a varios registros. No se ha modificado el registro porque hace referencia a una insercin pendiente. No se ha guardado el registro porque se ha cancelado la operacin. No se ha guardado el registro porque esta bloqueado. No se ha guardado el registro porque se estaba usando una concurrencia optimista. No se ha guardado el registro porque violara las restricciones de integridad. No se ha guardado el registro porque existen demasiados cambios pendientes. No se ha guardado el registro porque existe un conflicto con un objeto de almacenamiento que se encuentra abierto. No se ha guardado el registro porque se ha producido un error del tipo fuera de memoria. No se ha guardado el registro porque el usuario no cuenta con los permisos necesarios. No se ha guardado el registro porque no cumple con la estructura de la base de datos. El registro ha sido borrado de la base de datos.

adRecOutOfMemory adRecPermissionDenied adRecSchemaViolation adRecDBDeleted

&H8000 &H10000 &H20000 &H40000

La propiedad Status solo proporciona valores que muestran el estado de las operaciones con los registros del Recordset, sin embargo, el Recordset dispone de la propiedad State que muestra el estado general del Recordset antes o despus de haber sido abierto. Estos son los valores para la propiedad State:

LECCION 4.3 Conectando BD en VB6

Pgina 22

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

Valor 0-adStateClosed 1-adStateOpen 2-adStateConnecting 4-adStateExecuting 5-adStateFetching

Descripcin El Recordset est cerrado. El Recordset est abierto. El Recordset est conectado. El Recordset est ejecutando un mandato. Se esta extrayendo las filas del Recordset.

- 4.4.2 Eventos del objeto Recordset El objeto Recordset de ADO tiene un total de 11 eventos o sucesos. Estos sucesos le permitirn tener un control total de lo que est sucediendo internamente. Al codificar estos eventos, podr potenciar las consultas asncronas, atrapar el momento en el que se modifica un campo o un registro, verificar si se ha movido de un registro a otro e, incluso, agregar datos cuando el usuario alcance el final del Recordset. Para poder apreciar mejor los sucesos del Recordset lo he clasificado en tres grandes grupos: Sucesos de recuperacin de datos, Sucesos de navegacin y Sucesos de modificacin de datos. - 4.4.2.1 Sucesos de recuperacin de datos Estos sucesos ocurren durante una operacin asncrona cuando se estn recuperando los datos. El suceso FetchProgress ocurre de forma constante durante una operacin asncrona de gran longitud. Podr utilizarlo para mostrar al usuario una barra de progreso que indique el porcentaje de los registros que han sido recuperados. Este suceso tiene la siguiente estructura: Private Sub rs_FetchProgress (ByVal Progress As Long, ByVal MaxProgress As Long, _ adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) Aqu escriba su cdigo End Sub

El parmetro Prosess contiene el nmero de registros que se han extrado hasta el momento. MaxProgress es el nmero total de registros que se esperan recuperar. adStatus es el parmetro de estado. pRecordset es una referencia al objeto Recordset que ha provocado el suceso (este parmetro no tendr que utilizarlo porque ya cuenta con una referencia al Recordset). Cuando la operacin asncrona concluya, se pondr en marcha el suceso FetchComplete. Este suceso tiene la siguiente estructura: Private Sub rs_FetchComplete(ByVal pError As ADODB.error, _ adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) Aqu escriba su cdigo. End Sub Utilice el parmetro pError para consultar el si ha ocurrido algn error durante la transaccin. La propiedad Status solo proporciona valores que muestran el estado de las operaciones con los registros del Recordset, sin embargo, el Recordset dispone de la propiedad State que muestra el estado general del Recordset antes o despus de haber sido abierto. Estos son los valores para la propiedad State:

LECCION 4.3 Conectando BD en VB6

Pgina 23

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


Valor 0-adStateClosed 1-adStateOpen 2-adStateConnecting 4-adStateExecuting 5-adStateFetching Descripcin El Recordset est cerrado. El Recordset est abierto. El Recordset est conectado. El Recordset est ejecutando un mandato. Se esta extrayendo las filas del Recordset.

- 4.4.2 Eventos del objeto Recordset El objeto Recordset de ADO tiene un total de 11 eventos o sucesos. Estos sucesos le permitirn tener un control total de lo que est sucediendo internamente. Al codificar estos eventos, podr potenciar las consultas asncronas, atrapar el momento en el que se modifica un campo o un registro, verificar si se ha movido de un registro a otro e, incluso, agregar datos cuando el usuario alcance el final del Recordset. Para poder apreciar mejor los sucesos del Recordset lo he clasificado en tres grandes grupos: Sucesos de recuperacin de datos, Sucesos de navegacin y Sucesos de modificacin de datos. - 4.4.2.1 Sucesos de recuperacin de datos Estos sucesos ocurren durante una operacin asncrona cuando se estn recuperando los datos. El suceso FetchProgress ocurre de forma constante durante una operacin asncrona de gran longitud. Podr utilizarlo para mostrar al usuario una barra de progreso que indique el porcentaje de los registros que han sido recuperados. Este suceso tiene la siguiente estructura: Private Sub rs_FetchProgress (ByVal Progress As Long, ByVal MaxProgress As Long, _ adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) Aqu escriba su cdigo End Sub

El parmetro Prosess contiene el nmero de registros que se han extrado hasta el momento. MaxProgress es el nmero total de registros que se esperan recuperar. adStatus es el parmetro de estado. pRecordset es una referencia al objeto Recordset que ha provocado el suceso (este parmetro no tendr que utilizarlo porque ya cuenta con una referencia al Recordset). Cuando la operacin asncrona concluya, se pondr en marcha el suceso FetchComplete. Este suceso tiene la siguiente estructura: Private Sub rs_FetchComplete(ByVal pError As ADODB.error, _ adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) Aqu escriba su cdigo. End Sub Utilice el parmetro pError para consultar el si ha ocurrido algn error durante la transaccin. - 4.4.2.3 Sucesos de modificacin de datos Estos eventos ocurren cuando se modificar el valor de uno o varios campo de un registro o cuando se modifica uno o varios registros del Recordset. Cuando ejecute uno o ms campos de un Recordset, se pondr en marcha el suceso WillChangeField. Este suceso tiene la siguiente estructura:

LECCION 4.3 Conectando BD en VB6

Pgina 24

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

Private Sub rs_WillChangeField(ByVal cFields As Long, ByVal Fields As Variant, _ adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) End Sub cFields es el nmero de campos que se van a modificar. Fields es un array de tipo Variant que contiene uno o ms objetos Field con cambios pendientes. Podr cancelar la operacin de actualizar los registros estableciendo el valor adStatusCancel en el parmetro adStatus. Cuando la operacin de actualizacin haya concluido, ADO pondr en marcha el suceso FieldChangeComplete. Este le permitir investigar cualquier error que haya ocurrido durante la operacin. Este suceso tiene los mismos parmetros que el evento anterior ms el parmetro pError: Private Sub rs_FieldChangeComplete(ByVal cFields As Long, ByVal Fields As Variant, _ ByVal pError As ADODB.error, adStatus As ADODB.EventStatusEnum, _ pRecordset As ADODB.Recordset) End Sub Cuando se haya modificado uno o ms registros, ADO ejecuta el suceso WillChangeRecord: Private Sub rs_WillChangeRecord(ByVal adReason As ADODB.EventReasonEnum, _ ByVal cRecords As Long, adStatus As ADODB.EventStatusEnum, _ ByVal pRecordset As ADODB.Recordset) End Sub El parmetro adReason tiene el mismo resultado que en los eventos de navegacin WillMove y MoveComplete. cRecords es el nmero de registros que se van a modificar. adStatus es el parmetro que podr utilizar para cancelar la operacin asignando el valor adStatusCancel. Inmediatamente ADO termine la actualizacin de los registros se pondr en marcha el suceso RecordChangeComplete: Private Sub rs_RecordChangeComplete(ByVal adReason As ADODB.EventReasonEnum, _ ByVal cRecords As Long, ByVal pError As ADODB.error, adStatus As ADODB.EventStatusEnum, _ ByVal pRecordset As ADODB.Recordset) End Sub Todos los parmetros del suceso anterior tienen el mismo significado que en el caso del suceso WillChangeRecord. Cuando ejecute una operacin que vaya a modificar el contenido de un Recordset como un todo (tal como los mtodos Open, Requer y Resync) se pondr en marcha un suceso WillChangeRecordset y cuando haya completado la operacin un suceso RecordsetChangeComplete. La estructura de estos sucesos se muestra en la siguiente pgina Private Sub rs_WillChangeRecordset(ByVal adReason As ADODB.EventReasonEnum, _ adStatus As ADODB.EventStatusEnum, ByVal pRecordset As ADODB.Recordset) End Sub El significado de los parmetros es similar a los vistos en los sucesos anteriores.

LECCION 4.3 Conectando BD en VB6

Pgina 25

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


Private Sub rs_RecordsetChangeComplete(ByVal adReason As ADODB.EventReasonEnum, _ ByVal pError As ADODB.error, adStatus As ADODB.EventSatusEnum, _ ByVal pRecordset As ADODB.Recordset) End Sub

- 4.4.3 Generacin de reportes La generacin de reporte es una de las funciones ms relevantes que puede tener un sistema que manipule bases de datos. Esto consiste en presentar al usuario un conjunto de informacin de forma organizada, ya sea por resultado de una consulta personalizada o una consulta ya definida internamente en el programa. Ejemplos de consultas podran ser: mostrar al usuario todas las ventas realizadas en la empresa en una fecha determinada, mostrar todos los empleados mayores de treinta aos, mostrar todos los empleados con sueldos mayores de cinco mil pesos, etc. Lo primero que se debe tener en cuenta antes de generar un reporte es el lugar donde se va a mostrar dicho reporte, esto puede ser en cualquier control que contenga rejillas como un Grid o un ListView. Despus que los datos estn cargados en un Recordset es muy sencillo mostrarlos en un Gris o un ListView. El siguiente ejercicio le enseara a mostrar todos los registros que contiene nuestra tabla agenda en un control ListView. Abra un nuevo proyecto. Haga clic derecho en la barra de controles y seleccione la opcin Components. En la ventana de Componentes localice el control Microsoft Windows Common Controls 6.0 (SP6) y actvelo. Luego, haga clic en el botn Aceptar. Haga clic en el men Project (Proyecto) y ejecute la opcin References (Referencias). En la ventana Referencia localice el elemento Microsoft ActiveX Data Objects 2.0 Library o una superior. Para cerrar la ventana haga clic en el botn Aceptar (OK). Inserte en el formulario un control ListView y cuatro botones de comando. Seleccione el control ListView y busque la propiedad View en la Ventana de propiedades. Establezca el valor 3lvwReport en esta propiedad. En la propiedad Caption del primer botn de comando escriba: Reporte 1. En la propiedad Caption del segundo botn de comando escriba: Reporte 2. En la propiedad Caption del tercer botn de comando escriba: Reporte 3. En la propiedad Caption del cuarto botn de comando escriba: &Salir.

LECCION 4.3 Conectando BD en VB6

Pgina 26

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012

En el evento Load del formulario escriba: ListView1.GridLines = True 'Hacemos que aparezcan las lneas del Grid.

'Agregamos los campos al ListView. ListView1.ColumnHeaders.Add , , "Nombre", 1600 ListView1.ColumnHeaders.Add , , "Apellido", 1600 ListView1.ColumnHeaders.Add , , "Telfono", 1400 ListView1.ColumnHeaders.Add , , "Direccin", 3000 ListView1.ColumnHeaders.Add , , "Correo", 1400 Activamos los Recordset. Set rs = New ADODB.Recordset Set rs2 = New ADODB.Recordset Set rs3 = New ADODB.Recordset 'Abrimos la base de datos "agenda.mdb". cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=c:\agenda.mdb" rs.Source = "contactos" Este Recordset es para el primer reporte. rs.CursorType = adOpenKeyset rs.LockType = adLockOptimistic rs2.Source = "contactos" rs2.CursorType = adOpenKeyset rs2.LockType = adLockOptimistic rs3.Source = "contactos" rs3.CursorType = adOpenKeyset Este Recordset es para el segundo reporte.

Este Recordset es para el tercer reporte.

LECCION 4.3 Conectando BD en VB6

Pgina 27

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


rs3.LockType = adLockOptimistic En el evento Click del botn Reporte 1 escriba: 'Limpiamos el ListView en caso de que este tenga informacin. ListView1.ListItems.Clear 'En esta primera consulta leemos todos los registros de la base de datos. If rs.State = 0 Then rs.Open "select * from contactos", cn End If 'Agregamos los datos al ListView rs.MoveFirst 'Nos movemos al primer registro. Dim li As ListItem While rs.EOF = False 'Ponemos los datos de los campos ledos en el ListView. Set li = ListView1.ListItems.Add(, , rs("nombre")) li.ListSubItems.Add , , rs("apellido") li.ListSubItems.Add , , rs("telefono") li.ListSubItems.Add , , rs("direccion") li.ListSubItems.Add , , rs("correo") rs.MoveNext 'Pasamos al siguiente registro. Wend

En el evento Click del botn Reporte 2 escriba: 'Limpiamos el ListView en caso de que este tenga informacin. ListView1.ListItems.Clear 'En consulta leemos todos los campos nombre y apellido de la base de datos. If rs2.State = 0 Then rs2.Open "select nombre, apellido from contactos", cn End If 'Agregamos los datos al ListView. rs2.MoveFirst 'Nos movemos al primer registro. Dim li As ListItem While rs2.EOF = False 'Ponemos los datos de los campos ledos en el ListView. Set li = ListView1.ListItems.Add(, , rs2("nombre")) li.ListSubItems.Add , , rs2("apellido") rs2.MoveNext 'Pasamos al siguiente registro. Wend En el evento Click del botn Reporte 3 escriba: 'Limpiamos el ListView en caso de que este tenga informacin. ListView1.ListItems.Clear 'En esta consulta leemos los nombre de los contactos que se apelliden Bucarelly. If rs3.State = 0 Then rs3.Open "select * from contactos where apellido = 'Bucarelly'", cn End If

LECCION 4.3 Conectando BD en VB6

Pgina 28

[VISUAL BASIC CON BASE DE DATOS] IDSYSTEMS 2012


'Agregamos los datos al ListView rs3.MoveFirst 'Nos movemos al primer registro. Dim li As ListItem While rs3.EOF = False 'Ponemos los datos de los campos ledos en el ListView. Set li = ListView1.ListItems.Add(, , rs3("nombre")) li.ListSubItems.Add , , rs3("apellido") rs3.MoveNext Wend 'Pasamos al siguiente registro.

En el evento Click del botn Salir escriba: Sale de la aplicacin. End

Corra la aplicacin. Haga clic sobre cada uno de los botones de Reporte. Podr observar que cada botn de comando extrae de la base de datos solo la informacin que hemos establecido en cada una de las consultas. En el primer botn de reporte especificamos una consulta que lee todos los registros de la base de datos, en el segundo botn de reporte especificamos una consulta que extrae nicamente los nombres y apellidos de la base de datos omitiendo los dems campos (direccin, telfono y correo). En el ltimo botn de reporte especificamos una consulta personalizada que extrae todos los nombres de las personas que tengan por apellido Bucarelly. Detenga la aplicacin y gurdela con los nombres FormEjercicio3-9 para el formulario y Ejercicio3-9 para el proyecto.

LECCION 4.3 Conectando BD en VB6

Pgina 29

You might also like