Page 1 of 1

SORT

Posted: Tue Apr 09, 2013 3:38 pm
by LuisPonce
Hola

Alguien sabe la diferencia entre el __DbSort() y el SORT on .. TO ..

Descrubri que sorteando una tabla de 18,000 registros con el SORT ON TO, demora bastante tiempo 3 minutos o mas, y usando la __DbSort() lo hace en 2 segundos, y no encuentro literatura que me de una razon logica.

Hace alguna diferencia abrir la tabla con sus indices ?

Gracias

Re: SORT

Posted: Tue Apr 09, 2013 4:06 pm
by karinha
// Fuente del xHarbou

Code: Select all

FUNCTION __dbSort( cToFileName, aFields, bFor, bWhile, nNext, nRecord, lRest,;
         cRDD, nConnection, cCodePage )
 LOCAL nOldArea
 LOCAL nToArea
 LOCAL aStruct

 LOCAL oError
 LOCAL lError := .F.

 IF Empty( aStruct := dbStruct() )
   RETURN .F.
 ENDIF

 nOldArea := Select()

 BEGIN SEQUENCE

   dbCreate( cToFileName, aStruct, cRDD, .T., "", NIL, cCodePage, nConnection )
   nToArea := Select()
   dbSelectArea( nOldArea )
   __dbArrange( nToArea, aStruct, bFor, bWhile, nNext, nRecord, lRest, aFields )

 RECOVER USING oError
   lError := .T.
 END SEQUENCE

 IF nToArea != NIL
   dbSelectArea( nToArea )
   dbCloseArea()
 ENDIF

 dbSelectArea( nOldArea )

 IF lError
   Break( oError )
 ENDIF

 RETURN .T.

 

rsalu2

Re: SORT

Posted: Tue Apr 09, 2013 4:10 pm
by karinha
Luis, porfa, muestra la sintaxe de como tu hice el sort usando _dbsort()

gracias, salu2

Re: SORT

Posted: Tue Apr 09, 2013 4:14 pm
by karinha
SELE &NUM_AREA

USE &VARQUIVO EXCLUSIVE

*----- metodo direto ------ __dbsort(arq2,{ordem},NIL,NIL,NIL,NIL,.f.)

Code: Select all

   DBSORT( ARQ_SORT, ORIG_SORT, NIL, NIL,NIL, NIL,.f. ) 
 
Creo que usando INDEX ON... TEMPORARY // de xharbour sea bién más rápido.

Re: SORT

Posted: Tue Apr 09, 2013 5:42 pm
by LuisPonce
Gracias Karinha

Quedó asi:

USE "clientes" SHARED NEW
__dbsort("COPIACLT.DBF",{FIELD->NOMBRE})

USE

Re: SORT

Posted: Tue Apr 09, 2013 6:28 pm
by karinha
LuisPonce wrote:Gracias Karinha

Quedó asi:

USE "clientes" SHARED NEW
__dbsort("COPIACLT.DBF",{FIELD->NOMBRE})

USE

Luis, asi é más rápido mismo?? Tiens certezca??

Re: SORT

Posted: Wed Apr 10, 2013 4:28 am
by LuisPonce
Si Karinha

Ahora es mucho mas rapido, antes lo hacia asi:

* Clientes

USE "CLIENTES" SHARED Alias Cliente NEW
Cliente->(OrdSetFocus(1))

SORT ON NOMBRE TO WORK3431

Cliente->(DbCloseArea())

ocasionaba una demora considerable, son aprox. 18,000 registros en tres minutos Un Escandalo !!

Quedó asi:

USE "clientes" SHARED NEW
__dbsort("COPIACLT.DBF",{FIELD->NOMBRE})

USE

Ahora demora 2 a 3 segundos

Re: SORT

Posted: Wed Apr 10, 2013 12:27 pm
by karinha
Gracias Luis, voy hacer pruebas.

Re: SORT

Posted: Wed Apr 10, 2013 9:35 pm
by quique
Según std.ch, la situación es así:

Code: Select all

#command SORT [TO <(f)>] [ON <fields,...>] ;
              [FOR <for>] [WHILE <while>] [NEXT <next>] ;
              [RECORD <rec>] [<rest:REST>] [ALL] [CODEPAGE <cp>] => ;
         __dbSort( <(f)>, { <(fields)> }, ;
                   <{for}>, <{while}>, <next>, <rec>, <.rest.>, , , <cp> )
 
Así que en teoría es lo mismo, tal vez la velocidad disminuye porque ahora no utilizas

Cliente->(OrdSetFocus(1))

prueba el primer ejemplo sin esa línea y agregasela al segundo, tal vez influya.