Bases de Datos usando DAO

Contenido: (los más recientes abajo) 1. Copiar la estructura de una tabla con Access 2. Ordenes SQL para cambiar los datos de una tabla. 3. Caracteres no "standards" en los nombres de los campos 4. Procesar una consulta SQL (Execute) 5. Procesar una consulta SQL creando un Recordset 6. Evitar el error al asignar un Null 7. Comprobar si un registro se está editando 8. Asignar a un Recordset los registros deseados 9. Compactar una base de datos, usando código VB (27/Feb) 10. Crear una base de datos, usando código VB (18/Abr) 11. Como crear un Formulario de Datos con un Grupo de Registros Subyacente
(18/Abr) datos con LIKE) (20/Abr) 13. Procesar el resultado de una consulta con varias tablas para evitar registros duplicados (13/Jul) 14. Programación sobre la seguridad de Access (31/Ago) 15. Un método rápido para efectuar búsquedas (8/Sep) 16. Enumerar las tablas de una base de datos (17/Sep) 17. Capturar errores de ODBC (9/Abr/98) 18. Acceso a bases de datos SQL Server... 19. Cargar Imágenes de una base de datos sin usar el DataControl 20. Acceder a bases de datos de Access 2000 con el VB5 (05/Oct/99) 21. Un consejo si instalas VB6 SP4 para acceder a bases de datos de Access 2000 (10/Nov/00) 22. Ejemplo "simple" de acceso a datos DAO con el data control (Curso Básico entrega 34) (09/Jul/03) 23. Buscar en una base de datos DAO con el data control (Curso Básico entrega 35) (09/Jul/03) 24. Acceder a una base de datos DAO sin el data control (Curso Básico entrega 40) (09/Jul/03) 25. Realizar consultas en una base de datos DAO (Curso Básico entrega 40) (09/Jul/03) 26. Cómo manejar fechas en consultas, además de otros ejemplos, tanto para ADO como para DAO (09/Jul/03) 27. Instrucciones SQL para seleccionar, actualizar, eliminar datos, etc. (02/May/04) 28. Conectar a una base de datos de SQL Server con VB6 (Abrir una tabla y mostrar los campos/columnas) (10/Sep/04) 29. Indicar el path de una base de datos usando el control data (18/Sep/04) Ejemplo paso a paso de cómo usar un control data y DataGrid

12. Cambiar los caracteres extraños por ? (para usar en las consultas a bases de

1.- Copiar la estructura de una tabla con Access Para copiar/duplicar la estructura de una tabla en una base de datos Access, sigue estos pasos:

1. 2. 3. 4. 5. 6.

Carga la base de datos en Access Selecciona la tabla a copiar En el menú de Edición, selecciona Copiar En el menú de Edición, selecciona Pegar Escribe el nuevo nombre de la tabla Selecciona "Estructura solamente"

Ya está la tabla "duplicada" en la misma base de datos, por si haces cambios de los que después te arrepientas. Si la intención es copiarla en otra base de datos, antes de seguir con el paso 4, cargar o crear la nueva base de datos y ya está. En el paso 6 puedes seleccionar "Estructura y Datos" si quieres copiar también los datos.

2.- Ordenes SQL para cambiar los datos de una tabla. UPDATE tabla SET nombre_campo = 'nuevo_valor' WHERE opciones_a_tener_en_cuenta Ejemplo: Actualizar la tabla Clientes poniendo el campo Agente a LIBRE si la fecha de ÚltimaVisita es anterior al 1 de Enero de 1996 (este es un caso sobre una base de datos que uso en mi trabajo, pero como ejemplo puede valer): UPDATE Clientes SET Agente = 'LIBRE' WHERE [ÚltimaVisita] < DateValue('01/01/96') Normalmente el campo de fechas será según tengáis configurado el sistema.

3.- Caracteres no "standard" en los nombres de los campos

ponlos entre corchetes. posteriormente se procesarán los datos que ha producido dicha consulta. espacios. 4.. Por ejemplo si tenemos una base de datos con nuestra colección discográfica. etc.Execute SQLTmp. fijates en cómo se usa ÚltimaVisita en el ejemplo anterior. Cuando hagas una consulta o lo uses en un Recordset. si estamos seguros de que no necesitamos los comodines. ya que la consulta es "bastante" más rápida. la orden a ejecutar sería: SQLTmp = "SELECT * FROM mis_discos WHERE Formato Like '*CD*' AND Cantante Like '*Phil Collins*'" Por supuesto se puede usar = en lugar de Like. usar la orden Execute en la variable de una base de datos (Database) 'SQLTmp= orden SQL 'Db será una base de datos: 'Dim Db As Database 'Variable para las Bases de Datos 'Set Db = OpenDatabase("Nombre_Base_Datos") On Error Resume Next Db.Procesar una consulta SQL creando un Recordset Se creará un Recordset con el resultado de una consulta SQL realizada a uan base de datos.Si al crear las tablas de la base de datos usas caracteres acentuados. dbFailOnError If Err Then MsgBox "Se ha producido un error al ejecutar la orden:" & vbCrLf & SQLTmp End If 5. eñes. LP..) es Formato y el Nombre del Autor está en Cantante. etc. Es decir quedaría así: SQLTmp = "SELECT * FROM mis_discos WHERE Formato = 'CD' AND Cantante = 'Phil Collins'" 'Ejecutar orden SQL con los datos solicitados 'Db será una base de datos: 'Dim Db As Database 'Variable para las Bases de Datos . etc.Procesar una consulta SQL (Execute) Para ejecutar una orden SQL en una base de datos. podríamos hacer una consulta con todos los CD's de Phil Collins Suponiendo que el formato de los discos (CD.

MoveNext Loop MySnap. avisar MsgBox "No hay datos que coincidan con la búsqueda especificada...MoveFirst If Err Then Err = 0 'no hay datos..OpenRecordset(SQLTmp..Close 6.MoveFirst Do Until MySnap.Clear MySnap. 64.. ' List1.Then.y demás datos MySnap. Además de evitar el error. Para cadenas: Cadena = "" & rs!Campo Para números: 'Numero = 0 & rs!Campo Numero = CInt("0" & rs!Campo) . "Listados" Exit Sub End If 'Añadir el resultado a un List List1.EOF 'Procesar los datos.'Set Db = OpenDatabase("Nombre_Base_Datos") Dim SQLTmp As String Dim MySnap As Recordset SQLTmp = "select * from " & Nombre_Tabla & " <Consulta> " & " order by " & Clasificar Set MySnap = Db.. dbOpenSnapshot) Err = 0 MySnap.Evitar el error al asignar un campo Null de una base de datos. es más rápido que usar If." & vbCrLf & "(o no está bien realizada)".. para comprobar si el campo es nulo o está vacío...AddItem MySnap("Cantante") & " " & MySnap("[Canción]") '.

serán las comparaciones (consulta) que quieres incluir para la selección.. '..Refresh El Refresh que no se te olvide. [campo2]" Data1. clasificados por la población: ... 8. Veamos un ejemplo: With Data1.Recordset 'Escribe el código para buscar el registro a editar. .. Data1.Seleccionar los registros que queremos en un Recordset Para asignar a un Data (Recordset) los datos que quieras de una tabla.Comprobar si un registro se está editando. es que ya está libre.. Se está editando actualmente. si quieres incluir todos los clientes de Málaga que tengan coche. pueden ser: dbEditNone dbEditInProgress dbEditAdd Si no se está editando. usa la propiedad Recordsource.. si no quieres que produzca error.RecordSource = "SELECT * FROM Tabla WHERE (condiciones de selección) ORDER BY campo. Por ejemplo....EditMode = dbEditInProgress DoEvents Loop 'Cuando llegue aquí. . Do While . etc.hacer los cambios al registro. Lo que hay que hacer es usar EditMode y comprobar si se está editando. Condiciones de selección.7. Se ha añadido un registro con AddNew y el registro actual todavía está en el buffer.Edit '. Esto puede ser útil si el programa tiene que acceder a una base de datos en red o bien si accedes en el mismo equipo a una base de datos.Update End With Los valores que devuelve EditMode.

Coche FROM Clientes WHERE Provincia LIKE 'Málaga' AND Coche = 'Si' ORDER BY [Población]" 9. en la parte ORDER BY. Más vale prevenir.) Db. se pueden incluir más de un campo. así que. ". p) 'Buscar \. El asterisco (*) que hay después de SELECT. Si sólo quieres incluir algunos campos. Para que lo incluya también. no lo "encontrará".Close 'Liberar memoria y "desligarla" Set Db = Nothing ' 'Tomar el nombre sin la extensión sTmp = "" i = InStr(NombreBase. Por aquello de la seguridad. [Población].Apellidos. separados por comas.RecordSource = "SELECT * FROM Clientes WHERE Provincia = 'Málaga' AND Coche = 'Si' ORDER BY [Población]" Fijate que Población está entre corchetes. Lo mismo hay que hacer si el nombre del campo incluye espacios. 'Cerrar la base (esto sólo si la tienes abierta.") If i Then p = i .Compactar una base de datos.Data1. si en Provincia tienes algo como: Málaga (Andalucía).1 Else p = Len(NombreBase) End If sTmp = Left$(NombreBase. porque la ó (o acentuada) es un caracter "extraño" y se debe poner entre corchetes para que el Jet lo entienda. esto es necesario.RecordSource = "SELECT Nombre.RecordSource = "SELECT * FROM Clientes WHERE Provincia LIKE '*Málaga*' AND Coche = 'Si' ORDER BY [Población]" Más cosas. usando código VB (27/Feb) Este es el código que uso para compactar las bases de datos. sobre todo en las que uso en la empresa.. mantengo dos copias: la anterior y la última. es para que incluya todos los campos de la tabla.. que cambian a diario. Provincia.. especificalos en lugar del asterisco y separalos con comas: Data1. Otra cosa a tener en cuenta es que si usas =. para tomar el directorio (path) .. el contenido del campo "debe coincidir exactamente". me curo en salud. Nunca se sabe cuando se cortará la luz o se quedará colgado el equipo. Cosa que suelo hacer bastante a menudo.. cambia el signo igual por LIKE: Data1.

i) Exit For End If Next If Right$(sTmp. Por supuesto.For i = p To 1 Step -1 If Mid$(NombreBase. tienes algo por dónde empezar. usando código VB (18/Abr) Aprovechando que he puesto la colaboración de Harvey Triana en esta página. dBaseTmp = sTmp & "~dBase2. así que asignar el nombre Name dBaseTmp As NombreBase 'Borrar los ficheros LDB If Len(Dir$(sTmp & "*.mdb" 'Esta es la madre del cordero.. dBaseTmp.mdb")) Then Kill sTmp & "~dBase1. en el que puedes tener el código completo y otras cosillas que aquí no se van a explicar. 1) <> "\" Then sTmp = sTmp & "\" End If 'Todo este proceso es para estar seguro de que se quede una copia 'en caso de que falle la compactación.Crear una base de datos. Private Sub CrearBase(sBase As String) 'Crear la base de datos indicada ' Dim Db As Database Dim Fd As Field Dim Tb As New TableDef 'Definir una Tabla Dim Idx As New Index 'Para crear un índice Dim i As Integer 'Crear base de datos. dbVersion20 'Guardar una copia de como estaba antes Name NombreBase As sTmp & "~dBase1. idioma español y para la versión 2.ldb")) Then Kill sTmp & "*.. Te recomiendo que veas el Proyecto Paso a Paso. Este es el listado del procedimiento que se encargará de crear la base de datos.mdb" 'Esta es la base ya compactada. dbLangSpanish. es cuestión de adecuarte.. 1) = "\" Then sTmp = Left$(NombreBase. se pueden usar otras "versiones".0 del Jet de Access .ldb" 10. CompactDatabase NombreBase. pues te voy a poner cómo crear una base desde dentro del propio Visual Basic. deberás cambiar los nombres de los campos y tipos de datos a tu conveniencia.mdb" If Len(Dir$(dBaseTmp)) Then Kill dBaseTmp If Len(Dir$(sTmp & "~dBase1. pero de esta forma. i.

Append Fd 'El resto de los campos Set Fd = Tb. dbMemo) Tb.Fields.Fields. en su lugar lo hace la dbVersion25 'pero ésa no está creada!!! ' 'Primero la tabla de las tareas Set Tb = Db.Fields. dbText.Indexes. es el contador. Fd. usa dbVersion11 en lugar de dbVersion20 '======================================================================== ======== Set Db = CreateDatabase(sBase.Fields.CreateField("FechaTermino".'======================================================================== ======== 'Si vas a adaptar este programa para VB3.CreateTableDef("Anotaciones") 'El campo ID.Name = "PrimaryKey" Idx. dbText.TableDefs.CreateField("Asunto".CreateField("Fecha".Append Fd Set Fd = Tb. 255) Tb.Append Fd Set Fd = Tb.Primary = True Idx.CreateField("Terminada". dbText.CreateTableDef("Tareas") 'Vamos a crear cada uno de los campos Set Fd = Tb.Fields. 255) .Fields.Unique = True Idx.CreateField("FechaInicio". dbInteger) Tb. dbDate) Tb.Fields.Fields.Append Fd Set Fd = Tb. dbLangSpanish.Append Fd Set Fd = Tb.CreateField("Tema". dbLong) Fd. etc.CreateField("ID". dbText.Fields. 50) Tb. dbVersion20) ' 'La constante dbVersion20 no aparece en la ayuda.Fields.Append Fd Set Fd = Tb.Append Fd Set Fd = Tb. dbDate) Tb. etc.Attributes = dbAutoIncrField Or dbUpdatableField Or dbFixedField Tb.Fields = "ID" Tb.CreateField("Descripcion". Set Fd = Tb.Append Fd 'Creamos un índice con el ID Idx.CreateField("ID". 255) Tb. dbDate) Tb. dbLong) 'Ahora vamos a asignar las propiedades de contador.CreateField("Medio".Fields.CreateField("Fecha".CreateField("Asunto".Attributes = dbAutoIncrField Or dbUpdatableField Or dbFixedField Tb.Append Tb ' 'Creamos la otra tabla: Anotaciones Set Tb = Db.Append Fd Set Fd = Tb.Append Idx 'Añadimos la tabla a la base Db.Append Fd Set Fd = Tb.Append Fd 'El resto de los campos Set Fd = Tb. dbDate) Tb.

que será el que se devuelva con el dato encontrado.Fields. Se supone que además tienes una variable (Db) con la base de datos que estás usando. 255) Tb.Tb.Fields = "ID" Tb.Append Fd Set Fd = Tb.Close MsgBox "Nueva base de datos " & sBase & " creada. dbMemo) Tb..Append Idx 'Añadimos la segunda tabla a la base Db.Indexes.CreateField("Descripcion".Fields.Primary = True Idx.Unique = True Idx.Fields.Append Tb 'Cerramos la base Db. dbOpenSnapshot) If Not RsBuscar. dbText.Append Fd Set Fd = Tb..Append Fd Set Fd = Tb.CreateField("Detalle".Un método rápido para efectuar una búsqueda (8/Sep) En este ejemplo. Private Function BuscarEnBase(Optional ByVal sBusqueda As String = "") As Long 'Devuelve el número de ID ( 5/Jul/97) Dim sSQL As String Dim lID As Long On Local Error Resume Next If Len(sBusqueda) Then sSQL = "SELECT * FROM " & sTabla & " WHERE " & sBusqueda Set RsBuscar = Db."..MoveLast End If lID = CLng(RsBuscar("ID")) Else lID = 0& End If .OpenRecordset(sSQL. dbLongBinary) Tb.Name = "PrimaryKey" Idx.EOF Then 'Primera búsqueda If buscAtras Then RsBuscar.TableDefs.Fields.CreateField("Localizacion". La rutina acepta búsquedas hacia delante y hacia atrás. uso un recordset para hacer la búsqueda.Append Fd 'Creamos un índice con el ID Set Idx = Nothing 'Quitar la referencia anterior Idx. Aquí tienes el código. vbInformation End Sub 15. el único requisito es que tenga un campo llamado ID. para buscar hacia atrás la variable buscAtras será True.

MoveNext End If lID = CLng(RsBuscar("ID")) End If If (lID = 0&) Or (Err <> 0) Then lID = 0& 'para que al seguir buscando se empiece por el primero If buscAtras Then RsBuscar.MovePrevious Else RsBuscar. "Buscar" .MoveLast RsBuscar..NoMatch Then qID = 0& End If End If If qID = 0& Then Beep MsgBox "No se ha hallado el dato buscado en el campo: " _ & Text1(ControlActual).MoveFirst RsBuscar.Recordset.FindFirst "ID = " & CStr(qID) If Data1.DataField & " LIKE '" & sBuscar & "*'") If qID Then Data1.MovePrevious End If End If Err = 0 BuscarEnBase = lID End Function Esto es un ejemplo de cómo se llamaría a esta función.. vbOK + vbInformation.Else If buscAtras Then RsBuscar.DataField. cFFAc_Buscar + cFFAc_Atras. "Buscar datos") > cFFAc_IDLE Then sBuscar = Trim$(sBuscar) If Len(sBuscar) Then buscAtras = iFFAtras 'buscCompleta = iFFCompleta YaEstoyAqui = True LblStatus(1) = "Buscando " & sBuscar & ".Recordset.MoveNext Else RsBuscar." DoEvents 'Usar una rutina del tipo consulta (SQL) qID = BuscarEnBase(Text1(ControlActual). usando el diálogo de buscar y reemplazar: iFFAtras = True If gsBuscar(sBuscar.

Close Set Db = Nothing End Sub Si lo que quieres es sólo comprobar si existe.MDB") For Each Td In Db. deberás cambiar la localización de la base de datos por la que sea en tu equipo.Clear Set Db = OpenDatabase("D:\VB\Biblio.Close Set Db = Nothing End Sub 'Para VB3: (en VB4 también se puede usar de esta forma) Private Sub EnumerarTablas() Dim INListTabl As Snapshot Dim Db As Database List1. Las rutinas sirven igual para VB3 (ejemplo aparte) y VB4 o superior. 'son tablas normales If Td.Name End If Next Db.. en un form.MoveFirst Do Until INListTabl.TableDefs 'Sólo las tablas con atributo igual a CERO. añade un ListBox (List1) y un botón que al pulsarlo llame a EnumerarTablas.Clear Set Db = OpenDatabase("D:\VB\Biblio.ListTables() INListTabl.Attributes = 0 Then List1. Para probar esta rutina.Enumerar las tablas de una base de datos (17/Sep) Aquí te muestro como saber las tablas que existen en una base de datos.. De esta forma puedes buscar si la que necesitas está en la base especificada o bien puedes usarla para abrir "cualquier" tabla de una BD.Name = miTabla Then ExisteTabla = True End If .16..EOF If INListTabl("Attributes") = 0 Then List1.AddItem Td.AddItem INListTabl("Name") End If Loop Db. en lugar de añadirla a un list.MDB") Set INListTabl = Db. 'Ejemplo para VB4 o superior Private Sub EnumerarTablas() Dim Db As Database Dim Td As TableDef List1. haces una comparación: If Td.

" Espero que este "truquillo" te alivie algún que otro quebradero de cabeza. la razón es que.17. el VB te avisa de que no hay datos que mostrar. SP4) -----Begin VB.. ya que con los nuevos proyectos no hay problemas. verías que había un comentario sobre que no se puede usar ese control para acceder al nuevo formato de las bases de datos de Access 2000.. cambia el "Access" por "Access 2000. con lo cual." Antiguo: (vb6 SP3. para un control existente. Esto es cierto si lo que estás probando es un proyecto que ya tuvieras hecho anteriormente. lo que se asigna a la propiedad Connect. además de que carga de forma automática la Microsoft DAO 3.. (a pesar de indicar en las referencias que se use el nuevo motor de bases de datos 3.. sin la cual no se puede acceder a las bases del Access 2000.. (que sería la forma lógica de hacerlo). Pero puedes llevarte una sorpresa si. si quieres que tus proyectos pre-SP4 funcionen sin problemas y sin tener que quitar el control existente y añadirlo de nuevo.. Nos vemos Guillermo . Eso es cierto para el VB5 y para el VB6 pre-SP4.. simplemente tendrás que cambiar la asignación que se le hace a dicha propiedad: Nuevo: (vb6.. o anterior) -------Begin VB.Data Data1 Caption = Connect = "Data1" "Access 2000.6)..6 Object Library.. ya que el DAO Datacontrol que se incluye con la nueva "revisión" del VB6 SI reconoce dicho formato.. (si miras con un editor de textos el contenido de un formulario de VB).Un consejo si instalas VB6 SP4 para acceder a bases de datos de Access 2000 (10/Nov/00) Si has leido el artículo sobre el acceso a bases de datos de Access 2000 usando el DAO Datacontrol (Acceder a bases de datos de Access 2000 con el VB5).Data Data1 Caption = "Data1" Connect = "Access" Es decir... es diferente del que se asigna para uno nuevo.

.. desde el índice lo puedes hacer Confío en que no acabes tarumba con tantas vueltas que estoy dando... para que te vayas acostumbrando. hasta que finalmente nos quedemos con ese tipo de acceso a datos. la entrega anterior fue sobre las clases en Visual Basic y esta que te ofrezco ahora sigue los pasos de la entrega 36 sobre el acceso a bases de datos. Vayamos al tema que nos interesa.. sin el datacontrol. y no me preguntes dónde conseguirlas.. veremos lo mismo. aunque en esta ocasión sin usar el data control y con DAO. ya que no es plan de hacer "marketing" gratuito a los distribuidores que "no sponsorizan" este curso básico.. así que tendrás que usar la versión Profesional o la Empresarial.NET y habrá que ir "concienciándose" de la nueva tecnología. ¡hum! Crea un nuevo proyecto. (que es parecido al usado en las entregas anteriores de acceso a datos): . esa serán las versiones de las que deberías disponer. ya que a partir del 2002 la "nueva ola" será . pero no te preocupes que también podrás aprenderla..... se creará un proyecto con un formulario.. pero como hay que está a la última en esto de programación. talvez no muy lejano.. pero usando ADO. pero si de verdad te quieres dedicar a esto de la programación. así que también ve preparando el cuerpo. Añade los siguientes controles para que el formulario quede con el aspecto que te muestro a continuación... aunque no lo es tanto..... Cómo acceder a bases de datos DAO. aunque ya deberías saber crear tus propios formularios y añadir los controles que te indique. aunque eso será en un futuro. En otra entrega.. Empecemos desde el principio. ya que las venden en cualquier "tienda" de informática o en los distribuidores que puedes encontrar en Internet.. Sólo decirte que usando la versión 5CCE de Visual Basic no se pueden acceder a datos.Curso Básico de Programación en Visual Basic Entrega Cuarenta: 04/Sep/2001 por Guillermo "guille" Som Si quieres linkar con las otras entregas.. aunque prácticamente no te lo haya explicado en el curso... habrá que hacerles caso..... es algo que te enseñan en prácticamente cualquier libro e incluso en los "tutoriales" que incluye el Visual Basic.... para que no te quedes atrás. ya que Microsoft no "quiere" que sigamos usando DAO y lo trata como obsoleto..

en la que podemos indicar varios criterios de búsqueda. Text1. una especie de búsqueda avanzada. un array de 0 a 3 Label1. selecciona Microsoft DAO 3. . Uno de esos objetos es el objeto Database.. cmdActualizar. cmdBuscarSig Elbotón de salir es: cmdSalir En el menú Proyecto/Referencias. Text2.. introducir y modificar los datos de cualquier tabla incluida en la base de datos a la que queramos acceder.. "Un objeto Recordset representa los registros de una tabla o los registros del resultado de ejecutar una consulta". cualquiera de ellas vale. eso. aunque también.. después de cerrar el cuadro de diálogo no verás nada nuevo en la ventana de herramientas..5/3. todo dependerá de la versión de DAO que tengas instaladaA diferencia de cuando seleccionas un componente.. ¿Qué es un Recordset? Según la ayuda de Visual Basic.. cmdBuscar...51 Compatibility Library.... un array de 0 a 2. pero si que añaden nuevas librerías que exponen objetos que podemos usar en nuestra aplicación. Option2.6 e incluso la 2. puede que también tengas la 3... el cual se usará para "mantener" una referencia a la base de datos. No te preocupes que veremos algunos ejemplos de "consultas". es algo más sencillo que todo eso... un array de 0 a 2 cmdAdd. como verás pronto.Aspecto del formulario en tiempo de diseño Los controles usados son: En la parte superior: cmdMover.51 Object Library aunque también puedes seleccionar cualquier otra que empiece por Microsoft DAO.. cmdBorrar El segundo grupo: Label2. entre otras cosas.. Una consulta es. Option1. una consulta. ya que las referencias no añaden nuevos controles. con la cual podremos abrir recordsets que nos permitirán.

añade estas líneas: Option Explicit Private db As Database Private rs As Recordset De esta forma tendremos una variable llamada db que apuntará al objeto Database y otra. rs tendrá el mismo funcionamiento que el que tenía Data1. hay que crear unas variables para dichos objetos. llamada rs. en el formulario hay cuatro botones. por tanto en la sección de declaraciones del formulario (General/Declaraciones). para ello vamos a crea una constante.MDB" A continuación abrimos la base de datos usando la función OpenDatabase. este tipo de recordset permite mostrar y modificar los datos asignados a dicho recordset. si así lo prefieres. el sitio exacto en el que se encuentra la base de datos. dbOpenDynaset) La constante dbOpenDynaset le indica al método OpenRecordset que lo que queremos asignar a la variable rs. uno de los parámetros que espera recibir dicha función es el path de la base de datos que queremos abrir. además de este tipo de recordset. existen otros los cuales sólo se pueden usar para "recorrer" los datos o mostrarlos. que se usarán para esa . En el evento Form_Load asignaremos los "objetos reales" a esas dos variables. Para que te hagas una idea. en la cual tendrás que indicar el path correcto. (de tipo Recordset). en particular las entregas 34 y 35. podemos acceder al contenido de la tabla Authors tal y como lo haciamos antes con el control Data. Const sPathBase As String = "C:\Program Files\Microsoft Visual Studio\VB98\BIBLIO. pero no permiten modificarlos. ' Crear el objeto de base de datos Set db = OpenDatabase(sPathBase) A continuación creamos el objeto recordset a partir de una "consulta" realizada a la base de datos.Para poder manejar los objetos Database y Recordset. el cual nos permitía movernos por los diferentes registros de la tabla. ese tipo de recordset también lo veremos en esta misma entrega.OpenRecordset("SELECT * FROM Authors".MDB. Como no tenemos un control data. que apuntará a un objeto del tipo Recordset. Una vez que tenemos la variable rs. es del tipo Dynaset. la cual devuelve un objeto de la base de datos recién abierta. en este caso lo que queremos "consultar" son TODOS los campos de la tabla Authors: ' Crear el recordset con la tabla que queremos manipular Set rs = db. necesitamos saber el path en el que se encuentra dicha base de datos. en nuestro ejemplo usaremos el contenido de la constante anterior: sPathBase. en nuestro caso será BIBLIO. es decir.Recordset en los ejemplos de las entregas anteriores sobre acceso a datos. la base de ejemplo que se incluye con Visual Basic. Para poder abrir la base de datos.

tenemos que "controlar" si ya estamos al principio o al final del recordset para posicionarnos en el registro adecuado.BOF Then rs.MoveLast End If ' ' Si estamos antes del primero. Como es posible que el usuario pulse en el botón anterior o siguiente después de estar al principio o al final respectivamente.EOF = True Then Exit Sub End If ' ' Mover al registro indicado según el botón pulsado If Index = 0 Then ' Al primero rs. En los comentarios puedes ver qué valor corresponde con cada movimiento. es que no hay datos en el recordset. anterior. significa que el recordset está "antes" del primer registro. para ello comprobamos que ni BOF ni EOF den como resultado un valor verdadero. mover al último ElseIf rs.EOF Then rs.MovePrevious ElseIf Index = 2 Then ' Al siguiente rs. . ' es que no hay datos. salir del procedimiento If rs. Cuando BOF es True.MoveFirst ElseIf Index = 1 Then ' Al anterior rs. por otro lado EOF será True cuando estemos después del final de los registros. siguiente o último registro. Cuando estas dos propiedades devuelven un valor verdadero.MoveNext ElseIf Index = 3 Then ' Al último rs. A continuación movemos el "puntero" del recordset al registro indicado. mover al primero If rs.BOF = True And rs.tarea: movernos tanto al primero.MoveFirst ' Si estamos después del último. por tanto. mostrar los datos If Err = 0 Then MostrarRegistro End If ' Err = 0 End Sub Lo primero que hacemos es comprobar si hay datos en el recordset. el código para hacerlo es el que te muestro a continuación: Private Sub cmdMover_Click(Index As Integer) On Error Resume Next ' ' Cuando las propiedades BOF y EOF dan como resultado TRUE.MoveLast End If ' Si no se ha producido error. según el valor de Index sabremos que botón se ha pulsado y por tanto que "acción" tenemos que elegir.

tenemos que hacerlo por nuestros medios.Fields("Au_ID") Text1(1) = . pero ahora no tenemos un control que "automatice" esta tarea. así que.Fields("Au_ID") = Text1(0) + 0 ' Añadimos una cadena vacía al final ' ya que si Text1(1) está vacío. por suerte no es tan difícil. notarás que no era necesario llamar expresamente a un procedimiento para que los datos se mostraran. El código de Añadir un nuevo registro: Private Sub cmdAdd_Click() ' Añadir un nuevo registro With rs . actualizar uno ya existente y eliminar el registro actual.Fields("Author") = "Nuevo Autor" ' Actualizamos los datos. para saber que es un nuevo dato . si todo ha ido bien. With rs Text1(0) = .AddNew ' Añadimos algún texto. así que no asignarlo '.Edit ' Este campo es autonumérico. llamamos al procedimiento que muestra el contenido del registro activo en las cajas de texto. se asignará un valor NULL y dará error ... esto era así porque el propio datacontrol se encargaba de actualizar la información en los controles que tenía "enlazados".Fields("Year Born") End With End Sub Si le echas un vistazo al código de las pruebas con el control Data. (no se ha producido un error).Update End With End Sub El código de Actualizar el contenido de las cajas de texto en el recordset: Private Sub cmdActualizar_Click() ' Guardar el contenido de las cajas de texto With rs ' Antes de actualizar los datos del recordset. Ahora vamos a ver los procedimientos de Añadir un nuevo registro.Fields("Author") = Text1(1) & "" .Fields("Author") Text1(2) = .Por último. Esto último lo hace el procedimiento MostrarRegistro. En el propio código encontrarás la explicación de que es lo que hace cada línea usada. para que se graben en el recordset . cuyo código es el siguiente: Private Sub MostrarRegistro() ' Mostrar los datos del registro actual ' A este procedimiento hay que llamarlo cada vez que ' queramos mostrar los datos del registro actual. ' hay que ponerlo en modo edición .

se sumará 0 .. se usa el recordset "cargado" con los datos y que está contenido en la variable rs. Private Sub cmdBuscar_Click() ' Buscar el primer registro que coincida con el dato buscado Buscar End Sub Private Sub cmdBuscarSig_Click() ' Buscar el siguiente 'Buscar Siguiente:=True Buscar True End Sub Private Sub Buscar(Optional ByVal Siguiente As Boolean = False) ' Procedimiento para buscar el dato indicado (18/Ene/01) ' Si Siguiente = True.BOF) Then ' Eliminar el registro actual rs. como siempre. básicamente estas tareas son prácticamente iguales a las usadas con el datacontrol. el cual es también prácticamente lo mismo que cuando se tenía el datacontrol.. dará error If Not (rs.Update End With End Sub Y por último el código para eliminar un registro.. Ahora veremos el código usado para buscar los datos. Este es el código de buscar y buscar siguiente. se busca a partir del registro activo Dim nReg As Long Dim sBookmark As String . borrar es muy fácil. para lo cual usamos los métodos FindFirst y FindNext respectivamente.Delete ' ' Movemos al primer registro cmdMover_Click 0 End If End Sub Bien. con la salvedad de que hay que mostrar los datos cuando se cambia el registro activo.. Fíjate que la única diferencia es que en lugar de usar la propiedad Recordset del datacontrol. ' para ello se comprueba que no hayamos pasado del principio o el final del Recordset ' ' Comprobar que hay registros.' Idem con el año de nacimiento.EOF Or rs.Fields("Year Born") = Text1(2) + 0 ' Actualizar los datos en el recordset . pero como es numérico. Private Sub cmdBorrar_Click() ' Borrar el registro actual ' Se comprueba que haya algún registro activo. porque si no hay.

NoMatch Then Err. podemos acelerar esa tarea de "obtener" la información que queramos realizando consultas en lugar de ir buscando uno por uno los datos. sBookmark = . Independientemente de cómo hagamos la consulta. incluso a veces nos interesa buscar más de un dato a la vez. If .Value Then ' Convertir el contenido de TextBox en un número nReg = Val(Text2) ' en el campo Au_ID sBuscar = "Au_ID = " & nReg End If If Option2." ' Posicionar el recordset en la posición guardada .MoveFirst . ya que al fin y al cabo el resultado de dicha .. Eso mismo se puede hacer con FindFirst y FindNext. Pero hay ocasiones en las que a veces es necesario poder ver TODO el resultado de la búsqueda.Bookmark = sBookmark End If ' Mostrar los datos del registro actual MostrarRegistro End With End Sub ¿Cómo realizar consultas con DAO? Ya hemos visto cómo introducir y modificar registros. también hemos visto cómo buscar un dato y seguir mostrando el resto de las coincidencias que se vayan produciendo. es decir..FindFirst sBuscar Else ' Busca a partir del registro actual .Value Then ' en el campo Author sBuscar = "Author Like '" & Text2. Pero además de usar recordsets de sólo lectura.Bookmark ' If Siguiente = False Then ' Buscar desde el principio . siempre nos quedará el recurso de poder usar los métodos FindXXX para buscar a su vez datos dentro del resultado de la consulta.Text & "'" End If ' With rs ' Guardar la posición anterior..Clear MsgBox "No existe el dato buscado o ya no hay más datos que mostrar.Dim sBuscar As String ' ' Iniciamos la detección de errores On Error Resume Next ' ' Buscar la primera coincidencia en el recordset del Data1 If Option1.. por si no se halla lo buscado.FindNext sBuscar End If ' Devolverá un error si no se halla lo buscado ' aunque no siempre es así. podemos buscar en más de un campo del mismo registro el dato o datos que nos interesa a un mismo tiempo.

. del segundo formulario El código para configurar el ListView en tiempo de ejecución para mostrar la información de la tabla Authors de la base de datos Biblio. Para añadir un control ListView a nuestro proyecto. verás que se han añadido nuevos controles a la barra de herramientas (ToolBox). en mi caso.. ¡que lio! ahora veremos con ejemplos cómo funciona todo esto. selecciona la opción Componentes del menú Proyecto y del cuadro de diálogo que te muestra. selecciona el que representa al Listview y añadelo al formulario. también vamos a quitar los botones de búsqueda. ya que.. porque no tiene sentido tenerlos. ya que tengo instalado esas dos versiones de VB. vamos a usar un control ListView. primero hay que "añadir" el control a la barra de herramientas de Visual Basic.0.. (pude que a continuación de este nombre te muestre la versión de Visual Basic. mediante código configuraremos la apariencia. selecciona Microsoft Windows Common Controls. además de añadir el ListView.mdb lo pondremos en el evento Form_Load y es el siguiente: With ListView1 ' El tipo de Listview que queremos es del tipo "reporte" .consulta se almacena en un objeto recordset. El aspecto del formulario sería el siguiente: El aspecto. Para mostrar el resultado de la "búsqueda" o consulta. me muestra 6. para ello. Si quieres puedes crearte un nuevo proyecto para esta "segunda" prueba. pero también la 5.0 (SP2). Una vez que has pulsado en Aceptar. al menos para el propósito de este ejemplo. en tiempo de diseño.

2700 . If (.Add ..ColumnHeaders.ListItems. tendría que ser del tipo dbOpenDynamic Set tRs = db.SubItems(2) = .LabelEdit = lvwManual ' Añadimos las cabeceras .ListItems. .Add .ColumnHeaders.GridLines = True ' Que no se puedan modificar los datos del listview . 900 .Add . dbOpenSnapshot) ' Comprobar que hay datos en el recordset With tRs ' Si no hay datos. así como para búsqueda en múltiples campos. el cual no es modificable ' para poder modificarlo. .. 1500.Fields("Au_ID") & "") tLi.Fields("Year Born") & "" .Add(. "Autor".Clear . lvwColumnRight End With Ahora la búsqueda sólo se hará por el nombre del autor y se mostrarán en la lista todos los autores que coincidan con los datos que queremos buscar. En la próxima entrega veremos el código que habría que usar para hacer esto mismo pero usando ADO.EOF) Then MsgBox "No se han encontrado los datos buscados" Else ' Mostrar los datos hallados ListView1.. "Año nacimiento".OpenRecordset(sBuscar.BOF And .Fields("Author") & "" tLi. "Au_ID".MoveNext Loop End If End With End Sub En otra ocasión veremos cómo "diseñar" un formulario para consultas con distintas opciones de búsqueda.ColumnHeaders. . . .SubItems(1) = . . El código del botón Buscar sería el siguiente: Private Sub cmdBuscar_Click() ' Mostrar los datos en el listview Dim sBuscar As String Dim tRs As Recordset Dim tLi As ListItem ' ' Formar la cadena de la consulta: ' Se busca por el nombre del autor y se muestran clasificados por el nombre sBuscar = "SELECT * FROM Authors WHERE Author LIKE '" & Text2 & "' ORDER BY Author" ' Creamos un recordset del tipo "estático".MoveFirst Do While Not .EOF Set tLi = ListView1.View = lvwReport ' Que muestre las líneas de separación entre datos .

Así que. paciencia y a ser buenos. Nos vemos Guillermo .