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.