Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Go Back   Foros Club Delphi > Principal > Conexión con bases de datos
Register FAQ Members List Calendar Guía de estilo Search Today's Posts Mark Forums Read

Conexión con bases de datos

Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 12/07/2006
userlazarus userlazarus is offline
Miembro
 
Join Date: Apr 2006
Posts: 55
Poder: 21
userlazarus Va por buen camino
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.
Reply With Quote
  #2  
Old 12/07/2006
Casimiro Noteví's Avatar
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Join Date: Sep 2004
Location: En algún lugar.
Posts: 32,681
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Quote:
Originally Posted by 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.
Reply With Quote
  #3  
Old 12/07/2006
userlazarus userlazarus is offline
Miembro
 
Join Date: Apr 2006
Posts: 55
Poder: 21
userlazarus Va por buen camino
Esto si me funciona

No entiendo muy bien el motivo, pero me funciona así:

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.

Last edited by userlazarus : 12/07/2006 at 15:27.
Reply With Quote
  #4  
Old 12/07/2006
Casimiro Noteví's Avatar
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Join Date: Sep 2004
Location: En algún lugar.
Posts: 32,681
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
entonces, lo que sobra de la "primera versión" que has puesto es el "next" en caso de borrar...

Code:
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.
Reply With Quote
  #5  
Old 12/07/2006
roman's Avatar
roman roman is offline
Moderador
 
Join Date: May 2003
Location: Ciudad de México
Posts: 20,269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
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
Reply With Quote
  #6  
Old 12/07/2006
marcoszorrilla's Avatar
marcoszorrilla marcoszorrilla is offline
Capo
 
Join Date: May 2003
Location: Cantabria - España
Posts: 11,221
Poder: 10
marcoszorrilla Va por buen camino
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.
__________________
Guía de Estilo de los Foros
Quote:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Reply With Quote
  #7  
Old 12/07/2006
userlazarus userlazarus is offline
Miembro
 
Join Date: Apr 2006
Posts: 55
Poder: 21
userlazarus Va por buen camino
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
Reply With Quote
Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Borrar Registros Totalmente h2o_mx Tablas planas 5 20/01/2007 19:18
Borrar registros yorllito Conexión con bases de datos 3 09/04/2006 16:04
Borrar n Registros de una Tabla Abel Garcia Firebird e Interbase 18 09/11/2005 14:16
Borrar registros dmagui MySQL 2 11/07/2005 20:14
no puedo borrar registros Patricio Conexión con bases de datos 2 16/02/2005 14:39


All times are GMT +2. The time now is 02:16.


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