Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como resuelvo este problema?? (https://www.clubdelphi.com/foros/showthread.php?t=20679)

danytorres 22-04-2005 00:47:44

Como resuelvo este problema??
 
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:

Código Delphi [-]
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.


La franja horaria es GMT +2. Ahora son las 19:01:52.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi