Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-07-2006
userlazarus userlazarus is offline
Miembro
 
Registrado: abr 2006
Posts: 55
Poder: 19
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.
Responder Con Cita
  #2  
Antiguo 12-07-2006
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.052
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #3  
Antiguo 12-07-2006
userlazarus userlazarus is offline
Miembro
 
Registrado: abr 2006
Posts: 55
Poder: 19
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.

Última edición por userlazarus fecha: 12-07-2006 a las 15:27:33.
Responder Con Cita
  #4  
Antiguo 12-07-2006
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.052
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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.
Responder Con Cita
  #5  
Antiguo 12-07-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: 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
Responder Con Cita
  #6  
Antiguo 12-07-2006
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: 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
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #7  
Antiguo 12-07-2006
userlazarus userlazarus is offline
Miembro
 
Registrado: abr 2006
Posts: 55
Poder: 19
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
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Borrar Registros Totalmente h2o_mx Tablas planas 5 20-01-2007 19:18:56
Borrar registros yorllito Conexión con bases de datos 3 09-04-2006 16:04:18
Borrar n Registros de una Tabla Abel Garcia Firebird e Interbase 18 09-11-2005 14:16:23
Borrar registros dmagui MySQL 2 11-07-2005 20:14:25
no puedo borrar registros Patricio Conexión con bases de datos 2 16-02-2005 14:39:05


La franja horaria es GMT +2. Ahora son las 15:01:46.


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
Copyright 1996-2007 Club Delphi