PDA

Ver la Versión Completa : Como resuelvo este problema??


danytorres
22-04-2005, 00:47:44
buenas noches amigos del foro estoy realizando una insercion en una tabla de paradox de un archivo TXT, el codigo es el siguiente;

Code:
_____________________________________________________
try

Transferencia.Height:=172;
Archivo.LoadFromFile('C:\NominaObre1.txt');
ProgressBar1.Max:= Archivo.Count;

for I := 0 to Archivo.Count -1 do
begin
Campos.Clear;
Campos.CommaText:= Archivo[I];

If Datamodule2.REMMAE.Locate('CODEMP',Campos[0],[]) then
begin
Datamodule2.REMMAE.Edit;
Datamodule2.REMMAE.Fields[42].Value := Strtofloat(Campos[1]);
Datamodule2.REMMAE.Fields[43].Value := Strtofloat(Campos[2]);
Datamodule2.REMMAE.Fields[44].Value := Strtofloat(Campos[3]);
Datamodule2.REMMAE.Fields[51].Value := Strtofloat(Campos[4]);
Datamodule2.REMMAE.Fields[50].Value := Strtofloat(Campos[5]);
Datamodule2.REMMAE.Fields[36].Value := Strtofloat(Campos[6]);
Datamodule2.REMMAE.Fields[47].Value := Strtofloat(Campos[7]);
Datamodule2.REMMAE.Post;

end;
showmessage( 'Ficha del trabajador ='+Campos[0]);

Application.ProcessMessages;
ProgressBar1.Position:=i +1;

end;

finally
Archivo.Free;
Campos.Free;
end;
_______________________________________________________________



El error que meda es el siguiente : Couldn't perform the edit because another user changed the record.

Este error meda cuando a insertado mas de 10 lineas del txt.


Que hago????

danytorres
25-04-2005, 22:07:49
amigos el error ya no meda pero se que da colgado el proceso? que puede ser

marcoszorrilla
25-04-2005, 22:16:28
Has comprobado que las líneas contienen valores validos, puede ser que en alguno de los campos del fichero de texto,por ejemplo hayas utilizado un . en vez de una coma o al reves.

09050000001ACM 22 18:00:00100600,0007637,0283SSS0212
0905103 ACM 12 19:00:00100660.0000384,1409NNN0212

Aquí te pongo un ejemplo de un leve fallo que hecharía abajo un proceso.

Un Saludo.

danytorres
25-04-2005, 23:03:41
Gracias por responder marcoszorrilla, rebice el texto que no es mu largo y esta perfecto, yo creo que pueda ser el procedimiento pe yo no veo el error.???

Lepe
26-04-2005, 13:08:17
ve con F8 y breakpoints, o metele trazas al programa (showMessage) para saber en qué registro va, que tiene Archivo[i], qué tiene Campos[0], Campos[1],que se asigna a cada campo, etc.

Si no lo resuelves, sería conveniente poner los datos que quieres importar para ver si puede dar problemas.

Una detalle, que separador usas para el CommaText ???, porque si estas usando la coma, precisamente los números flotantes tienen una coma como separador decimal, y si lo interpretas como un separador de cadenas, Tienes un problema.

Un saludo

hermes_32
26-04-2005, 13:16:16
Por cierto, un detalle: Si dices que estas haciendo una inserción en la tabla deberías usar un Append o Insert en lugar de Edit :rolleyes:

Que se te quede colgado puede ser por el método "locate" si la tabla no tiene ningún índice. Si tiene creas un índice en la tabla te recomiendo que uses FindKey en lugar de locate. Es mucho más rápido.

danytorres
26-04-2005, 13:34:36
Gracias por responder, nu puedo colocar insert por que los registros ya existen lo que hago es buscarlo en la tabla y editaros para insertar los cambios en este proceso es que la tabla se cuelga. De verda no se que puede ser??

hermes_32
26-04-2005, 22:36:27
Prueba a realizar el proceso entero dentro de una transaccion. Sería mas o menos:


db.StartTransaction;
If Datamodule2.REMMAE.Locate('CODEMP',Campos[0],[]) then
begin
try
Datamodule2.REMMAE.Edit;
Datamodule2.REMMAE.Fields[42].Value := Strtofloat(Campos[1]);
Datamodule2.REMMAE.Fields[43].Value := Strtofloat(Campos[2]);
Datamodule2.REMMAE.Fields[44].Value := Strtofloat(Campos[3]);
Datamodule2.REMMAE.Fields[51].Value := Strtofloat(Campos[4]);
Datamodule2.REMMAE.Fields[50].Value := Strtofloat(Campos[5]);
Datamodule2.REMMAE.Fields[36].Value := Strtofloat(Campos[6]);
Datamodule2.REMMAE.Fields[47].Value := Strtofloat(Campos[7]);
Datamodule2.REMMAE.Post;
db.Commit;
except on e:exception do begin
showmessage(e.message); //que muestre el error si se produce
db.Rollback;
end;
end;
end;


Mas o menos. Lo he hecho sobre la marcha igual ni compila :cool: , pero la idea es esa.

Pero insisto, si la tabla sobre la que estas haciendo un "locate" no tiene ningún índice...mal vamos...ya que por eso seguramente parezca que se te queda colgado aunque realmente estará buscando como un loco.