Page 1 of 1
ORDSCOPE y DBF grandes
Posted: Thu Apr 09, 2015 11:02 am
by Loren
Compañeros,
En una DBF-CDX con aprox 1.000.000 registro, necesito filtrar según parte del contenido del campo "NOMBRE".
La tabla está indexada por NOMBRE y necesito que me filtre todos aquellos registros que contengan la palabra "GARCIA" en el campo Nombre.
¿ Como se haría con SCOPE ?
Mil gracias.
LORENZO.
Re: ORDSCOPE y DBF grandes
Posted: Thu Apr 09, 2015 11:20 am
by postinelli
el scope yo lo uso siempre y es rapidisimo
el tema es que no filtra por "contenga"
sólo funciona por la clave del indice activo
en tu caso en una base indexada por Nombre te va a filtrar los que comiencen con GARCIA, pero no si dice JUAN GARCIA
se entiende?
así lo hago yo
USE DBF INDEX DBF
OrdScope(0,"GARCIA")
OrdScope(1,"GARCIA")
browse()
te deberian salir sólo los registros que comiencen con GARCIA
Re: ORDSCOPE y DBF grandes
Posted: Thu Apr 09, 2015 11:56 am
by hmpaquito
El scope no te sirve para lo que pretendes, prueba asi:
http://xthefull.blogspot.com.es/2014/02 ... er-to.html
Re: ORDSCOPE y DBF grandes
Posted: Thu Apr 09, 2015 5:26 pm
by acuellar
Aquí un ejemplo funcional del aporte de TheFull
Code: Select all
#include "fivewin.ch"
REQUEST DBFCDX
Function main()
RddSetDefault( "DBFCDX" )
cPath:="CUSTOMER.DBF"
USE (cPath) new
cNombre:="harry" //cambiar el nombre
FastFilter( "*"+ Upper( cNombre ), 1 ) //El 1 para indicar el numero del Indice
dbGotop()
Browse()
return nil
Function FastFilter( cCad, nOrder )
Local nIndice := OrdNumber()
Set order to nOrder
INDEX ON &(IndexKey()) TAG _TEMP_ TO tHarbourt CUSTOM ADDITIVE MEMORY
Set order to nOrder
dbGotop()
Do While OrdWildSeek( cCad, .T. )
OrdKeyAdd( "_TEMP_" )
Enddo
OrdSetFocus( "_TEMP_" )
Return nIndice
Saludos,
Adhemar
Re: ORDSCOPE y DBF grandes
Posted: Thu Apr 09, 2015 5:54 pm
by karinha
Excelente. Gracias.
Re: ORDSCOPE y DBF grandes
Posted: Thu Apr 09, 2015 7:04 pm
by FranciscoA
Gracias, Adhemar por postearlo. Y a TheFull por compartir su codigo.
Re: ORDSCOPE y DBF grandes
Posted: Fri May 22, 2015 4:07 pm
by derpipu
Hola, buenos dias a todos, desde Tequila, Jalisco, México.
Estaba investigando porque el ORDKEYCOUNT() ya no me regresaba el numero correcto de renglones de mi tabla, cuando hacia SCOPE y me topo con este post, y me intereso muchisimo..
Ya lo probe y el mejoramiento de la velocidad de la consulta es enorme, cerca de 2 minutos menos que con mi consulta actual, ahora mi duda es como hacer por ejemplo cuando usamos rangos para la consulta...
En mi codigo actual hacia esto
Code: Select all
SELECT ingre; ingre->(ORDSETFOCUS("ingre4dx"))
cScope0 := mPromo1 + mDesa1 + DTOS( mFech1 ) + STR( mNumero1, 1 )
cScope1 := mPromo2 + mDesa2 + DTOS( mFech2 ) + STR( mNumero2, 1 )
ingre->( ORDSCOPE( 0, cScope0 ) )
ingre->( ORDSCOPE( 1, cScope1 ) )
ingre->( DBGOTOP() )
y con la modificacion siguiendo el ejemplo hago esto
Code: Select all
SELECT ingre; ingre->(ORDSETFOCUS("ingre5dx"))
ingre->( FastFilter( "*" + DTOS( mFech1 ) + mDesa1 + STR( mNumero1, 1 ), 5 ) ) //El 1 para indicar el numero del Indice
Sin embargo notaran que solo uso el rango inicial, pero no el final y seria interesante el saber como integrarlo...
Agradezco de antemano sus valiosas aportaciones en especial al master TheFull y aCuellar, por entregarnos digerido el ejemplo...
Saludos