SQL con dao o ado? consultas

Edgar
27 de Junio del 2004
Hola colega, estoy realizando un programa que consulta 3 millones de registros, pero el gran problema es que a la hora de realizar las consultas se tarda una eternidad en encontrar el registro dependiendo de la posición que se encuentre. El indice que declare para realizar las consultas es la cedula de la persona, utilizo instrucciones sql pero de igual manera no me sirve. La base de datos esta echa en Access pero fue de una migracion que realize ya que la misma estaba en formato de archivo de texto y no poseia campos por lo que importe el archivo a access y realize los pasos necesarios para la importacion del mismo y de esta manera pude lograr la tabla que necesitaba con sus campos y toda la información. Lo he realizado en ado pero no hayo la manera de que funcione y lo estoy realizando en dao pero tampoco, agradeceria mucho de tu ayuda para poder solucionar este gran problema.. Gracias de antemano. Aqui presento el codigo que realize:

Public DataBase As DataBase
Public vzla6 As Recordset

Public Sub Abrir()
Set DataBase = OpenDatabase(App.Path & "vzlano6.mdb")
'Set vzla6 = DataBase.OpenRecordset("Flecedvnz6", dbOpenTable)
Set vzla6 = DataBase.OpenRecordset("SELECT cedula FROM flecedvnz6")
End Sub
'
'select cedula from flecedvnz6 where cedula > 17000000 and cedula < 13000000;

Private Sub TXTcedula_Change()
On Error GoTo 30
vzla6.MoveFirst
Do While Not vzla6.EOF
If TXTcedula <> vzla6!cedula Then
vzla6.MoveNext
Else
llenar
Exit Do
End If
Loop
30
If Err.Number = 3022 Then
er = MsgBox("No existe la cédula de identidad en la Base de Datos", vbCritical)
limpiar
TXTcedula.SetFocus
End If
End Sub

Agradezco mucho tu ayuda..

kinoscar
27 de Junio del 2004
tambien se podria probar utilizando un filtro para buscar x cantidad de registros o bien un find para buscar uno solamente

rs.filter=cedula='" & txtcedula.text & "'"

el filter hara que el recordset muestres todos los registros que coincidan con los parametros que le diste

rs.find "cedula='" & cedula.text & "'",,,1

el recordset se posicionara en el primer registro que coincida con los parametros dados partiendo desde el primero, si no encuentra nada entonces rs.eof sera verdadera

estas dos opciones son mucho mas rapido que la comparacion ciclica que muestras

shiquilla
27 de Junio del 2004
Hola, la verdad es que nunca he trabajado con tal cantidad de registros, pero podrías probar a hacer consultas más selectivas procurando ser lo más precisas posible. Es decir... con tal cantidad de registros nunca hagas un Select cedula FROM Tabla y ya está porque tienes que tener en cuenta que la información que recoge un RecordSet lo que hace es generar una "tabla" en memoria... es decir, se lee todos los registros físicos de la tabla que entren en el criterio que le has dicho y se genera una tabla virtual (por decirlo así). Es decir, si lo que quieres es que cuando el usuario teclee algo se busque un registro que empieze por esos caracteres podrías hacer lo siguiente...

Public DataBase As DataBase
Public vzla6 As Recordset

Public Sub Abrir()
Set DataBase = OpenDatabase(App.Path & "vzlano6.mdb")
End Sub

Private Sub TXTcedula_Change()
Dim qd As QueryDef
Dim rs As RecordSet
Set qd = DataBase.CreateQueryDef("")
qd.SQL = "PARAMETERS Ced STRING;SELECT Cedula FROM Tabla WHERE Cedula LIKE 'Ced%'"
qd![Ced] = Cedula.Text
Set rs= qd.OpenRecordset
IF Not rs.EOF Then
'Aquí lo que tengas que hacer
End
Set rs = Nothing
Set qd = Nothing
End Sub

Bueno, espero haberte ayudado.