ORDSCOPE y DBF grandes

Post Reply
Loren
Posts: 458
Joined: Fri Feb 16, 2007 10:29 am
Location: Cadiz - España

ORDSCOPE y DBF grandes

Post 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.
postinelli
Posts: 128
Joined: Tue Jul 15, 2008 7:12 pm
Location: Argentina

Re: ORDSCOPE y DBF grandes

Post 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
hmpaquito
Posts: 1200
Joined: Thu Oct 30, 2008 2:37 pm

Re: ORDSCOPE y DBF grandes

Post by hmpaquito »

El scope no te sirve para lo que pretendes, prueba asi:
http://xthefull.blogspot.com.es/2014/02 ... er-to.html
User avatar
acuellar
Posts: 1312
Joined: Tue Oct 28, 2008 6:26 pm
Location: Santa Cruz-Bolivia

Re: ORDSCOPE y DBF grandes

Post 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
Saludos,

Adhemar C.
User avatar
karinha
Posts: 4882
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: ORDSCOPE y DBF grandes

Post by karinha »

Excelente. Gracias.
João Santos - São Paulo - Brasil
User avatar
FranciscoA
Posts: 1964
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: ORDSCOPE y DBF grandes

Post by FranciscoA »

Gracias, Adhemar por postearlo. Y a TheFull por compartir su codigo.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh1204-MySql-TMySql
derpipu
Posts: 93
Joined: Tue Mar 28, 2006 4:09 pm
Location: Tequila, Jalisco Mexico
Contact:

Re: ORDSCOPE y DBF grandes

Post 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
Luis Fernando Rubio Rubio
Post Reply