Curso
sobre Visual Basic
por
Guillermo Llanderas
Segunda Parte
Los temas incluidos:
Bases de datos (m�todos y propiedades para el acceso a los datos)
Abrir una base de datos
'Abrir una base de datos: Set database = workspace.OpenDatabase(dbname[,exclusive[,read-only[,source]]]) 'exclusive -> true para abrirla en modo exclusivo. Por defecto, false 'read-only -> true para abrirla en modo read-only. Por defecto, false 'source -> es una cadena que identifica el tipo de base de datos y unos ' argumentos en el caso de ODBC. Los tipos soportados son: ' access no necesita ' dBASE III "dBASE III;" ' dBASE IV "dBASE IV;" ' Paradox 3.x "Paradox 3.x;" ' Paradox 4.x "Paradox 4.x;" ' Btrieve "Btrieve;" ' FoxPro 2.0 "FoxPro 2.0;" ' FoxPro 2.5 "FoxPro 2.5;" ' FoxPro 2.6 "FoxPro 2.6;" ' Excel 3.0 "Excel 3.0;" ' Excel 4.0 "Excel 4.0;" ' Excel 5.0 "Excel 5.0;" ' Text "Text;" ' ODBC "ODBC; ' los argumentos que se lo pueden pasar a ODBC son (por ejemplo): ' DATABASE=defaultdatabase; ' UID=user; PWD=password; ' DSN=datasourcename ' LOGINTIMEOUT=seconds"
Abrir un Recordset perteneciente a una base de datos
'Abre un recordset perteneciente a una base de datos: Set variable = database.OpenRecordset(source[,type[,options]]) 'source -> el origen del recordset. ' si es una tabla, el nombre de la tabla dentro de la base de datos ' si es un dynaset, la instrucci�n SQL de consulta 'type -> el tipo de recordset a abrir. Puede ser: (por defecto dbOpenTable) ' dbOpenTable para un recordset de tipo tabla ' dbOpenDynaset para un recordset de tipo dynaset ' dbOpenSnapshot para un recordset de tipo snapshot 'options -> Opciones para modificar el modo de acceso a las tablas ' dbDenyWrite Impide que otros usuarios escriban en el recordset ' (impide tanto modificacar como a�adir registros) ' dbDenyRead Impide que otros usuarios lean el recordset mientras ' est� abierta (solo para tablas) ' dbReadOnly Se abre en modo lectura. Otros usuarios pueden modificar ' dbAppendOnly Solo puedo a�adir nuevos registros (solo para dynasets) ' (impide leer o modificar los existentes) ' dbInconsistent Se permiten actualizaciones inconsistentes (solo dynasets) ' dbConsistent Solo se permiten actualiza. consistentes (solo dynasets) ' dbForwardOnly Permite desplazarse solamente hacia adelante ' dbSQLPassThrough Se evita el procesador de consultas del Jet. La consulta ' especificada se traslada a un servidor de ODBC para su ' procesamiento ' dbSeeChanges Para que genere un runtime error si otro usuario cambia ' los datos que estoy editando.
Establecer �ndices, filtros y criterios de ordenaci�n
'Establecer �ndices, filtros y criterios de ordenaci�n 'Propiedad Index: especifica el orden de un conjunto de registros en base al ' valor de uno o m�s campos. S�lo est� disponible para tablas. recordset.Index [= indexname] 'indexname -> nombre del �ndice a usar (debe de estar definido en la tabla) 'Propiedad Filter: limita el �mbito de registros, al especificar los que ' cumplan cierto criterio. Solo disponible para dynasets y snapshots recordset.Filter [= value] 'value -> string expression que contiene la clausula WHERE de una consulta ' SQL sin la palabra reservada WHERE 'Propiedad Sort: especifica el orden de un conjunto de registros en base al ' valor de uno o m�s campos. S�lo disponible para dynasets y sanpshots recordset.Sort [=value] 'value -> string expression que especifica la cluasula ORDER BY de una ' consulta SQL sin la palabra reservada ORDER BY
Consultar datos y Modificar registros de un Recordset
'Consultar datos del recodset
recordset.BOF 'Puntero de registro en el principio del recordset
recordset.EOF 'Puntero de registro al final del recordset
recordset.RecordCount 'N�mero de registros del recordset
recordset.NoMatch 'Indica si el �ltimo m�todo de b�squeda o Seek no
' ha conseguido localizar un registro que coincida
' con el criterio especificado
'Modificar registros en el recordset (no sirven para snapshots)
recordset.AddNew 'Prepara el buffer para a�adir un registro nuevo
recordset.Edit 'Prepara el buffer para modificar los datos del
' registro actual
recordset.Update 'Guarda los datos del buffer despu�s de un AddNew
' o de un Update
recordset.Delete 'Borra el registro actual del recordset
{workspace | database}.BeginTrans 'Inicia una transacci�n y establece el
' estado inicial de la base de datos
{workspace | database}.RollBack 'Vuelve la base de datos a su estado
' inicial anterior a la emisi�n de la
' instrucci�n BeginTrans
{workspace | database}.CommitTrans 'Guarda de manera permanente todas las
' modificaciones hechas a la base de
' datos desde el �ltimo BeginTrans
Moverse por la base de datos
'Para moverse por la base de datos:
'M�todos Move: sirven para cambiar la posici�n del puntero del registro
' desde el registro en uso hasta otro
recordset.Move rows[, start]
recordset.{MoveFirst | MoveLast | MoveNext | MovePrevious}
'rows -> signed long que indica el n�mero de columnas que se va a
' mover el puntero de la base de datos
'start -> string que identifica un bookmark a partir del que se va a
' desplazar el puntero 'rows' columnas. Si no se especifica,
' move empieza desde el registro actual
' M�todo A donde mueve el puntero de registro
'MoveFirst Al primer registro del conjunto de registros abierto
'MoveNext Al siguiente registro. Si no hay m�s, se activa EOF
'MovePrevious Al registro anterior. Si no hay, se activa BOF
'MoveLast Al �ltimo registro del conjunto de registros abierto
'M�todos Find: localizan el siguiente registro que cumpla la condici�n.
' Estos m�todos funcionan con dynaset y snapshot
recordset.{FindFirst | FindLast | FindNext | FindPrevious} criteria
'criteria -> una string expression (como la cl�usula WHERE de una consulta
' SQL) usada para localizar el registro.
' M�todo Empieza en Direcci�n de b�squeda
' FindFirst Principio del recordset Hacia el final del recordset
' FindLast Final del recordset Hacia el principio del recordset
' FindNext Registro actual Hacia el final del recordset
' FindPrevious Registro actual Hacia el principio del recordset
'Despu�s de usar estos m�todos, hay que comprobar el estado de la
' propiedad NoMatch. Si es verdadero, el m�todo ha fallado al hallar un
' registro que cumpla los criterios. Si es falso, el puntero est� situado
' en un registro encontrado.
'M�todos Seek: hallan el primer registro de una tabla que cumpla una
' condici�n. Solo se puede usar en tablas (no en dynasets o snapshots)
table.Seek comparison, key1, key2...
'comparison -> Una de estas string expressions: "<", "<=", "=", ">=", or ">"
'key1,key2... -> uno o m�s valores para los campos del �ndice
' Si el operador de comparaci�n es =, >=, > o <>, empieza por el primer
' registro para el �ndice en uso y explora hacia adelante por todo el
' �ndice para hallar la primera coincidencia. Si el operador es < o <=,
' empieza por el �ltimo registro de la tabla y explora hacia atr�s por
' toda la tabla.
'Despu�s de usar estos m�todos, hay que comprobar el estado de la
' propiedad NoMatch. Si es verdadero, el m�todo ha fallado al hallar un
' registro que cumpla los criterios. Si es falso, el puntero est� situado
' en un registro encontrado.
'Propiedad Bookmark: Identifica la ubicaci�n de un registro espec�fico
object.Bookmark [= value]
'value -> una string expression o una variant expression que identifica
' un bookmark v�lido
'Si no se especifica value, la propiedad bookmark devuelve la marca
' identificadora del registro actual. Si es especifica, el puntero de
' registro se desplaza al registro caracterizado por ese bookmark
'Metodo Idle: Suspende el proceso de los datos, permitiendo al JET completar
' una tarea pendiente como optimizacion de memoria o desbloqueos de paginas
DBEngine.Idle [dbFreeLocks]
'dbFreeLocks -> si se especifica esta constante, el proceso se detiene hasta
' que todos los bloqueos son liberados
Ejemplos de acceso a bases de datos
' Acceso a los datos:
Dim Ws As Workspace
Dim dbAcuario As Database
Dim tbClientes As Recordset
Dim dnClientes As Recordset
Dim dnCliente1Prov As Dynaset
Dim ssClientes As Recordset
Dim sClientes As String
Private Sub Form_Load()
Set Ws = DBEngine.Workspaces(0)
'Abre una DB de tipo Access con opciones predeterminadas de acceso a
'lectura/escritura de datos y acceso compartido:
Set dbAcuario = Ws.OpenDatabase("acuario.mdb")
'Abre una tabla de Access con los par�metros impl�citos de uso compartido
'y modo de uso lectura/escritura:
Set tbClientes = dbAcuario.OpenRecordset("Clientes", dbOpenTable)
'Abre un dynaset que consta de todos los registros de la tabla Clientes:
Set dnClientes = dbAcuario.OpenRecordset("SELECT * FROM Clientes", _
dbOpenDynaset)
'Ahora se puede abrir un dynaset a partir del dynaset anterior aplicando
'un filtro y un m�todo de ordenaci�n
dnClientes.Filter = "Provincia = 'Po' AND Ciudad <> 'Tuy'"
dnClientes.Sort = "Provincia,Ciudad"
Set dnCliente1Prov = dnClientes.OpenRecordset(dbOpenDynaset)
'Abre un snapshot que consta de todos los registros de la tabla Clientes:
Set ssClientes = dbAcuario.OpenRecordset("SELECT * FROM Clientes", _
dbOpenSnapshot)
'Establecer el �ndice a usar e inicializar los datos en pantalla
tbClientes.Index = "Nombre"
MsgBox "N�mero total de registros = " & Str(tbClientes.RecordCount)
tbClientes.MoveFirst
'Poner los controles en condiciones iniciales.
PbValidaciones.Visible = False
PbOpciones.Visible = True
For Indice = 0 To 3
TbDatos(Indice).Enabled = False
Next Indice
Call VisualizarDatos
End Sub
'Impresi�n de los campos de la tabla en pantalla (funci�n VisualizarDatos)
Sub VisualizarDatos()
CbPrimero.Enabled = Not TblDirs.BOF
CbAnterior.Enabled = Not TblDirs.BOF
CbSiguiente.Enabled = Not TblDirs.EOF
CbUltimo.Enabled = Not TblDirs.EOF
If TblDirs.BOF Then
TblDirs.MoveFirst
End If
If TblDirs.EOF Then
TblDirs.MoveLast
CbAnterior.SetFocus
End If
TbDatos(0).Text = IIf(IsNull(TblDirs("Nombre")), " ", _
TblDirs("Nombre"))
TbDatos(1).Text = IIf(IsNull(TblDirs("Apellidos")), " ", _
TblDirs("Apellidos"))
TbDatos(2).Text = IIf(IsNull(TblDirs("Direccion")), " ", _
TblDirs("Direccion"))
TbDatos(3).Text = IIf(IsNull(TblDirs("Ciudad")), " ", _
TblDirs("Ciudad"))
End Sub
'Borrar un registro de la tabla
Private Sub CbBorrar_Click()
If MsgBox("+Borrar este registro?", vbYesNo + vbQuestion, "Borrar registro") = 6 Then
TblDirs.Delete
If Not TblDirs.EOF Then
TblDirs.MoveNext
Else
TblDirs.MovePrevious
End If
Call VisualizarDatos
End If
End Sub
'Moverse por la tabla de datos:
'Al primer registro
Private Sub CbPrimero_Click()
TblDirs.MoveFirst
Call VisualizarDatos
CbPrimero.Enabled = False
CbAnterior.Enabled = False
End Sub
'Al registro anterior
Private Sub CbAnterior_Click()
TblDirs.MovePrevious
Call VisualizarDatos
End Sub
'Al registro siguiente
Private Sub CbSiguiente_Click()
TblDirs.MoveNext
Call VisualizarDatos
End Sub
'Al �ltimo registro
Private Sub CbUltimo_Click()
TblDirs.MoveLast
Call VisualizarDatos
CbUltimo.Enabled = False
CbSiguiente.Enabled = False
CbAnterior.SetFocus
End Sub
'A�adir un registro:
Private Sub CbAnadir_Click()
Nuevo = True
For Indice = 0 To 3
TbDatos(Indice).Enabled = True
Next Indice
TbDatos(0).SetFocus
PbValidaciones.Visible = True
PbOpciones.Visible = False
End Sub
'Editar los campos y en el procedimiento OK:
Private Sub CbOK_Click()
For Indice = 0 To 3
TbDatos(Indice).Enabled = False
Next Indice
If Nuevo Then
TblDirs.AddNew
Else
TblDirs.Edit
End If
TblDirs("Nombre") = Left(TbDatos(0).Text, 30)
TblDirs("Apellidos") = Left(TbDatos(1).Text, 30)
TblDirs("Direccion") = Left(TbDatos(2).Text, 40)
TblDirs("Ciudad") = Left(TbDatos(3).Text, 30)
TblDirs.Update
PbOpciones.Visible = True
PbValidaciones.Visible = False
TblDirs.Bookmark = TblDirs.LastModified
Call VisualizarDatos
End Sub
'En el procedimiento de Cancel:
Private Sub CbCancelar_Click()
For Indice = 0 To 3
TbDatos(Indice).Enabled = False
Next Indice
Call VisualizarDatos
PbOpciones.Visible = True
PbValidaciones.Visible = False
End Sub
'Para modificar los datos de un registro:
Private Sub CbModificar_Click()
Nuevo = False
For Indice = 0 To 3
TbDatos(Indice).Enabled = True
Next Indice
TbDatos(0).SetFocus
PbValidaciones.Visible = True
PbOpciones.Visible = False
End Sub
'Editar los campos. Los procedimientos OK y Cancel son iguales a A�adir.
'Al entrar en los campos de datos, poner todo el texto marcado
Private Sub TbDatos_GotFocus(Index As Integer)
TbDatos(Index).SelStart = 0
TbDatos(Index).SelLength = Len(TbDatos(Index).Text)
End Sub
'Buscar un registro en un dynaset o en un snapshot
Dim FindCrit As String
FindCrit = "Direccion = 'Camelias'"
'Busca el primer registro que cumpla esa condici�n
dnCliente1Prov.FindFirst FindCrit
Do While Not dnCliente1Prov.NoMatch
'Busca los siguientes registros que la cumplan
dnCliente1Prov.FindNext FindCrit
Loop
'O bien, se puede hacer la b�squeda al rev�s, empezando por el final
dnCliente1Prov.FindLast FindCrit
Do While Not dnCliente1Prov.NoMatch
'Busca los siguientes registros que la cumplan
dnCliente1Prov.FindPrevious FindCrit
Loop
'Buscar un registro usando el m�todo Seek
tbClientes.Index = "Nombre"
'Buscar el primer cliente cuyo nombre sea mayor que Perez
tbClientes.Seek ">", "Perez"
If tbClientes.NoMatch Then
MsgBox "No aparece"
Else
MsgBox "Apareci�"
End If
'Para buscar por nombre y apellido con una clave compuesta
TblCliente.Seek ">=", "Perez", "F"
'Uso de Bookmark:
'Guarda en sClientes el Bookmark del registro actual
sClientes = tbClientes.Bookmark
'nos movemos a otro registro
tbClientes.MoveNext
'y volvemos al registro que hemos marcado
tbClientes.Bookmark = sClientes
'Se puede usar un array de bookmarks para marcar una serie de registros
'y despu�s acceder a ellos.
ReDim BkMrk(1)
nmbkmk = 0
tbClientes.MoveFirst
Do Until tbClientes.EOF
If birthday Then
nmbkmk = nmbkmk + 1
If nmbkmk > 1 Then
ReDim BkMrk(1 To nmbkmk)
End If
BkMrk(nmbkmk) = tbClientes.Bookmark
End If
tbClientes.MoveNext
Loop
For I = 1 To nmbkmk
tbClientes.Bookmark = BkMrk(I)
Next I