FoxPro/Visual FoxPro - RUTINA LENTA ...

 
Vista:

RUTINA LENTA ...

Publicado por JM (26 intervenciones) el 14/12/2007 10:48:30
Hola ... tengo una tabla libre con 6000 registros y al hacer el siguiente codigo se ha vuelto lenta.
¿Como podria mejorarla para que hiciera lo mismo más rapido?

* filtro de apuntes a mostrar
SELECT apuntes
SET FILTER TO
SET FILTER TO apuntes.cuenta=cuentas.codigo
go top

* calcula saldos apuntes
SaldoI=0
SaldoF=0
SaldoP=0
SCAN
IF !EMPTY(apuntes.punteo)
SaldoP=SaldoP+(apuntes.ingreso-apuntes.pago)
ENDIF
SaldoF=(apuntes.ingreso-apuntes.pago)+SaldoI
replace apuntes.saldo WITH SaldoF
SaldoI=SaldoF
ENDSCAN
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

RE:RUTINA LENTA ...

Publicado por Hector R. De los Santos (270 intervenciones) el 14/12/2007 13:45:23
Te recomiendo utilizar SELCT-SQL en vez de SET FILTER, en tu caso tambien puedes usar SCAN FOR, asi no usas el SET FILTER (suele ponerse lento con grandes cantidades de registros), aunque tengo tablas con mas registros que esos y en algun modulo lo tengo y no me trabaja lento.
Prueba asi:

* calcula saldos apuntes
SaldoI=0
SaldoF=0
SaldoP=0
SELECT apuntes
SCAN FOR apuntes.cuenta=cuentas.codigo
IF !EMPTY(apuntes.punteo)
SaldoP=SaldoP+(apuntes.ingreso-apuntes.pago)
ENDIF
SaldoF=(apuntes.ingreso-apuntes.pago)+SaldoI
replace apuntes.saldo WITH SaldoF
SaldoI=SaldoF
ENDSCAN

Si sigue lento usa SELECT y UPDATE

Suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:RUTINA LENTA ...

Publicado por alexcoinc (450 intervenciones) el 14/12/2007 20:44:01
Esta rutina de ejemplo si funciona pero recorrería toa la tabla hasta el final, es mejor hacerle un indice, hacerle un seek y correrla mientras cumpla con la condición. Asi es mas eficiente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:RUTINA LENTA ...

Publicado por alexcoinc (450 intervenciones) el 14/12/2007 20:41:43
NO CON FILTER SINO CON UN INDICE Y QUE SE UBIQUE (DESPUES DE BUSCARLO) EN EL REGISTRO QUE CUMPLA LA CONDICION Y SE EJECUTE MIENTRAS ESTA CONDICION SEA VERDADERA CON UN SCAN O MEJOR CON UN DO WHILE
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

más rápido, imposible

Publicado por Luighi (105 intervenciones) el 15/12/2007 04:35:05
en la ventana de comandos
crea un índice estructural para la tabla apuntes
de la siguiente manera:

use apuntes exclusive
index on cuenta tag cuentas
use

lo anterior sólo se hace por única vez
vale la pena hacerlo entonces
espera un ratito y se generará el índice deseado
después...
reemplaza lo que ibas haciendo con el código siguiente:

select apuntes
set order to cuentas && ordenamos la tabla por el índice creado
set key to cuentas.codigo && es más rápido filtrar una tabla ordenada
store 0 to nSaldoAnterior, nSaldoPunteo && una tercera variable es innecesario
scan
if !empty(punteo) && si la tabla actual es apuntes basta con escribir el campo
nSaldoPunteo=nSaldoPunteo+ingreso-pago
endif
replace saldo with ingreso-pago+nSaldoAnterior
nSaldoAnterior=saldo
endscan

así pues
lo anterior se ejecutará mucho más rápido aún
pero me quedo pensando...
porqué haces una diferencia ingreso-pago dentro de un if/endif
para luego volver a tomar esa diferencia en un replace?
razones debes tener y llego a pensar que quizás necesitas el valor nSaldoPunteo para después de la operación
aún así pienso que quizás lo que deseas hacer es lo siguiente:

select apuntes
set order to cuentas
set key to cuentas.codigo
store 0 to nSaldoAnterior, nSaldoPunteo
scan
if !empty(punteo)
nSaldoPunteo=nSaldoPunteo+ingreso-pago
replace saldo with ingreso-pago+nSaldoAnterior
nSaldoAnterior=saldo
endif
endscan

siendo así entonces el índice ha de modificarse:

index on cuentas for !empty(punteo) for cuentas

entonces el código resultante sería:

select apuntes
set order to cuentas
set key to cuentas.codigo
store 0 to nSaldoAnterior, nSaldoPunteo
scan
nSaldoPunteo=nSaldoPunteo+ingreso-pago
replace saldo with ingreso-pago+nSaldoAnterior
nSaldoAnterior=saldo
endscan

lo cual se traduce en mayor en velocidad en el procesamiento de los datos

saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:más rápido, imposible

Publicado por JM (26 intervenciones) el 20/12/2007 09:50:17
Gracias a todos por vuestras aportaciones ... con todo ello estoy cambiando la filosofia de la muestra de datos en el grid para no tener que usar el SET FILTER ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar