Vous êtes sur la page 1sur 10

Bases de Datos con Visual Basic

Actualizado el 05-Oct-1999

Contenido:
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 cdigo VB (27/Feb)
10.Crear una base de datos, usando cdigo VB (18/Abr)
11.Como crear un Formulario de Datos con un Grupo de Registros Subyacente (18/Abr)
12.Cambiar los caracteres extraos por ? (para usar en las consultas a bases de datos con LIKE) (20/Abr)
13.Procesar el resultado de una consulta con varias tablas para evitar registros duplicados (13/Jul)
14.Programacin sobre la seguridad de Access (31/Ago)
15.Un mtodo rpido para efectuar bsquedas (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 Imagenes de una base de datos sin usar el DataControl
20.Acceder a bases de Access 2000 (usando el datacontrol de ADO) (31/Ago/99)
21.Acceder a bases de datos usando ADO (sin el data control) (31/Ago/99)
22.Acceder a bases de datos de Access 2000 con el VB5 (05/Oct/99)

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.Carga la base de datos en Access
2.Selecciona la tabla a copiar
3.En el men de Edicin, selecciona Copiar
4.En el men de Edicin, selecciona Pegar
5.Escribe el nuevo nombre de la tabla
6.Selecciona "Estructura solamente"
Ya est la tabla "duplicada" en la misma base de datos, por si haces cambios de los que despus te
arrepientas.
Si la intencin 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 tambin 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 segn tengis configurado el sistema.

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


Si al crear las tablas de la base de datos usas caracteres acentuados, ees, espacios, etc. Cuando hagas una
consulta o lo uses en un Recordset, etc, ponlos entre corchetes, fijates en cmo se usa ltimaVisita en el
ejemplo anterior.

4.- Procesar una consulta SQL (Execute)


Para ejecutar una orden SQL en una base de datos, 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.Execute SQLTmp, dbFailOnError
If Err Then
MsgBox "Se ha producido un error al ejecutar la orden:" & vbCrLf & SQLTmp
End If

5.- Procesar una consulta SQL creando un Recordset


Se crear un Recordset con el resultado de una consulta SQL realizada a uan base de datos,
posteriormente
se procesarn los datos que ha producido dicha consulta.

Por ejemplo si tenemos una base de datos con nuestra coleccin discogrfica, podramos hacer una
consulta
con todos los CD's de Phil Collins
Suponiendo que el formato de los discos (CD, LP, etc.) es Formato y el Nombre del Autor est en
Cantante, la
orden a ejecutar sera:
SQLTmp = "SELECT * FROM mis_discos WHERE Formato Like '*CD*' AND Cantante Like '*Phil
Collins*'"
Por supuesto se puede usar = en lugar de Like, si estamos seguros de que no necesitamos los comodines,
ya
que la consulta es "bastante" ms rpida. Es decir quedara 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
'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.OpenRecordset(SQLTmp, dbOpenSnapshot)
Err = 0
MySnap.MoveFirst
If Err Then
Err = 0
'no hay datos, avisar
MsgBox "No hay datos que coincidan con la bsqueda especificada," & vbCrLf & "(o no est bien
realizada)", 64, "Listados"
Exit Sub
End If
'Aadir el resultado a un List
List1.Clear
MySnap.MoveFirst
Do Until MySnap.EOF
'Procesar los datos...
'
List1.AddItem MySnap("Cantante") & " " & MySnap("[Cancin]") '...y dems datos
MySnap.MoveNext
Loop
MySnap.Close

6.- Evitar el error al asignar un campo Null de una base de datos.


Adems de evitar el error, es ms rpido que usar If...Then... para comprobar si el campo es nulo o est
vaco.
Para cadenas:

Cadena = "" & rs!Campo


Para nmeros:
Numero = 0 & rs!Campo

7.- Comprobar si un registro se est editando.


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.
Lo que hay que hacer es usar EditMode y comprobar si se est editando.
Veamos un ejemplo:
With Data1.Recordset
'Escribe el cdigo para buscar el registro a editar, etc.
'...
Do While .EditMode = dbEditInProgress
DoEvents
Loop
'Cuando llegue aqu, es que ya est libre...
.Edit
'...hacer los cambios al registro...
.Update
End With
Los valores que devuelve EditMode, pueden ser:
dbEditNone
Si no se est editando.
dbEditInProgress Se est editando actualmente.
dbEditAdd
Se ha aadido un registro con AddNew
y el registro actual todava est en el buffer.

8.- Seleccionar los registros que queremos en un Recordset


Para asignar a un Data (Recordset) los datos que quieras de una tabla, usa la propiedad Recordsource.
Data1.RecordSource = "SELECT * FROM Tabla WHERE (condiciones de seleccin) ORDER BY
campo,
[campo2]"
Data1.Refresh
El Refresh que no se te olvide, si no quieres que produzca error.
Condiciones de seleccin, sern las comparaciones (consulta) que quieres incluir para la seleccin.
Por ejemplo, si quieres incluir todos los clientes de Mlaga que tengan coche, clasificados por la
poblacin:

Data1.RecordSource = "SELECT * FROM Clientes WHERE Provincia = 'Mlaga' AND Coche = 'Si'
ORDER
BY [Poblacin]"
Fijate que Poblacin est entre corchetes, esto es necesario, porque la (o acentuada) es un caracter
"extrao" y se debe poner entre corchetes para que el Jet lo entienda. Lo mismo hay que hacer si el
nombre
del campo incluye espacios.
Otra cosa a tener en cuenta es que si usas =, el contenido del campo "debe coincidir exactamente", si en
Provincia tienes algo como: Mlaga (Andaluca), no lo "encontrar". Para que lo incluya tambin, cambia
el
signo igual por LIKE:
Data1.RecordSource = "SELECT * FROM Clientes WHERE Provincia LIKE '*Mlaga*' AND Coche =
'Si'
ORDER BY [Poblacin]"
Ms cosas, en la parte ORDER BY, se pueden incluir ms de un campo, separados por comas.
El asterisco (*) que hay despus de SELECT, es para que incluya todos los campos de la tabla.
Si slo quieres incluir algunos campos, especificalos en lugar del asterisco y separalos con comas:
Data1.RecordSource = "SELECT Nombre,Apellidos, [Poblacin], Provincia, Coche FROM Clientes
WHERE
Provincia LIKE 'Mlaga' AND Coche = 'Si' ORDER BY [Poblacin]"

9.- Compactar una base de datos, usando cdigo VB (27/Feb)


Este es el cdigo que uso para compactar las bases de datos. Cosa que suelo hacer bastante a menudo,
sobre todo en las que uso en la empresa, que cambian a diario.
Por aquello de la seguridad, mantengo dos copias: la anterior y la ltima. Ms vale prevenir. Nunca se
sabe
cuando se cortar la luz o se quedar colgado el equipo... as que, me curo en salud.
'Cerrar la base (esto slo si la tienes abierta...)
Db.Close
'Liberar memoria y "desligarla"
Set Db = Nothing
'
'Tomar el nombre sin la extensin
sTmp = ""
i = InStr(NombreBase, ".")
If i Then
p=i-1
Else
p = Len(NombreBase)
End If
sTmp = Left$(NombreBase, p)
'Buscar \, para tomar el directorio (path)
For i = p To 1 Step -1
If Mid$(NombreBase, i, 1) = "\" Then
sTmp = Left$(NombreBase, i)
Exit For
End If
Next

If Right$(sTmp, 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 compactacin...
dBaseTmp = sTmp & "~dBase2.mdb"
If Len(Dir$(dBaseTmp)) Then Kill dBaseTmp
If Len(Dir$(sTmp & "~dBase1.mdb")) Then Kill sTmp & "~dBase1.mdb"
'Esta es la madre del cordero, se pueden usar otras "versiones", es cuestin de adecuarte.
CompactDatabase NombreBase, dBaseTmp, dbLangSpanish, dbVersion20
'Guardar una copia de como estaba antes
Name NombreBase As sTmp & "~dBase1.mdb"
'Esta es la base ya compactada, as que asignar el nombre
Name dBaseTmp As NombreBase
'Borrar los ficheros LDB
If Len(Dir$(sTmp & "*.ldb")) Then Kill sTmp & "*.ldb"

10.- Crear una base de datos, usando cdigo VB (18/Abr)


Aprovechando que he puesto la colaboracin de Harvey Triana en esta pgina, pues te voy a poner cmo
crear
una base desde dentro del propio Visual Basic.
Te recomiendo que veas el Proyecto Paso a Paso, en el que puedes tener el cdigo completo y otras
cosillas
que aqu no se van a explicar.
Este es el listado del procedimiento que se encargar de crear la base de datos. Por supuesto, debers
cambiar los nombres de los campos y tipos de datos a tu conveniencia, pero de esta forma, tienes algo por
dnde empezar.
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, idioma espaol y para la versin 2.0 del Jet de Access
'===========================================================================
=====
'Si vas a adaptar este programa para VB3, usa dbVersion11 en lugar de dbVersion20
'===========================================================================
=====
Set Db = CreateDatabase(sBase, dbLangSpanish, dbVersion20)
'
'La constante dbVersion20 no aparece en la ayuda, en su lugar lo hace la dbVersion25
'pero sa no est creada!!!

'
'Primero la tabla de las tareas
Set Tb = Db.CreateTableDef("Tareas")
'Vamos a crear cada uno de los campos
Set Fd = Tb.CreateField("ID", dbLong)
'Ahora vamos a asignar las propiedades de contador, etc.
Fd.Attributes = dbAutoIncrField Or dbUpdatableField Or dbFixedField
Tb.Fields.Append Fd
'El resto de los campos
Set Fd = Tb.CreateField("Fecha", dbDate)
Tb.Fields.Append Fd
Set Fd = Tb.CreateField("Asunto", dbText, 255)
Tb.Fields.Append Fd
Set Fd = Tb.CreateField("Descripcion", dbMemo)
Tb.Fields.Append Fd
Set Fd = Tb.CreateField("FechaInicio", dbDate)
Tb.Fields.Append Fd
Set Fd = Tb.CreateField("FechaTermino", dbDate)
Tb.Fields.Append Fd
Set Fd = Tb.CreateField("Terminada", dbInteger)
Tb.Fields.Append Fd
'Creamos un ndice con el ID
Idx.Name = "PrimaryKey"
Idx.Unique = True
Idx.Primary = True
Idx.Fields = "ID"
Tb.Indexes.Append Idx
'Aadimos la tabla a la base
Db.TableDefs.Append Tb
'
'Creamos la otra tabla: Anotaciones
Set Tb = Db.CreateTableDef("Anotaciones")
'El campo ID, es el contador, etc.
Set Fd = Tb.CreateField("ID", dbLong)
Fd.Attributes = dbAutoIncrField Or dbUpdatableField Or dbFixedField
Tb.Fields.Append Fd
'El resto de los campos
Set Fd = Tb.CreateField("Fecha", dbDate)
Tb.Fields.Append Fd
Set Fd = Tb.CreateField("Tema", dbText, 50)
Tb.Fields.Append Fd
Set Fd = Tb.CreateField("Asunto", dbText, 255)
Tb.Fields.Append Fd
Set Fd = Tb.CreateField("Medio", dbText, 255)
Tb.Fields.Append Fd
Set Fd = Tb.CreateField("Localizacion", dbText, 255)
Tb.Fields.Append Fd
Set Fd = Tb.CreateField("Descripcion", dbMemo)
Tb.Fields.Append Fd
Set Fd = Tb.CreateField("Detalle", dbLongBinary)
Tb.Fields.Append Fd
'Creamos un ndice con el ID
Set Idx = Nothing
'Quitar la referencia anterior
Idx.Name = "PrimaryKey"
Idx.Unique = True
Idx.Primary = True
Idx.Fields = "ID"
Tb.Indexes.Append Idx
'Aadimos la segunda tabla a la base
Db.TableDefs.Append Tb

'Cerramos la base
Db.Close
MsgBox "Nueva base de datos " & sBase & " creada.", vbInformation
End Sub

15.- Un mtodo rpido para efectuar una bsqueda (8/Sep)


En este ejemplo, uso un recordset para hacer la bsqueda, el nico requisito es que tenga un campo
llamado
ID, que ser el que se devuelva con el dato encontrado.
La rutina acepta bsquedas hacia delante y hacia atrs, para buscar hacia atrs la variable buscAtras ser
True.
Se supone que adems tienes una variable (Db) con la base de datos que ests usando.
Aqu tienes el cdigo...
Private Function BuscarEnBase(Optional ByVal sBusqueda As String = "") As Long
'Devuelve el nmero 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.OpenRecordset(sSQL, dbOpenSnapshot)
If Not RsBuscar.EOF Then
'Primera bsqueda
If buscAtras Then
RsBuscar.MoveLast
End If
lID = CLng(RsBuscar("ID"))
Else
lID = 0&
End If
Else
If buscAtras Then
RsBuscar.MovePrevious
Else
RsBuscar.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.MoveLast
RsBuscar.MoveNext
Else
RsBuscar.MoveFirst
RsBuscar.MovePrevious
End If
End If
Err = 0
BuscarEnBase = lID

End Function
Esto es un ejemplo de cmo se llamara a esta funcin, usando el dilogo de buscar y reemplazar:
iFFAtras = True
If gsBuscar(sBuscar, 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 & "..."
DoEvents
'Usar una rutina del tipo consulta (SQL)
qID = BuscarEnBase(Text1(ControlActual).DataField & " LIKE '" & sBuscar & "*'")
If qID Then
Data1.Recordset.FindFirst "ID = " & CStr(qID)
If Data1.Recordset.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).DataField, vbOK + vbInformation, "Buscar"

16.- 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.
Las rutinas sirven igual para VB3 (ejemplo aparte) y VB4 o superior.
Para probar esta rutina, en un form, aade un ListBox (List1) y un botn que al pulsarlo llame a
EnumerarTablas, debers cambiar la localizacin de la base de datos por la que sea en tu equipo...
'Ejemplo para VB4 o superior
Private Sub EnumerarTablas()
Dim Db As Database
Dim Td As TableDef
List1.Clear
Set Db = OpenDatabase("D:\VB\Biblio.MDB")
For Each Td In Db.TableDefs
'Slo las tablas con atributo igual a CERO,
'son tablas normales
If Td.Attributes = 0 Then
List1.AddItem Td.Name
End If
Next
Db.Close
Set Db = Nothing
End Sub
'Para VB3: (en VB4 tambin se puede usar de esta forma)

Private Sub EnumerarTablas()


Dim INListTabl As Snapshot
Dim Db As Database
List1.Clear
Set Db = OpenDatabase("D:\VB\Biblio.MDB")
Set INListTabl = Db.ListTables()
INListTabl.MoveFirst
Do Until INListTabl.EOF
If INListTabl("Attributes") = 0 Then
List1.AddItem INListTabl("Name")
End If
Loop
Db.Close
Set Db = Nothing
End Sub
Si lo que quieres es slo comprobar si existe, en lugar de aadirla a un list, haces una comparacin:
If Td.Name = miTabla Then
ExisteTabla = True
End If

Vous aimerez peut-être aussi