Академический Документы
Профессиональный Документы
Культура Документы
VB (29/Sep/2001)
Para poder crear una base de datos, desde Visual Basic,
usando ADO (ActiveX Data Objects), tenemos que crear en nuestro proyecto una
referencia a: Microsoft ADO Ext. 2.6 for DDL and Security (msadox.dll), y
crear un objeto del tipo Catalog.
Nota: Esta referencia es para la versin 2.6 de ADO, por tanto
puede ser que, si la versin que tienes instalada es otra, en lugar de
2.6 aparezca otra numeracin.
ADOX slo est disponible a partir de la versin 2.1 de ADO.
Else
' Para Access 2000
.Columns.Append "Nombre", adVarWChar, 50
de 50 caracteres
.Columns.Append "email", adVarWChar, 100
.Columns.Append "Telefono", adVarWChar
' Permite
.Columns("email").Attributes = adColNullable
.Columns("Telefono").Attributes = adColNullable
.Columns("Observaciones").Attributes = adColNullable
End With
'
' Aadir la nueva tabla a la base de datos
cat.Tables.Append tbl
'
Set tbl = Nothing
Set cat = Nothing
En este ejemplo, tenemos que tener asignadas las variables sProvider (el
proveedor), sNombreBase (el nombre y path de la base de datos)
y sNombreTabla para el nombre de la tabla.
Para una base de datos del tipo Access 97, sProvider =
"Microsoft.Jet.OLEDB.3.51"
Para una base de datos del tipo Access 2000, sProvider =
"Microsoft.Jet.OLEDB.4.0"
Nota:
Los tipos de datos de cadena adVarChar y adLongVarChar son los que
aceptan las tablas para Access 97,
las tablas de Access 2000 se deben usar los del tipo adVarWChar y
adLongWChar.
Nota 2:
Los campos se aaden a la tabla por orden alfabtico,
independientemente del orden en el que se han aadido.
Nota del 27/Dic/02:
Esto slo ocurre si se usa el JET 3.51, con JET 4.0 los crea en el orden
indicado al crearlos.
Gracias Jose Angel Calvo.
Si alguien sabe cmo hacer que no se clasifiquen, (en JET 3.51), por favor que me
lo diga, gracias
Para ms informacin: Defining and Retrieving a Databases Schema (MDAC
Technical Articles)
El cdigo:
'
' cboProvider
'
Dim cat As ADOX.Catalog
'
' Si se produce un error: interceptarlo
On Error GoTo ErrCrearBase
'
Set cat = New ADOX.Catalog
'
' Si existe la base de datos, preguntar si queremos borrarla
If Len(Dir$(txtNombreBase.Text)) Then
If MsgBox("La base de datos ya existe." & vbCrLf & _
"Quieres Borrarla?", _
vbQuestion + vbYesNo + vbDefaultButton2 _
) = vbNo Then
Exit Sub
Else
Kill txtNombreBase.Text
End If
End If
'
' Crear la base de datos
cat.Create "Provider=" & cboProvider.Text & ";" & _
"Data Source=" & txtNombreBase.Text & ";"
'
MsgBox "Base de datos creada satisfactoriamente."
'
' Para no "colarnos" en la rutina de error
Exit Sub
'
ErrCrearBase:
' Una
' Una
Else
' Para Access 2000
.Columns.Append "Nombre", adVarWChar, 50
cadena de 50 caracteres
' Una
'
.Columns("Telefono").Attributes = adColNullable
.Columns("Observaciones").Attributes = adColNullable
End With
'
' Aadir la nueva tabla a la base de datos
cat.Tables.Append tbl
'
SalirCrearTabla:
Set tbl = Nothing
Set cat = Nothing
'
Exit Sub
'
ErrCrearTabla:
' Mostrar el mensaje de error
MsgBox "Error al crear la tabla:" & vbCrLf & _
Err.Number & " " & Err.Description, _
vbExclamation, "Error al crear la tabla"
Err.Clear
Resume SalirCrearTabla
End Sub
Private Sub cmdCompactar_Click()
' Compactar una base de datos con ADO
Dim sDBTmp As String
Dim je As JRO.JetEngine
'
On Error GoTo ErrCompactar
'
Set je = New JRO.JetEngine
'
' Crear un nombre "medio" aleatorio
sDBTmp = "DBT_" & Format$(Minute(Now), "00") & Format$
(Second(Now), "00") & ".mdb"
' Asegurarnos de que no existe una base con el nombre temporal
If Len(Dir$(sDBTmp)) Then
Kill sDBTmp
End If
'
lblInfo.Caption = " Compactando la base de datos..."
lblInfo.Refresh
'
' Compactar la base de datos
je.CompactDatabase "Data Source=" & txtNombreBase.Text & ";", _
"Data Source=" & sDBTmp & ";"
'
' Eliminar la base de datos original
Kill txtNombreBase.Text
'
' Renombrar la base temporal con el original
Name sDBTmp As txtNombreBase.Text
'
lblInfo.Caption = " Base de datos compactada."
lblInfo.Refresh
'
Exit Sub
'
ErrCompactar:
' Mostrar el mensaje de error
MsgBox "Error al compactar la base de datos:" & vbCrLf & _
Err.Number & " " & Err.Description, _
vbExclamation, "Error al compactar la base de datos"
Err.Clear
lblInfo.Caption = " *** Error al compactar la base de datos ***"
lblInfo.Refresh
End Sub
Private Sub Form_Load()
With Me.cboProvider
.AddItem "Microsoft.Jet.OLEDB.4.0"
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
'path de la base
'path del usuario
'nombre de la base del
'Constante para los
'Nmero de bases
'varios usos
'variable del bucle
Ahora tenemos que empezar con el form principal. Hay que crear una
serie de campos/apartados para manejar o seleccionar la tabla con la
que vamos a trabajar y todo eso.
Yo particularmente no uso el SSTab, (no me gusta el aspecto que tiene),
prefiero el control de Windows95, pero como s que hay algunos por
ah que usan todava el Windows 3.1, me lo pensar...
Eso ser ms adelante, ahora vamos "a complicarnos la vida".
Cmo? Pues creando dos forms uno para las Tareas y otro para las
Anotaciones.
Realmente no es para complicarnos la vida, es para no complicarmela
yo demasiado.
Me explico: El proyecto ir avanzando y teniendo ms cosillas, pero
poco a poco; si tienes que esperar a que est todo acabado... en fin.
Aunque lo estoy "diseando" todo lo "modular" que puedo, para
intentar que cada "mdulo" sea lo ms independiente posible... al final
se podran complicar demasiado las cosas y no quiero que eso ocurra.
Por tanto, slo voy a incluir el cdigo necesario para crear y usar la
tabla de Tareas. El resto del programa, vendr ms adelante y
usaremos las dos tablas en conjunto, a lo mejor hasta DbGrids y
DbList y todas esas cosas que empiezan por DBxxx que tanto os
gustan. (y que yo no uso nunca!)
Vamos al tajo, es decir a currar. (un momento que voy a comprobar cun largo es
este fichero..., vuelvo, ...es aceptable, as que seguiremos un poco ms en este... )
Pensemos que es lo que vamos a necesitar:
Un DataControl, 7 etiquetas y 7 TextBox (una para cada campo de la
tabla) y algn que otro botn, etc.
Dnde los colocamos? Por ahora usaremos el form principal es decir
gsNotas.frm
Vamos a ver el aspecto que tendr y un poco de explicacin de los
controles.
La lnea de
botones
desde Nuevo
a Pegar son
cmdAccion(x)
y los ndices
de 0-Nuevo
hasta 2Borrar
El botn Salir
sigue igual,
pero hay que
incluirlo en el
Picture1, que
tiene la
propiedad
Align Top, sin
bordes, Flat y
con fondo
gris claro.
Las
etiquetas:
Label1(x) y
los ndices
desde el 0Fecha a 5Fecha
Trmino.
Las cajas de
Texto:
Text1(x)
Asunto (2) y
Descripcin
(3) son
Multiline.
Terminado es:
Check1
Ahora hay que aadir lo siguiente, para poder empezar a usar la base
de datos que se supone habremos creado antes de entrar en el "form"
principal.
'--------------------------------------------------------------'Form para la entrada de datos de las Tareas
( 7/Mar/97)
'
'Primera tentativa: 7/Mar/97
'
'cdigo de ejemplo realizado por Guillermo Som
'--------------------------------------------------------------Option Explicit
Dim YaEstoyAqui As Boolean
'Para el Text2
'constantes para los botones de accin
Const CMD_NUEVO = 0
Const CMD_ACTUALIZAR = 1
Const CMD_BORRAR = 2
'Constantes para las acciones de actualizacin, etc del Data
Const EM_NOTHING = 0
Const EM_EDIT = 1
Const EM_ADDNEW = 2
'Constantes para el campo
Const cID = 0
Const cFecha = 1
Const cAsunto = 2
Const cDescripcion = 3
Const cFechaInicio = 4
Const cFechaTermino = 5
Const cTerminada = 6
Private Sub Check1_Click()
'Actualizar el Text asociado
Text1(cTerminada) = Check1.Value
End Sub
Private Sub cmdAccion_Click(Index As Integer)
If Index = CMD_NUEVO Then
'Nuevo registro
YaEstoyAqui = True
Data1.Recordset.AddNew
Data1.Enabled = False
YaEstoyAqui = False
Text1(1).SetFocus
ElseIf Index = CMD_ACTUALIZAR Then
'Guardar el contenido de cada uno de los campos
If Data1.EditMode = EM_ADDNEW Then
Data1.Recordset.Update
Else
Data1.Recordset.Edit
Data1.Recordset.Update
If Data1.EditMode = 0 Then
'
Else
Data1.UpdateControls
End If
End If
Data1.Enabled = True
Data1.Refresh
Data1.Recordset.MoveLast
Text1(1).SetFocus
ElseIf Index = CMD_BORRAR Then
'Borrar registro
If MsgBox("Seguro que quieres borrar este registro?", 4 + 32
+ 256) = 6 Then
Data1.Recordset.Delete
Data1.Refresh
If Not Data1.Recordset.EOF Then
Data1.Recordset.MoveLast
Else
Data1.Caption = "No hay registros"
End If
End If
End If
End Sub
Else
Vamos al tajo. Hoy la cosa va de preparar una consulta (query o bsqueda, como prefieras
llamarla).
La utilidad gsInput, para crear dilogos al estilo del MsgBox e InputBox, pero con iconos
programables.
'gsInput.Bas
'-------------------------------------------------'Mdulo para funcin de confirmacin
(26/Jul/96)
'
' Guillermo Som Cerezo, 1996-97
'
'Revisado: ( 5/Mar/97)
'Nueva versin: Simulacin de InputBox (22/Mar/97)
'
'Funcin para "simular" una caja de dilogo... ms o menos
'Necesita el form gsInput.frm
'-------------------------------------------------Option Explicit
Global BotonPulsado As Integer
'Constantes para el tipo
Global Const cSi = vbOK
Global Const cSiNo = vbYesNo
Global Const cSiNoCancelar = vbYesNoCancel
Global Const cSiCancelar = vbOKCancel
Global Const cSiATodo = 8
'Constantes para el botn pulsado
Global Const cBotonSi = vbYes
'6
Global Const cBotonNo = vbNo
'7
Global Const cBotonCancelar = vbCancel '2
Global Const cBotonSiATodo = 8
'8
Private Sub PosicionarControles(sEntrada As String, iTipo As Integer,
sCaption As String, Optional vMostrarText)
'---------------------------------------------' Ajusta los controles a mostrar
'---------------------------------------------Dim i As Integer
Dim j As Integer
Dim iQueBoton As Integer
Dim fHeight As Integer
Dim mIzq As Integer
'La posicin ms a la
izquierda
Dim bMostrarText As Boolean
If IsMissing(vMostrarText) Then
bMostrarText = False
Else
bMostrarText = CBool(vMostrarText)
End If
iQueBoton = 0
If iTipo >= 512 Then
iQueBoton = 3
iTipo = iTipo Mod 512
ElseIf iTipo >= 256 Then
iQueBoton = 2
iTipo = iTipo Mod 256
End If
With frmConfirm
If bMostrarText Then
.Text1.Enabled = True
.Text1.Visible = True
Else
.Text1.Enabled = False
.Text1.Visible = False
End If
If iTipo And vbCritical Then
.Image1(0).Picture = .Image1(1).Picture
iTipo = iTipo - vbCritical
ElseIf iTipo And vbQuestion Then
.Image1(0).Picture = .Image1(2).Picture
iTipo = iTipo - vbQuestion
ElseIf iTipo And vbExclamation Then
.Image1(0).Picture = .Image1(3).Picture
iTipo = iTipo - vbExclamation
ElseIf iTipo And vbInformation Then
.Image1(0).Picture = .Image1(4).Picture
iTipo = iTipo - vbInformation
Else
'Exclamacin por defecto
.Image1(0).Picture = .Image1(3).Picture
End If
.Label1(0).Visible = True
.Label1(0) = sEntrada
fHeight = .Label1(0).Top + .Label1(0).Height + 1040
If .Text1.Enabled Then
fHeight = fHeight + 420
End If
If fHeight < 2500 Then
fHeight = 2500
End If
.Height = fHeight
If .Text1.Enabled Then
.Text1.Top = fHeight - 1220
End If
.Command1(0).Top = fHeight - 800
'Usar enabled en lugar de visible, ya que hasta que se haga el
show
.Command1(2).Enabled = True
.Command1(3).Enabled = True
ElseIf iTipo = vbOKCancel Then
.Command1(3).Enabled = True
.Command1(0).Caption = "Aceptar"
Else
'Si slo se muestra un botn...
.Command1(0).Caption = "Aceptar"
End If
'Ajustar la localizacin, segn los botones mostrados
mIzq = 0
For i = 3 To 0 Step -1
.Command1(i).Top = .Command1(0).Top
If .Command1(i).Enabled Then
If mIzq = 0 Then
mIzq = .ScaleWidth - 1215
Else
mIzq = mIzq - 1170
End If
.Command1(i).Left = mIzq
.Command1(i).Visible = True
Else
.Command1(i).Visible = False
End If
Next
'Centrar el form
.Move (Screen.Width - .Width) \ 2, (Screen.Height - .Height) \
2
.Caption = sCaption
End With
End Sub
Public Function InputConfirm(sEntrada As String, sTexto As String,
Optional vTipo, Optional vCaption, Optional vPrograma, Optional
vIcono) As Integer
'---------------------------------------------' Muestra la ventana de confirmacin
'---------------------------------------------'Segn el valor de iTipo, se mostrar:
'
Si es > de 256, seleccionar No
'
Si es => de 512, seleccionar Cancelar
'
Aceptar
vbOk
'
Si, No
vbYesNo
'
Si, No, Cancelar
vbYesNoCancel
'
Si, SiATodo, No, Cancelar
8
'Tipo de icono a mostrar:
'
Stop
vbCritical
16
'
Interrogacin
vbQuestion
32
'
Exclamacin
vbExclamation
48
'
Informacin
vbInformation
64
'---------------------------------------------'El valor devuelto ser:
'
Si
vbYes
'
SiATodo
8
'
No
vbNo
'
Cancelar
vbCancel
'---------------------------------------------Dim i As Integer
Dim j As Integer
Dim iTipo As Integer
'
DoEvents
'Loop Until BotonPulsado
'
frmConfirm.Show vbModal
'=====================================================================
=====
MsgConfirm = BotonPulsado
Unload frmConfirm
DoEvents
End Function
El cdigo de gsInput.frm
'-------------------------------------------------' gsInput.frm
(22/Mar/97)
'
' Guillermo Som Cerezo, 1996-97
'
'Basado en gsConfirm
(26/Jul/96)
'Revisado:
( 5/Mar/97)
'Nueva versin: Simulacin de InputBox (22/Mar/97)
'Si se hacen las modificiones mnimas, se puede usar en VB3 (3/Abr/97)
'
'Funcin para "simular" una caja de dilogo... ms o menos
'Necesita el mdulo gsInput.bas
'-------------------------------------------------Option Explicit
'Declaraciones del API
#If Win32 Then
Private Declare Function GetClassWord Lib "user32" _
(ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function ExtractIcon Lib "shell32.dll" Alias
"ExtractIconA" _
(ByVal hInst As Long, ByVal lpszExeFileName As String,
ByVal nIconIndex As Long) As Long
Private Declare Function DrawIcon Lib "user32" _
(ByVal hDC As Long, ByVal X As Long, ByVal Y As Long,
ByVal hIcon As Long) As Long
#Else
Private Declare Function GetClassWord Lib "User" _
(ByVal hWnd As Integer, ByVal nIndex As Integer) As
Integer
Private Declare Function ExtractIcon Lib "shell.dll" _
(ByVal hInst As Integer, ByVal lpszExeFileName As String,
ByVal nIconIndex As Integer) As Integer
Private Declare Function DrawIcon Lib "User" _
(ByVal hDC As Integer, ByVal X As Integer, ByVal Y As
Integer, ByVal hIcon As Integer) As Integer
#End If
Public Sub ExtraerIcono(sPrograma As String, queIcon As Integer)
'Cargar el icono indicado del programa
#If Win32 Then
Dim myhInst As Long
Dim hIcon As Long
Dim i As Long
Veamos ahora el cdigo que hay que aadir para realizar la bsqueda.
(He cambiado la estructura IF...THEN por una SELECT...CASE)
Case CMD_BUSCAR
'Buscar registros
'Si no estamos en un Text de bsqueda, salir
If ControlActual = 0 Then Exit Sub
Static sBuscar As String
Dim sTmp As String
Dim i As Integer
If InputConfirm("Escribe el dato a buscar", sBuscar,
vbOKCancel + vbQuestion, _
"Buscar datos") <> vbCancel Then
sBuscar = Trim$(sBuscar)
If Len(sBuscar) Then
YaEstoyAqui = True
Data1.Recordset.FindFirst
Text1(ControlActual).DataField & _
" LIKE '" &
sBuscar & "*'"
If Data1.Recordset.NoMatch Then
Beep
MsgBox "No se ha hallado el dato buscado en el
campo: " & Text1(ControlActual).DataField, vbOK + vbInformation,
"Buscar"
Text1(ControlActual).SetFocus
Else
sTmp = sBuscar
If Left(sTmp, 1) = "*" Then
sTmp = Mid$(sTmp, 2)
End If
'Seleccionar el texto hallado
With Text1(ControlActual)
i = InStr(.Text, sTmp)
.SelStart = i - 1
.SelLength = Len(sTmp)
'posicionarse en ese control
.SetFocus
End With
End If
YaEstoyAqui = False
End If
End If
Bien, es simple no?
Si te das cuenta uso la variable ControlActual para saber el control que est seleccionado. Esta
variable est declarada en el Form, para que sea accesible a todo el Formulario. En el evento
Text1_GotFocus se le asigna el valor del ndice:
If ControlActual = 0
YaEstoyAqui = True
Data1.Recordset.FindNext Text1(ControlActual).DataField & " LIKE '" & sBuscar &
"*'"
If Data1.Recordset.NoMatch Then
Beep
MsgBox "No se han hallado ms coincidencias del dato buscado en el campo: " &
Text1(ControlActual).DataField, vbOK + vbInformation, "Buscar Siguiente"
Text1(ControlActual).SetFocus
Else
sTmp = sBuscar
If Left(sTmp, 1) = "*" Then
sTmp = Mid$(sTmp, 2)
End If
'Seleccionar el texto hallado
With Text1(ControlActual)
i = InStr(.Text, sTmp)
.SelStart = i - 1
.SelLength = Len(sTmp)
'posicionarse en ese control
.SetFocus
End With
End If
YaEstoyAqui = False
End If
Nota: Si cambias de campo, buscar el contenido de sBuscar dentro de los registros de ese
campo.
cmdAccion(i).Enabled = False
Next
cmdAccion(CMD_ACTUALIZAR).Enabled = True
Data1.Enabled = False
YaEstoyAqui = False
Text1(1).SetFocus
End If
Case CMD_ACTUALIZAR
'Volver a habilitar los botones y poner la variable a False
For i = CMD_NUEVO To CMD_BuscarSiguiente
cmdAccion(i).Enabled = True
Next
esNuevo = False
'...
Este form se podr redimensionar y permitir editar el registro seleccionado, pero eso ser en
la prxima ocasin (que prometo ser muy pronto, intentar que sea en esta misma noche)
Dim iH As Integer
ventana
Dim iW As Integer
Ahora si, estas son las cosillas para hoy:
1.
2.
'Tamao mnimo de la
3.
4.
5.
mnuArc
mnuNuevo
mnuGuardar
mnuBorrar
mnuArcSep1
mnuSalir
mnuEd
mnuCortar
mnuCopiar
mnuPegar
mnuEdSep1
mnuSelecTodo
mnuEdSep2
mnuBuscar
mnuBuscSig
mnuReemplazar
Shortcut
Shortcut
Shortcut
=
=
=
^X
^C
^V
Shortcut
^E
Shortcut
Shortcut
Shortcut
=
=
=
^B
{F3}
^R
Ya tenemos unos cuantos mens creados, ahora vamos a asignarles los comandos a realizar.
El tema de la Edicin (cortar, copiar, etc., lo dejaremos para otra ocasin)
Aade la siguiente declaracin en la parte general del Form:
Const CMD_Reemplazar = 5
Y este es el cdigo para los mens que ahora estan operativos: (fijate que la opcin de
Reemplazar, se efectuar en el interior del procedimiento del cmdAccion, aunque ese botn no
exista, el VB slo procesa la orden que le digamos y no comprueba si el valor Index recibido en
el procedimiento est dentro del rango de botones creados)
Private Sub mnuBorrar_Click()
cmdAccion_Click CMD_BORRAR
End Sub
Private Sub mnuBuscar_Click()
cmdAccion_Click CMD_BUSCAR
End Sub
Private Sub mnuBuscSig_Click()
cmdAccion_Click CMD_BuscarSiguiente
End Sub
Private Sub mnuGuardar_Click()
cmdAccion_Click CMD_ACTUALIZAR
End Sub
Private Sub mnuNuevo_Click()
cmdAccion_Click CMD_NUEVO
End Sub
Private Sub mnuReemplazar_Click()
cmdAccion_Click CMD_Reemplazar
End Sub
Private Sub mnuSalir_Click()
cmdSalir_Click
End Sub
sFFBuscar = txtFind.Text
sFFPoner = txtReplace.Text
If Len(sFFPoner) = 0 Then
iFFAccion = cFFAc_Buscar
Else
iFFAccion = cFFAc_Reemplazar
End If
Unload Me
End Sub
Private Sub cmdReplaceAll_Click()
ActualizarCombo
sFFBuscar = txtFind.Text
sFFPoner = txtReplace.Text
If Len(sFFPoner) = 0 Then
iFFAccion = cFFAc_Buscar
Else
iFFAccion = cFFAc_ReemplazarTodo
End If
Unload Me
End Sub
Private Sub Combo1_Change(Index As Integer)
If bBuscandoEnCombo Then Exit Sub
If Index = 0 Then
txtFind = Combo1(0).Text
Else
txtReplace = Combo1(1).Text
End If
End Sub
Private Sub Combo1_Click(Index As Integer)
If bBuscandoEnCombo Then Exit Sub
If Combo1(Index).ListIndex Then
Combo1(Index).Text =
Combo1(Index).List(Combo1(Index).ListIndex)
End If
If Index = 0 Then
txtFind = Combo1(Index).Text
Else
txtReplace = Combo1(Index).Text
End If
End Sub
Private
Dim
Dim
Dim
Dim
Dim
Dim
Sub Form_Load()
j As Integer
i As Integer
n As Integer
vTmp As String
sTmp As String
sTag As String
sFFIni = "BuscReemp.ini"
End If
'Posicionar en el centro de la ventana principal
Move (Screen.Width - Width) \ 2, (Screen.Height - Height) \ 2
'asignar los valores anteriores del combo
For i = 0 To 1
sTag = Trim$(Combo1(i).Tag)
n = 0
n = LeerIni(sFFIni, sTag, "NumEntradas", n)
If n > NumeroMaximoDeItems Then n = NumeroMaximoDeItems
'For j = n - 1 To 0 Step -1
For j = 0 To n - 1
vTmp = "Entrada" & CStr(j)
sTmp = LeerIni(sFFIni, sTag, vTmp, "")
If Len(sTmp) Then
Combo1(i).AddItem sTmp
End If
Next
Next
Combo1(0).Text = ""
Combo1(1).Text = ""
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
'Si se cierra por el controlbox, o cualquier forma distinta del
propio cdigo,
'asumir que se ha cancelado.
If UnloadMode <> vbFormCode Then
iFFAccion = cFFAc_Cancelar
End If
End Sub
Private
Dim
Dim
Dim
Dim
Dim
Dim
hallado = True
Exit For
End If
Next
If Not hallado Then
Combo1(k).AddItem sTmp, 0
End If
End If
Next
bBuscandoEnCombo = False
End Sub
Este es el listado del mdulo con las rutinas de peticin de los datos
'--------------------------------------------------------------'gsDBR.bas Mdulo para el dilogo de Buscar y Reemplazar
'
'(c)Guillermo Som, 1996-97
'--------------------------------------------------------------Option Explicit
'Variables y constantes para buscar/reemplazar
Global sFFBuscar As String
Global sFFPoner As String
Global iFFAccion As Integer
'Constantes para la accin a realizar
Global Const cFFAc_Cancelar = True
Global Const cFFAc_IDLE = 0
Global Const cFFAc_Buscar = 1
Global Const cFFAc_BuscarSiguiente = 2
Global Const cFFAc_Reemplazar = 3
Global Const cFFAc_ReemplazarTodo = 4
Global Const cFFAc_Aceptar = 5
'
Global sFFIni As String
'Archivo de configuracin
.Show vbModal
End With
spuvValor = sFFPoner
End Sub
Ahora la rutina de bsqueda quedara as, (he puesto tambin que si hay texto seleccionado, se
ponga ese para buscar)
Case CMD_BUSCAR
'Buscar registros
'Si no estamos en un Text de bsqueda, salir
If ControlActual = 0 Then Exit Sub
'Si hay texto seleccionado...
With Text1(ControlActual)
If .SelLength > 0 Then
sBuscar = "*" & Trim$(.SelText)
End If
End With
If gsBuscar(sBuscar, , "Buscar datos") > cFFAc_IDLE Then
sBuscar = Trim$(sBuscar)
If Len(sBuscar) Then
YaEstoyAqui = True
Data1.Recordset.FindFirst Text1(ControlActual).DataField & " LIKE '" & sBuscar
& "*'"
If Data1.Recordset.NoMatch Then
Beep
MsgBox "No se ha hallado el dato buscado en el campo: " &
Text1(ControlActual).DataField, vbOK + vbInformation, "Buscar"
Text1(ControlActual).SetFocus
Else
sTmp = sBuscar
If Left(sTmp, 1) = "*" Then
sTmp = Mid$(sTmp, 2)
End If
'Seleccionar el texto hallado
With Text1(ControlActual)
i = InStr(.Text, sTmp)
.SelStart = i - 1
.SelLength = Len(sTmp)
'posicionarse en ese control
.SetFocus
End With
End If
YaEstoyAqui = False
End If
End If
End If
End With
sFFBuscar = sBuscar
sFFPoner = ""
iFFAccion = gsReemplazar(sFFBuscar, sFFPoner)
If iFFAccion <> cFFAc_Cancelar Then
MousePointer = vbHourglass
DoEvents
sBuscar = Trim$(sFFBuscar)
'Quitar de los caracteres de asterscos
Do While InStr(sFFBuscar, "*")
i = InStr(sFFBuscar, "*")
sFFBuscar = Left$(sFFBuscar, i - 1) & Mid$(sFFBuscar, i + 1)
Loop
If Len(sFFBuscar) <> 0 And Len(sFFPoner) <> 0 Then
If iFFAccion = cFFAc_Reemplazar Or iFFAccion = cFFAc_ReemplazarTodo Then
LblStatus = "Buscando " & sBuscar & "..."
DoEvents
YaEstoyAqui = True
Data1.Recordset.FindFirst Text1(ControlActual).DataField & " LIKE '" &
sBuscar & "*'"
If Data1.Recordset.NoMatch Then
Beep
MsgBox "No se ha hallado el dato buscado en el campo: " &
Text1(ControlActual).DataField, vbOK + vbInformation, "Reemplazar"
Text1(ControlActual).SetFocus
BusquedaNoHallada = True
End If
YaEstoyAqui = False
Do Until BusquedaNoHallada
sTmp = Text1(ControlActual).Text
'cambiar... (comprobar si es palabra completa)
If Left$(sBuscar, 1) = "*" Then
i = InStr(sTmp, sFFBuscar)
Else
If Left$(sTmp, Len(sFFBuscar)) = sFFBuscar Then
i = 1
Else
i = 0
End If
End If
If i Then
sTmp = Left$(sTmp, i - 1) & sFFPoner & Mid$(sTmp, i +
Len(sFFBuscar))
Text1(ControlActual).Text = sTmp
End If
If iFFAccion = cFFAc_Reemplazar Then Exit Do
'Cambiar todas las coincidencias en el msmo text
j = 1
Do
If Left$(sBuscar, 1) = "*" Then
i = InStr(j, sTmp, sFFBuscar)
Else
If Left$(sTmp, Len(sFFBuscar)) = sFFBuscar Then
i = 1
Else
i = 0
End If
End If
If i Then
j = i + 1
sTmp = Left$(sTmp, i - 1) & sFFPoner & Mid$(sTmp, i +
Len(sFFBuscar))
Text1(ControlActual).Text = sTmp
End If
Loop While i
DoEvents
YaEstoyAqui = True
Data1.Recordset.FindNext Text1(ControlActual).DataField & " LIKE '" &
sBuscar & "*'"
If Data1.Recordset.NoMatch Then
BusquedaNoHallada = True
Else
BusquedaNoHallada = False
End If
YaEstoyAqui = False
Loop
End If
End If
MousePointer = vbDefault
DoEvents
End If