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