PDA

Ver la Versión Completa : No se destruye mi aplicacion


javicho_villa
26-01-2006, 01:18:23
Hola a todos

Tengo una aplicacion hecha en Delphi 6 con Paradox uso un DataModulo, trabajan varias maquinas con esta aplicacion, y se esta colgandose bastante cuando voy a la estacion donde se colgo la maquina donde se colgo - presiono CTRL+ALT+DEL veo en los procesos varios Textil.exe que es el nombre del ejecutable.

Cuando los elimino por esa ventana del windows ya pueden ingresar, pero por lo general siempre no termina de grabar alguna registro, bueno aqui unos alcances del codigo:

Para Grabar:
Dm.MiTabla.Post;
Dm.MiTabla.FieldValues['MiCampo'] := MiValor;
Dm.MiTabla.Post
y protejo este codigo con un try dentro de un bucle asi;
lgraba := false
while lgraba=false do begin
try
--- codigo para grabar ---
lgraba := true;
except
lgraba := false
end;
end;
--------
Para Crear Formularios y cualquier objeto
MiForm := TForm.create(self);
MiForm.ShowModal;
MiForm.Free;
--------
Ojala alguien pueda auxiliarme por que estoy con la presion de los que me
contrataron y estoy un poco saturado.

Gracias de antemano.

Javier Villa.:(

Jonnathan
26-01-2006, 02:32:24
Hola Javier

Dm.MiTabla.Post;
Dm.MiTabla.FieldValues['MiCampo'] := MiValor;
Dm.MiTabla.Post
¿Eso fue un error de transcripción o lo tienes así en el código? Porque si es asi, el segundo "post" va a generar una excepción porque la tabla ya no está en modo de edición, asi que ejecutaráexcept
lgraba := false
end; tratará de entrar de nuevo en el ciclo y se volverá a repetir el cuento, no saldrá nunca. No te recomiendo que pongas el Guardar (post) de esa manera en el código (forzándolo con un while), cuando no pueda guardar se te colgará el programa, en vez de eso muestra un mensaje al usuario y cancela el guardado. Ah y otra cosa, los moderadores te agradecerán con el corazón que pongas el código delphi con sus respectivas etiquetas, para que se lea mejor:o. Saludos.

cuburu
26-01-2006, 02:44:47
Por lo que veo estas utilizando un ciclo para decirle al usuario que grabe la información a pesar de que exista un error en la inserción de la información... creo yo, la verdad es que ando un poco falto de practica en ese aspecto, que si ya existe un error porque el sistema no pudo grabar la información, la operación se queda atrapando la tabla o el registro que acualizaste, lo que provoca que nadie pueda acceder a ella hasta que éste recurso sea liberado por la operación, provocando así un dead. Quizas sea por eso que los demás usuarios no puedan trabajar.

Al hacer un post lo único que haces es enviar la actualización a memoria pero a veces, y a mi me pasaba con frecuencia, cuando utilizas POST da la apariencia de que se actualiza la información pero al reiniciar el equipo o finalizar el programa y vuelves a buscar el mismo registro te das cuenta de que no fue así.

Por eso es mejor cambair el POST por un commit. Lo que hace el commit es que todas las operaciones que tienes en memoria sean enviadas a la BD.

Te recomiendo que restructures tu ciclo y que evites imponer el tener que actualizar una tabla que ya tuvo problemas al intentar actualizarse. Es mejor hacer un rollback o algo así para evitar este tipo de incidentes.

Estoy suponiendo que utilizas on objeto tipo TTable y que ingresas los datos de manera tradicional.

Yo prefiero utilizar un query, es más cómodo y te evitas de codificar un sin fin de cosas, si lo quieres hacer con un TQuery, o un objeto parecido podrías intentar algo asi:


Var
Inserta: TQuery;
begin
try
Inserta := TQuery.create();
try
Inserta.Close;
Inserta.SQL.Clear;
Inserta.SQL.ADD('INSERT INTO Tabla1(campo1, campo2, ..., campon)' +
'VALUES(:C1, :C2, ...,:Cn)');
{En lugar de asString, personalizalo al formato de campo que desees asString, asInteger, asFloat, etc.}
Inserta.ParamByName('C1').asString := Edit1.Text;
Inserta.ParamByName('C2').asString := Edit2.Text;
Inserta.ParamByName('...').asString := Editn.Text;
Inserta.ParamByName('Cn').asString := Edit3.Text;
Inserta.Open;
finally
Inserta.Free;
end;
except
on E:exception do
MessageBox(Handle,PChar('Se ha generado un error al hacer la actualización' +
+ #13 +
E.Message) ,
'ERROR',
mb_Ok);
end;


De esta forma ejecutas una actualización en SQL. Es más entendible a mi punto de vista está mejor estructurado, además como veo que es para un sistema distribuido esto, a mi punto de vista, deberia de ser lo que debes utilizar.

javicho_villa
26-01-2006, 17:26:32
Voy a probar las recomendaciones.

Los dos post son un error el primer post me equivoque quice decir appendo o edit segun sea el caso.

Me parece bien ingresar los registros con sentencias de SQL voy a probar y les comento los resultados.

Gracias nuevamente

Javier