XBase - pregunta sobre xbase++

 
Vista:

pregunta sobre xbase++

Publicado por juan pujol (1 intervención) el 26/05/2005 22:50:10
Por favor: Por qué xBase++ no retorna el resultado cuando hago una busqueda con indice al contenido del campo ("NC") en la tabla "tipos", pero sí retorna resultado de búsqueda cuando le agrego el comando dbgobottom? Si la tabla es grande (100.000 registros por ejemplo, la búsqueda se demora demasiado) esto no es eficiente. Anexo código fuente abajo:

Procedure main
XDBQ:=CURDRIVE()+":\"+CURDIR()+"\"+STRTRAN(G_CAMINO,"\","")
cCon := "DBE=ODBCDBE;DRIVER={Microsoft dBase Driver
(*.dbf)};DBQ="+XDBQ+";DATABASE="+XDBQ
oSessionDBF:=DacSession():new(cCon)
oSessionDBF:setProperty(ODBCSSN_INDEX_AUTOOPEN, .T.)
IF !oSessionDBF:isconnected()
MSGBOX( "Unable to connect..." )
QUIT
ENDIF
DbeSetDefault( "ODBCDBE" )

SQL("CREATE INDEX TIPOS ON TIPOS(TIPO_COMP)")
USE TIPOS NEW
MSGBOX(INDEXKEY()) // Result= TIPO_COMP

* DBGOBOTTOM() //If this line is not commented, it works OK!

IF DBSEEK("EG")
MSGBOX("Found!")
ELSE
MSGBOX("Not found")
ENDIF
RETURN
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Solución para la búsqueda ineficiente con índice en XBase++

Publicado por Alejandro (13 intervenciones) el 17/07/2023 16:31:40
El problema que estás experimentando en tu código es probablemente debido a la falta de una orden de índice adecuada antes de realizar la búsqueda. Cuando se trabaja con bases de datos grandes, es importante asegurarse de que los índices estén abiertos y optimizados para obtener resultados eficientes.

En tu código, estás creando un índice llamado "TIPOS" en el campo "TIPO_COMP" al principio del programa. Sin embargo, no se realiza ninguna operación para abrir o activar el índice antes de realizar la búsqueda con DBSEEK(). Por lo tanto, es posible que el índice no esté disponible o no esté en uso cuando se realiza la búsqueda.

Al descomentar la línea "DBGOBOTTOM()" antes de la búsqueda, es probable que se active el índice y se mueva al final de la tabla, lo cual puede hacer que funcione la búsqueda posterior. Sin embargo, esto no es una solución eficiente, ya que requiere recorrer todos los registros antes de realizar la búsqueda.

Para solucionar este problema y hacer que la búsqueda sea más eficiente, te recomendaría seguir estos pasos:

1. Después de crear el índice, utiliza la función INDEXSEEK() para posicionar el cursor en el primer registro del índice. Esto abrirá el índice y lo preparará para realizar búsquedas eficientes. Puedes hacerlo de la siguiente manera:

1
INDEXSEEK("TIPOS", "TIPO_COMP")

2. A continuación, puedes realizar la búsqueda utilizando DBSEEK() como lo estás haciendo actualmente. El índice estará abierto y optimizado, lo que debería mejorar el rendimiento de la búsqueda.

1
2
3
4
5
IF DBSEEK("EG")
   MSGBOX("Found!")
ELSE
   MSGBOX("Not found")
ENDIF

Al utilizar INDEXSEEK() para abrir y posicionar el índice antes de la búsqueda, deberías obtener resultados más eficientes sin necesidad de utilizar DBGOBOTTOM(). Esto evitará tener que recorrer todos los registros antes de realizar la búsqueda y mejorará el rendimiento, incluso en tablas grandes con 100,000 registros.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar