URGENTE-CONSULTA SQL CON ADO?

SPOW
13 de Julio del 2004
Hola colegas, bueno he estado haciendo varias preguntas
esta semana en cuestion del mismo tema pero el problema
es que no he podido conseguir resolver mi problema aún.
Estoy realizando un sistema de consulta de personas el
cual el campo clave declarado para realizar la busqueda
es la cedula. La base de datos esta hecha en access luego
de haber sido migrada de un txt. El problema principal
que se me presenta es que la base de datos contiene 3
millones de registros y no hallo la manera de que me
realice la consulta sin tardar tanto tiempo en encontrar
el registro. He intentado varias formas utilizando
diferentes tipos de sentacias sql pero de igual forma el
proceso tarda muchisimo tiempo. Actualmente por
sugerencias de otros colegas realize la programación en
ado utilizando el componente adodc pero no puedo realizar
las consultas como deseo:

Private Sub cmdbuscar_Click()
Buscar
End Sub

Private Sub Adodc1_MoveComplete(ByVal adReason As
ADODB.EventReasonEnum, ByVal pError As ADODB.Error,
adStatus As ADODB.EventStatusEnum, ByVal pRecordset As
ADODB.Recordset)
' Mostrar el ID del registro actual
' si se pasa del primero o del último, dará error

On Error Resume Next

' Mostrar el ID del registro actual usando el
recordset pasado como parámetro
Adodc1.Caption = "Registro actual: " &
pRecordset.AbsolutePosition

If Err Or pRecordset.BOF Or pRecordset.EOF Then
Adodc1.Caption = "Ningún registro activo"
End If

Err = 0
End Sub

Private Sub Form_Load()
TXTcedula.Text = ""
Const sPathBase As String = "C:Consulta de
Venezolanosvzlano6.mdb"
'
' Crear la conexión manualmente
' Con "Provider=Microsoft.Jet.OLEDB.4.0;" se permite
abrir bases de datos de Access 2000
With Me.Adodc1
.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & sPathBase & ";"
'& _
"Persist Security Info=False"
' Indicarle de que tabla vamos a leer los datos
.RecordSource = "flecedvnz6"
.recordsource = "SELECT cedula FROM flecedvnz6
Where Cedula = " & TXTcedula.Text & "" Intento
utilizar esta instruccion pero me da error y no conecta
la data
End With
' Indicar el DataSource de los Textboxes
' ya que con ADO se puede asignar en tiempo de
ejecución
Dim i As Long
For i = 0 To 2
Set TXTapell1.DataSource = Adodc1
Set TXTapell2.DataSource = Adodc1
Set TXTnombre1.DataSource = Adodc1
Set TXTnombre2.DataSource = Adodc1
Set TXTfech_nac.DataSource = Adodc1
Set TXTfech_expe.DataSource = Adodc1
Next
' Asignar los campos
TXTapell1.DataField = "Apell1"
TXTapell2.DataField = "Apell2"
TXTnombre1.DataField = "Nombre1"
TXTnombre2.DataField = "Nombre1"
TXTfech_nac.DataField = "Fech_nac"
TXTfech_expe.DataField = "Fech_expe"
End Sub

Private Sub Buscar(Optional ByVal Siguiente As Boolean =
False)
' Si Siguiente = True, se busca a partir del registro
activo
Dim nReg As Long
Dim vBookmark As Variant ' En ADO debe ser Variant,
no vale un String
Dim sADOBuscar As String
'
' Iniciamos la detección de errores
On Error Resume Next
'
' Buscar la primera coincidencia en el recordset del
Data1
' Convertir el contenido de TextBox en un número
nReg = Val(TXTcedula.Text)
' en el campo Au_ID
sADOBuscar = "Cedula = " & nReg
'sADOBuscar = "SELECT cedula FROM flecedvnz6 Where
Cedula = " & nReg
' Guardar la posición anterior, por si no se halla lo
buscado...
vBookmark = Adodc1.Recordset.Bookmark
'
If Siguiente = False Then
' Buscar desde el principio
Adodc1.Recordset.MoveFirst
Adodc1.Recordset.Find sADOBuscar
Else
' Busca a partir del registro actual
Adodc1.Recordset.Find sADOBuscar, 1
End If
' Devolverá un error si no se halla lo buscado
' aunque no siempre es así...
If Err.Number Or Adodc1.Recordset.BOF Or
Adodc1.Recordset.EOF Then
Err.Clear
MsgBox "No existe el dato buscado o ya no hay más
datos que mostrar."
' Posicionar el recordset en la posición guardada
Adodc1.Recordset.Bookmark = vBookmark
End If
End Sub


Agradezco mucho de tu ayuda porque de verdad estoy muy
preocupado al no hallar una solución la cual no creo que
no exista.. Gracias.. Si tienes alguna sugerencia de
algun modo diferente en el cual lo pueda realizar te lo
agradezco

semperfimxl
13 de Julio del 2004
Si aceptas sugerencias, y estas en posibilidad de probar, puedes en todo caso utilizar DAO y el metodo SEEK de los recordsets en DAO.

Por si no lo has hecho ya, para esto sera necesario
que generes un indice para busqueda desde Access;
dicho indice constara en este caso de la CEDULA
como unico dato. En Access abres la tabla en modo
Diseño, daz click en Ver/Indices; especificas el
nombre del indice (Index_Cedula en el ejemplo abajo)
y el o los campos que integraran dicho indice (CEDULA en tu caso), con orden Ascendente.
Guardas los cambios y listo...

>>>>>

Dim oDatabase as Database
Dim oRSet as Recordset

Private Sub Form_Load()

' Abres tu base de datos
Set oDatabase = Opendatabase("C:Consulta de
Venezolanosvzlano6.mdb")

' Abres la tabla a utilizar (de acuerdo con tu ejemplo)
Set oRSet = oDatabase.OpenRecordset("flecedvnz6")

' A continuacion indicas el Indice a utilizar en la tabla
' previamente generado el mismo desde Access
' de acuerdo con lo que te comente al principio...

oRSet.Index = "Index_Cedula"

End Sub

Private Sub cmdbuscar_Click()

' Aprovechando el indice en uso, utilizas el metodo SEEK de DAO para accesar directamente el registro
que necesitas...

oRSet.Seek "=", TXTcedula.Text

' Si el registro no es encontrado, indicarlo al usuario
' y salirse del sub de busqueda

If oRSet.NoMatch Then
msgbox "Registro No Encontrado"
Exit Sub
End If

' Si el metodo .NOMATCH es falso significa que si se
' encontro el registro; se cargan por tanto los TEXT
' con los valores apropiados...

TXTapell1 = ORSet.Fields("Apell1")
TXTapell2 = ORSet.Fields("Apell2")
TXTnombre1 = ORSet.Fields("Nombre1")
TXTnombre2 = ORSet.Fields("Nombre1")
TXTfech_nac = ORSet.Fields("Fech_nac")
TXTfech_expe = ORSet.Fields("Fech_expe")

End Sub

>>>>>>

Por supuesto, habra otras formas de hacer lo que necesitas, pero veo (aunque no he leido completos las sugerencias que te han dado), que no has encontrado la forma ideal de accesar tu informacion...


Saludos !

SPOW
13 de Julio del 2004
Hola Colega, de verdad que muchisimas gracias por tu ayuda, de esta manera si pude resolver el problema que tenia. Cualquier duda que tengas puedes consultarme tambien. Mi email es [email protected] Estamos para ayudarnos... Gracias

Curk
13 de Julio del 2004
Spow, si aun tienes problemas con tu base de datos enviame un mail para darte unos ejemplos de bases de datos DAO para que los revises y le saques probecho...
[email protected], [email protected]
Maracaibo Venezuela.