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)
-   -   Borrar registros en blanco en Dbf (https://www.clubdelphi.com/foros/showthread.php?t=33616)

userlazarus 12-07-2006 14:50:16

Borrar registros en blanco en Dbf
 
Hola
Trato de borrar en una DB tipo Dbf los registros que tengan
un determinado campo vacío. Utilizo el siguiente código pero
no me los borra todos y no logro saber el porqué.
Utilizo el componente TDbf

Código Delphi [-]
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Dbf1.Close;
  Dbf1.Exclusive := True;
  Dbf1.Open;
  Dbf1.PackTable;
  Dbf1.First;
  While not Dbf1.EOF do
  if Dbf1.FieldByName('C_CONCEPTO').AsString = '' then
  begin
  Dbf1.Delete;
  Dbf1.Next;
  end
  else
  Dbf1.Next;
end;

Gracias.

Casimiro Notevi 12-07-2006 15:17:21

Cita:

Empezado por userlazarus
Hola
Trato de borrar en una DB tipo Dbf los registros que tengan
un determinado campo vacío. Utilizo el siguiente código pero
no me los borra todos y no logro saber el porqué.
Utilizo el componente TDbf

Código Delphi [-] procedure TForm1.Button1Click(Sender: TObject); begin Dbf1.Close; Dbf1.Exclusive := True; Dbf1.Open; Dbf1.PackTable; Dbf1.First; While not Dbf1.EOF do if Dbf1.FieldByName('C_CONCEPTO').AsString = '' then begin Dbf1.Delete; Dbf1.Next; end else Dbf1.Next; end;


Gracias.

Puede ser que tengas en el campo C_CONCEPTO espacios en algunos, y como haces la comparación con cadena vacía ( ='' ), se los salta.

userlazarus 12-07-2006 15:25:07

Esto si me funciona
 
No entiendo muy bien el motivo, pero me funciona así:
:confused:
Código Delphi [-]
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  Dbf1.Close;
  Dbf1.Exclusive := True;
  Dbf1.Open;
  Dbf1.PackTable;
  Dbf1.First;
  While not Dbf1.EOF do
  begin
  if Dbf1.FieldByName('C_CONCEPTO').AsString = '' then
  begin
  Dbf1.Delete;
  Dbf1.First;
  end
  else
  Dbf1.Next;
  end;
  Dbf1.PackTable;
  ShowMessage('Proceso terminado');
end;

Lo único que he cambiado es que después de que encuentré
un registro vacío y lo borre vuelva al primer registro yempiece
el recorrido por la tabla de nuevo..

Gracias.

Casimiro Notevi 12-07-2006 20:32:26

entonces, lo que sobra de la "primera versión" que has puesto es el "next" en caso de borrar...

Código:

While not Dbf1.EOF do
  if Dbf1.FieldByName('C_CONCEPTO').AsString = '' then
  begin
    Dbf1.Delete;
    Dbf1.Next;    <---- quita esta línea ------<
  end
  else
    Dbf1.Next;

porque en caso de borrar, se posiciona en el siguiente, pero al poner "next", se lo salta y va al otro que sigue, o sea, cada vez que borras una línea te estás saltando otra.

roman 12-07-2006 20:37:43

Tratando de encontrar alguna lógica es posible que ocurra esto:

Cuando haces el Delete, el siguiente registro pasa a ser el registro activo (suposición) por lo que sería innecesario el Next en ese caso. Inténtalo porque la solución que has encontrado es irremediablement lenta al recorrer múltiples veces la tabla.

Por otra parte, para este caso de borrado veo más sencillo y eficiente que hagas una consulta SQL:

Código SQL [-]
delete from tabla
where C_CONCEPTO = ''

EDITO:

Se me adelantó Casimiro con lo del Next sobrante. Aún así, considera lo de SQL.

// Saludos

marcoszorrilla 12-07-2006 20:40:48

Para que fuera efectivo el método de borrado recorriendo la tabla, sería necesario que ese campo fuese índice, buscar la primera ocurrencia y luego ejecutar un bucle, mientras el registro sea = ''

No Sería necesario el Next, pues al borrar el último ya no se cumpliría la condición del While.

Un Saludo.

userlazarus 12-07-2006 22:11:29

Gracias a todos.
Efectivamente lo que sobraba era el Next después del delete.
Tienes razón roman, mi primera solución era más que lenta.

Un saludo


La franja horaria es GMT +2. Ahora son las 08:30:48.

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