FoxPro/Visual FoxPro - Codigo muy lento AYUDA POR FAVOR!!!!

 
Vista:

Codigo muy lento AYUDA POR FAVOR!!!!

Publicado por Gabriela (40 intervenciones) el 19/07/2005 20:11:18
Hola a todos, bueno tlengo un problema con un codigo que tengo para hacer una actualizacion y grabado en varias tablas, ya habia mandado este menseje pero no tube respuestta y la verdad no se que hacer estoy desesperada, de antemando muchas gracias,
bueno el codigo es este:

************************************************************************************************
**** de la tabla llamada cargo, que tienen el campo au=1 les agrego al campo aut tambien como 1******

SELECT cargo
GO top
DO while!EOF()
IF cargo.au=1
IF red([R], [cargo])
replace cargo.aut WITH 1

UNLOCK
FLUSH
ENDIF
ENDIF

skip
ENDDO

*********************************

******Ahora en la tabla cel_data tengo que poner un total el cual sale de la suma de varios campos de la tabla cargo*********

SELECT cel_data
SET ORDER TO cel_da01
GO top

DO while!EOF()
vfoliopx= cel_data.folio


SELECT cargo
SET ORDER TO folio
SEEK(vfoliopx)
IF FOUND()
SUM totort,tothon FOR cargo.folio= cel_data.folio AND cargo.aut=1;
TO vtotort,vtothon

SELECT cel_data
IF red("R","cel_data")
replace cel_data.cargo WITH Vtotort+Vtothon
UNLOCK
FLUSH
ENDIF

ENDIF

SELECT cel_data
SKIP
ENDDO

****** termina de grabar*******

VPRESUPEN=.F.

MESSAGEBOX("Se han autorizado los cargos seleccionados", 64,[MENSAJE])
**********************************************************************************************
Este codigo funciona pero al ser muchos los registros se hace lentisimo y pues no me sirve asi, necesito saber que esto haciendo mal o como puedo hacer para que se haga mas rapido.

Gracias de antemano
Saludos.
Gaby
Mexico.
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

RE:Codigo muy lento AYUDA POR FAVOR!!!!

Publicado por Cesarz (84 intervenciones) el 19/07/2005 22:46:29
El problema es que estas usando mal el comando FLUSH.
FLUSH asegura que las modificaciones efectuadas en todas las tablas y los índices abiertos se guardan en disco.
haz FLUSH cuando hayas terminado de grabar todo o bien despues del bucle de actualizacion.
Salu2

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:Codigo muy lento AYUDA POR FAVOR!!!!

Publicado por Foxperto (894 intervenciones) el 20/07/2005 16:07:01
Hola Gabriela:

Viendo el codigo sin analizarlo mucho concuerdo con la opinion de Cezarz.

Pero te doy un consejo, mete todo eso dentro de una Transaccion y elimina por completo los Flush... Estas haciendo varias cosas que si en algun momento falla, perderas la integridad de la informacion que tienes, ademas con las transacciones, cuando cierres con END TRANSACCION, toda la data se grabada de una vez en las tablas correspondientes.

Prueba y nos cuentas.

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:Codigo muy lento AYUDA POR FAVOR!!!!

Publicado por Saul (362 intervenciones) el 20/07/2005 16:48:00
Bueno amigo de los FLUSH, asi como dicen los amigos, pues no tengo idea
pero lo que te puedo asegurar es que un DO WHILE, SCAN o cualquier ciclo siempre te pondra lento tus rutinas.
LO que te aconsejo es que uses lo menos posible estos ciclos, si es posible
hay te va como lo haria yo, y viendo la posibilidad de si puedes evitar los DO WHILE hazlo..

bye suerte

************************************************************************************************
**** de la tabla llamada cargo, que tienen el campo au=1 les agrego al campo aut tambien como 1******

SELECT cargo
GO top
DO while!EOF()
IF cargo.au=1
IF red([R], [cargo])
replace cargo.aut WITH 1
UNLOCK
ENDIF
ENDIF
Skip
ENDDO

*********************************

******Ahora en la tabla cel_data tengo que poner un total el cual sale de la suma de varios campos de la tabla cargo*********

SELECT cel_data
SET ORDER TO cel_da01
GO top

DO while!EOF()
vfoliopx= cel_data.folio

**** ESTO ES LO QUE HIZO SAUL

SELECT *, SUM(totort) As vtotort, SUM(tothon) As vtothon;
FROM cargo;
WHERE ALLTRIM(cargo.folio)== ALLTRIM(vfoliopx) AND cargo.aut=1;
ORDER BY folio;
INTO CURSOR Temp_cargo
******
SELECT cel_data
IF red("R","cel_data")
replace cel_data.cargo WITH Temp_cargo.Vtotort+Temp_cargo.Vtothon
UNLOCK
ENDIF

SELECT cel_data
SKIP
ENDDO

****** termina de grabar*******

VPRESUPEN=.F.

MESSAGEBOX("Se han autorizado los cargos seleccionados", 64,[MENSAJE])
**********************************************************************************************

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

Gracias....

Publicado por Gabriela (40 intervenciones) el 27/07/2005 17:28:23
Mil gracias a todos quite los flush y ademas cambie la parte que me dice Saul y todavia se tarda por que son muchisimos registros pero ya no tanto, gracias por todo.
Saludos.
Gabriela, Mty, Mexico.
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:Gracias....

Publicado por Foxperto (894 intervenciones) el 29/07/2005 16:10:14
Hola Gabriela:

Me alegro que te alla mejorado el codigo, veamos si se puede mejorar mas.

Escribistes este codigo:

** Segun lo que entiendo, recorres toda la Tabla Cargo, buscando registros que cumplan con la siguiente condicion, que AU=1, pero no entiendo lo que hace la Funcion RED, me la podrias explicar?

SELECT cargo
GO top
DO while!EOF()
IF cargo.au=1
IF red([R], [cargo])
replace cargo.aut WITH 1

UNLOCK
FLUSH
ENDIF
ENDIF

skip
ENDDO

** Si creas un indice llamado por ejemplo idxAU que su campo sea AU
** podrias poner este codigo:

SELECT Cargo
Set Order To idxAU
Seek 1
Scan While AU = 1
IF red([R], [cargo])
replace cargo.aut WITH 1
ENDIF
EndScan

** Prueba asi a ver si la velocidad de ese ciclo mejora y asi continuaremos con los otros

Prueba y me cuentas

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