Busqueda de unos caracteres

Post Reply
elmoiquique
Posts: 323
Joined: Wed May 16, 2007 9:40 pm
Location: Region de Ñuble, Chile

Busqueda de unos caracteres

Post by elmoiquique »

Mi pregunta es la siguiente, necesto saber si hay alguna funcion que busque un caracter determinado dentro de una cadena de caracteres, se que existe la funcion AT(), pero es muy lenta, en una base de datos que tiene sobre 500.000 registros.

tengo una base de dato bastante grande con un campo RDESCRIP largo 150 caracter

necesito buscar una palabra determinada que puede estar una o mas veces dentro del campo, la idea es que a medida que vaya escribiendo se vaya filtrando la informacion, ahora la palabra o caracter puede estar al principio, al medio o al final del registro.
ejemplo


si yo presiono la letra A, debiera msotrarme todos los registro que contienen la letra A, si acontinuacion presiono la B, debiera encontrarme todo loa que contenga AB.

espero habreme explicado

gracias por la ayuda
Fivewin-Xharbour 24.09, Iquique, Chile
User avatar
Antonio Linares
Site Admin
Posts: 42521
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 76 times
Contact:

Post by Antonio Linares »

La función At() es extremadamente rápida ya que practicamente esta implementada al 100% en el propio microprocesador.

Lo que es lento es ir leyendo los registros de uno en uno. La solución a esto, aunque suene increible, es cargar de una vez toda la DBF en memoria usando MemoRead() y entonces hacer el At():

cDatos = MemoRead( "nombre.dbf" )
nPos = At( "lo que busco", cDatos )

Dividiendo el valor devuelto por At() por el tamaño de un registro (+ el tamaño de la cabecera) sabemos inmediatamente en que registro estamos. El siguiente At() se haría a partir de donde se encontró la primera ocurrencia.

Está técnica la implementamos en su día en una base de datos "documental" y los resultados fueron espectaculares. Espero que te sirva :-)

Si la base de datos es extremadamente grande, se iría leyendo en bloques grandes de memoria.
regards, saludos

Antonio Linares
www.fivetechsoft.com
jfafive
Posts: 396
Joined: Tue Mar 18, 2008 9:41 pm
Location: Marbella

Post by jfafive »

Antonio,

Yo tambien estoy usando la función At() para la busqueda de cadenas de caracteres.

Me encuentro con el problema de que si le digo que busque la palabra "hipo", ma va a encontrar indistintamente de si forma parte o no de otra cadena de caracteresa, es decir,

hipo hipopotamo hipocondriaco, etc etc

No consigo hacer que solo encentre la palabra sola "hipo"

He probado así como sigue

At( " hipo ", cTxt )

Pero parece no encontrar diferencia entre eso y esto otro:

At( "hipo", cTxt )

¿alguna sugerencia?
:?
User avatar
Antonio Linares
Site Admin
Posts: 42521
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Has thanked: 31 times
Been thanked: 76 times
Contact:

Post by Antonio Linares »

Javier,

Aqui estos ejemplos funcionan bien:

MsgInfo( At( "hipo", "hipox hipotalamo" ) ) // 1
MsgInfo( At( "hipo ", "hipohipo talamo" ) ) // 5
MsgInfo( At( "hipot", "hipo hipotalamo" ) ) // 6

Tal vez tengas un CRLF despues de la palabra y no un espacio ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
FranciscoA
Posts: 2163
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Busqueda de unos caracteres

Post by FranciscoA »

elmoiquique wrote:Mi pregunta es la siguiente, necesto saber si hay alguna funcion que busque un caracter determinado dentro de una cadena de caracteres, se que existe la funcion AT(), pero es muy lenta, en una base de datos que tiene sobre 500.000 registros.

tengo una base de dato bastante grande con un campo RDESCRIP largo 150 caracter

necesito buscar una palabra determinada que puede estar una o mas veces dentro del campo, la idea es que a medida que vaya escribiendo se vaya filtrando la informacion, ahora la palabra o caracter puede estar al principio, al medio o al final del registro.
ejemplo


si yo presiono la letra A, debiera msotrarme todos los registro que contienen la letra A, si acontinuacion presiono la B, debiera encontrarme todo loa que contenga AB.

espero habreme explicado

gracias por la ayuda



Revisen el ejemplo que he posteado, talvez les sirva.
Saludos.

Francisco J. Alegría P.
Post Reply