Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Error al recorrer registros de tabla (https://www.clubdelphi.com/foros/showthread.php?t=74845)

cheche358 14-07-2011 16:10:39

Error al recorrer registros de tabla
 
Buen dia a todos. Por favor lo que a continuacion planteo tengo ya 2 dias sin resolver si alguien me da una piesta se lo agradecere siempre!!

Estoy tratando de hacer un bucle para borrar registros de una tabla que esta enlazada a otra via MasterSource de manera simple:

procedure BorrarRegistros;
begin
Form1.tbl8.First;
while Form1.tbl8.Eof = False do
begin
Form2.tbl8.Delete;
Form2.tbl8.Next;
end;
end;


Y sencillamente la tabla no esta moviendo el puntero de manera correcta cuando hago la navegacion. He hecho todo tipo de verificaciones a ver donde esta el problema; hasta le pegue un grid a la tabla para ver haciendo break en el procedure para ver la navegacion y el borrado y no salta el puntero cuando se lo indico.

Lo mas extrano de todo esto es que cuando le pego un DBNavigator para hacer el movimiento del puntero esta si responde de manera correcta

Que puede ser lo que este pasando?

PD: Como veran estoy trabajando con tablas planas y Delphi7

oscarac 14-07-2011 16:12:34

Código Delphi [-]
procedure BorrarRegistros;
begin
Form1.tbl8.First;
while Form1.tbl8.Eof = False do
begin
Form2.tbl8.Delete;
Form2.tbl8.Next;
end;
end;
me parece que debes eliminar esa linea, puesto que cuando borras un registro el puntero pasa al registro siguiente y si encima le haces un next entonces no estaria borrando todos los registros

supongo que es un ejemplo verdad? Form1.tbl8 y Form2.tbl8 ??

cheche358 14-07-2011 16:32:56

Gracias por responder... Si solo un ejemplo, el codigo en realidad tiene otros objetos pero en esencia es eso, corrijo:

procedure BorrarRegistros;
begin
Form1.tbl8.First;
while Form1.tbl8.Eof = False do
begin
Form1.tbl8.Delete;
Form1.tbl8.Next;
end;
end;

Pero creo que el error no esta ahi, el teoria el Next es necesario para mover el puntero hacia el proximo registro a borrar y seguir con el bucle. Tengo codigo como ese en otros formularios y si funciona.

Insisto en lo que mencionaba antes: si en vez de usar codigo para mover el puntero uso un DBNavigator la tabla se recorre perfectamente.

Que podria ser?

oscarac 14-07-2011 16:40:41

has probado? o solo estas suponiendo que el error debe ser otra cosa
te recomiendo que lo pruebes y comentes

cheche358 14-07-2011 16:54:00

He probado un monton de cosas, pero el problema pareciera estar que la tabla no se esta moviendo al primer registro cuando llamo el:

Form1.tbl8.First;

Sera que alguien ha tenido el mismo problema?

Seran problemas con Indices?

Agrego otro detalle, esta segunda tabla es el Detail de una tabla Maestra, en este caso: Es la tabla que contiene los articulos de los documentos de factura. Es decir que el puntero de esta tabla es inicialmente movido por el movimiento efectuado en la tabla Master...

De que manera podria estar eso afectando el movimiento del puntero en la segunda tabla?

jafera 14-07-2011 17:07:55

Si es una tabla detalle, porque no borras todos los registros donde el id del detalle sea el id del maestro.

Asi es como lo hago yo, lanzo una consulta parametrizada con el id y ya está.

SAludos

Lepe 14-07-2011 17:09:16

El Next no es necesario porque al borrar el registro, el dataset pasa a apuntar al siguiente registro automáticamente (no se va a quedar apuntando al limbo).

Pero vamos, dado que estás usando una tabla, sería mejor usaras el método Clear para borrar todo, o incluso una SQL que es más eficiente "delete from tabla" y listo, todo borrado.

cheche358 14-07-2011 17:26:10

Gracias de nuevo jafera y Lepe por responder...

Podrian por favor darme un pequeno ejemplo de codigo de la consulta para borrar los datos asociados de la tabla detalle?

Ya tire la toalla recorriendo la tabla manualmente

oscarac 14-07-2011 17:27:39

mas o menos asi
Código SQL [-]
 
delete from tabladetalle where CampoComun = TablaCabecera.CampoComun

cheche358 14-07-2011 18:48:13

Gracias a todos por su tiempo... Resolvi haciendo la consulta y borrando los datos asociados a ella.

Les comento que aun con la inquietud del codigo anterior segui investigando codigo similar por ahi y agregandole un Refresh y sin el Next a la tabla despues de borrar funciono:

procedure BorrarRegistros;
begin
Form1.tbl8.First;
while Form1.tbl8.Eof = False do
begin
Form1.tbl8.Delete;
Form1.tbl8.Refresh;
end;
end;

Me quedara para una proxima situacion similar.

Gracias de nuevo

oscarac 14-07-2011 18:59:02

Probaste quitandole el Next como te sugeri?
Lepe tambien te menciono que cuando borras un registro el puntero pasa al siguiente porque no se puede quedar en el limbo :eek:

cheche358 14-07-2011 20:05:09

Si al final se lo quite, pero por las pruebas que hice el problema no era exactamente que se quedara en el "limbo", el problema es que cuando ya habia borrado 5, 10 articulos o los que fuera y quedaban solo 2, entonces con ese NEXT se movia al final de la tabla y se cerraba el WHILE, quedandome siempre un registro por borrar.

Asi que ese ultimo codigo que puse funciona perfect para el que lo necesite


La franja horaria es GMT +2. Ahora son las 06:17:13.

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