PDA

Ver la Versión Completa : Access y Post lento


Waldo
12-09-2007, 19:16:03
Hola buenos dias.

Tengo un pequeño problema he buscado algo por los foros y no he podido dar con la solucion.

Algunos compañeros como Caral me ayudo para que el sistema que manejo sea un poco mas rapido y optimo, pero en realidad prosigo con el siguiente problema:


Simplemente al hacer Post a una tabla a travez de la red tarda aproximadamente 30 segundos, considerando que esa tabla solo contiene almenos 4000 registros, en los otros modulos el post funciona perfectamente bien, incluso las consultas y los locate.



Quisiera saber si existe alguna forma de optimizacion de codigo para la manipulacion de esta tabla (registro de facturas).


considerando que:


* Abro la tabla completa para localizar un posible folio repetido, es decir evito el error de duplicacion de clave primaria.

* Si la clave Primara no existe entonces realizo un post (insertar) temporal mente la factura

* Despues de tener todos los datos, ya completos, edito ese mismo registro y aplico el post para guardar la factura de forma definitiva. aqui es donde tarda.

Si se requiere mas informacion agradeceria me la solicitaran, Agradeciendod e antemano su ayuda.

Waldo.

Chris
12-09-2007, 19:24:08
Está díficil ayudarte, ya que ese tipo de problemas normalmente pueden darse por muchas razones distintas, talvez si posteas código en donde haces las modificaciones

Hola buenos dias.
considerando que:
* Abro la tabla completa para localizar un posible folio repetido, es decir evito el error de duplicacion de clave primaria.

* Si la clave Primara no existe entonces realizo un post (insertar) temporal mente la factura

* Despues de tener todos los datos, ya completos, edito ese mismo registro y aplico el post para guardar la factura de forma definitiva. aqui es donde tarda.

Si se requiere mas informacion agradeceria me la solicitaran, Agradeciendod e antemano su ayuda.
Waldo.

o es idea mía o es que temporalmente guadas la fact. con un numero temporal para ver si ya existe, en este caso sería mejor que hagas un Locate o findkey antes de agregar el registro.

Waldo
12-09-2007, 19:27:01
o es idea mía o es que temporalmente guadas la fact. con un numero temporal para ver si ya existe, en este caso sería mejor que hagas un Locate o findkey antes de agregar el registro.


No en realidad lo hago como comentas, temporalmente me refiero que guardo algunos campos (guardo la factura parcialmente) y hasta no tener los datos completo hago el edit (para meter los campos restantes) y asi completar el registro con los datos que debe llevar.

Tratare de poner el codigo

Caral
12-09-2007, 19:36:22
Hola
Conociendo tu programa podria decir que:
Para mi el problema mas grabe en esto es el uso de ADOTable, este trae todo el contenido de la tabla, es mas fácil de usar, pero alenta el sistema enormemente.
Yo cambiaría a ADOQuery y usaría otro sistema de update, por sql.
Saludos

Waldo
12-09-2007, 20:07:41
en la parte dodne almaceno la factura y dodne tengo el problema es el siguiente:



begin
g.tiempo:=0;
progres:=tprogres.Create(self);
try
progres.bar.Progress:=0;
progres.mensaje.Lines.Clear;
progres.mensaje.Lines.Add('Guardando la factura, espere...');
progres.show;
progres.Refresh;
Application.ProcessMessages;
progres.bar.MaxValue:=8;
M.TFactura.Open;
progres.bar.Progress:=1;
M.TFactura.Refresh;
progres.bar.Progress:=2;progres.Refresh;Application.ProcessMessages;

//// aqui lozalizo el folio de la factura previamente almacenada para aplicar o editarla y meter los campos restantes


IF M.TFactura.Locate('Folio',folio.text,[]) then
BEGIN
///// de aqui en adelante es dodne biene el problema, considerando la lentitud cuando se hace el post.

m.TFactura.Edit;
progres.bar.Progress:=3;progres.Refresh;Application.ProcessMessages;
M.TFactura.Fields[3].Value:=TOTALT.Value;
M.TFactura.Fields[4].Value:=memo1.TEXT;
M.TFactura.Fields[5].Value:='NO';
progres.bar.Progress:=4;progres.Refresh;Application.ProcessMessages;
M.TFactura.Fields[7].Value:='NO';
M.TFactura.Fields[9].Value:=IVAT.Value;
M.TFactura.Fields[10].Value:=SUBTOTALT.Value;
progres.bar.Progress:=5;progres.Refresh;Application.ProcessMessages;
IF MEMO2.Text<>'< ESCRIBA AQUI LAS OBSERVACIONES >' THEN
M.TFactura.Fields[8].Value:=MEMO2.TEXT
ELSE
M.TFactura.Fields[8].Value:='';
progres.bar.Progress:=6;progres.Refresh;Application.ProcessMessages;


////// aqui es donde se pdemora en hacer el post
m.TFactura.Post;
//////
M.TFactura.CLOSE;
progres.bar.Progress:=7;progres.Refresh;Application.ProcessMessages;
END;
progres.bar.Progress:=8;progres.Refresh;Application.ProcessMessages;
progres.bar.Progress:=0;
progres.Close;
finally
progres.Free;
end;


/// de aqui en adelante, es solo un mensaje si desea imprimir o no la factura ya guardada, de aqui para abajo lo hace con la velocidad normal.




Podria ser que en lugar de locate, aplique una consulta SQL buscando la factura con el foli a editar? a caso eso resolveria el problema?

Caral
12-09-2007, 21:35:21
Hola
La verdad es que sigo pensando lo mismo.
Usas una tabla, localizas unos campos de la misma, los editas, les asignas unos valores y luego los guardas.
Todo esto se puede hacer en un solo paso con un adoquery y una sentencia sql con un update.
Algo asi:

DataModule1.AC1.BeginTrans;
try
QTemp.SQL.Text := 'Update OrdenProd set FechaRequerido = '+QuotedStr(DateToStr(DateTimePicker1.DateTime))+', Comentarios = '
+QuotedStr(Memo1.Text)+', CodCliente = '+Edit3.Text+', Prioridad = '+IntEdit1.Text+
' Where CodOrden = '+Edit2.Text;

QTemp.ExecSQL;
guardada := true;
IF Nueva then
begin
QOrdProd.Requery();
QOrdProd.Last;
end
else begin
bok := QOrdProd.Bookmark;
QOrdProd.Requery();
QOrdProd.Bookmark := bok;
end;
DataModule1.AC1.CommitTrans;
Esto no tiene que ver con ti codigo, es de mi programa, pero te explica como hacer un update, mas o menos.
Saludos

Waldo
12-09-2007, 23:55:00
Hola que tal Carl, te comento por fin encontre la solucion, y es la misma que propones, no lo hice asi exactamente como tu lo dices, simplemente hago una consulta a la tabla, localizo el registro edito la consulta y la guardo.

lo implemente y wow Lo hizo en menos de un parpadeo de ojo, jejej por fin resolvi el problema, ojala le pueda ayudar a muchos mas que he leido que tienen el mismo problema.


El punto es evitar de alguna forma abrir toda la tabla, que e slo mas facil, pero a la larga sera muy lento y satura los recursos, es mejor traducirlo en una consulta de manera que solo saque los datos que se necesitan de la tabla,... los demas para que?.... en fin ahora puedo decirles que si funciona perfectamente ha y lo cheque en red.


Agradezco a Caral, Carlos por averme ayudado a resolver este problema , Gracias, su amigo Waldo. :)

Caral
13-09-2007, 00:02:13
Hola
Me alegro que resolvieras el problema.
Saludos