Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-04-2010
sizne sizne is offline
Miembro
 
Registrado: mar 2010
Posts: 104
Poder: 15
sizne Va por buen camino
Eliminacion de duplicados

Hola Foreros:

Les planteo lo siguiente(con Base de Datos SQL Server):
Form1-Tabla1-DBGrid1-DataSource1
Form2-Tabla2-DBGrid2-DataSource2

Una suposición: Teniendo 3 pasos a), b) y c).

a) Ingreso 3 registros en el Form1.

1Registro-XX1
2Registro-XX2
3Registro-XX3

Estos 3 registros los copio al Form2 (Tabla2), luego elimino los registros del Form1.

b) Ahora ingreso 4 registros en el Form1.
1Registro-XX4
2Registro-XX3
3Registro-XX5
4Registro-XX6

Estos 4 registros los copio al Form2 (Tabla2), luego elimino los registros del Form1.
(...Y asi sucesivamente....)

Aqui el detalle:
c) Cuando copio los registros, en el Form2 debo realizar una eliminacion de todos aquellos que se hayan duplicados, es decir; se debe eliminar el primer registro encontrado duplicado.

Como verán este registro (3Registro-XX3) se repite (2Registro-XX3).

Lo que significa que debo eliminar: 3Registro-XX3
Y mantener el registro : 2Registro-XX3

Estas elminaciones se realizan en el Form2 (Tabla 2), que esta relacionado con el DataSource2 el DBGrid donde se vizualizan tooodas las copiadas (Incluyendo las duplicadas)

Puedo eliminar del DBGrid, el seleccionado, el primer o el ultimo registro; pero no sé cómo hacer para eliminar el primer duplicado encontrado, ya que el segundo es el que quiero que se mantenga.

Graaacias.
Responder Con Cita
  #2  
Antiguo 22-04-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola sizne.

Para eliminar los duplicados en "Tabla2" podés usar:
Código:
DELETE FROM Tabla2 a
WHERE Campo_ID > (SELECT MIN(Campo_ID) FROM Tabla2 b
WHERE b.Campo1 = a.Campo1);
Fijate, que en la cláusula WHERE del ejemplo sólo verifico por un campo.
Si queres evaluar por más de un campo tendrías que usar en la cláusula WHERE:
Código:
WHERE b.Campo1 = a.Campo1 AND b.Campo2 = a.Campo2 AND ...
Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 24-04-2010 a las 01:52:34.
Responder Con Cita
  #3  
Antiguo 23-04-2010
sizne sizne is offline
Miembro
 
Registrado: mar 2010
Posts: 104
Poder: 15
sizne Va por buen camino
Hola ecfisa,
Los datos que puse son solo ejemplos, en si no son cantidades.. (MIN...)
son palabras (siglas de Materias que vuelven a programarse en otra gestion cuando se aplazan, por eso en la Tabla2, se repetiran, cosa que ahi tengo que hacer una limpieza y eliminar SOLO el primer registro duplicado).

Espero me entiendas

Gracias!!!
Responder Con Cita
  #4  
Antiguo 24-04-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola sizne.

Si, te entendí bién la primera vez. Usá el primer ejemplo que te puse y eliminará los duplicados. (por supuesto cambiá los nombres de campo que puse por los tuyos...)

Saludos.

Nota: Borré unos comentarios erroneos en el primer post: "DELETE Campos_Deseados FROM" en su lugar va "DELETE FROM", el error fue por que hice la prueba con SELECT y copie y pegue... perdón.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 24-04-2010 a las 01:57:29.
Responder Con Cita
  #5  
Antiguo 30-04-2010
sizne sizne is offline
Miembro
 
Registrado: mar 2010
Posts: 104
Poder: 15
sizne Va por buen camino
Hola ecfisa, gracias por responder y explicar tan bien .

Con tu ayuda hice el el siguiente codigo
Cita:
DELETE FROM BDmaterias
WHERE IdM = (SELECT MIN(IdM) FROM BDmaterias b
WHERE b.CodigoM = CodigoM and CalificacionM='Reprobado')
Hice las pruebas respectivas, y pues solo me elimina todos aquellos que sean reprobados una cada ejecucion, aunque no sean igual de CodigoM....

Cita:
DELETE FROM BDmaterias a
WHERE IdM > (SELECT MIN(IdM) FROM BDmaterias b
WHERE b.CodigoM = a.CodigoM and a.CalificacionM='Reprobado')
Aqui me aparecio el error de sintaxis cerca de 'a' y cuando lo elimine, pues me lo eliminaba todos los registros pero menos el menor (IdM=1). Por ello opte por el otro, solo q no resulta como deseo...


No sé como hacerlo para salga como quiero, solo eliminar los primeros duplicados y que sean reprobados.

Saludos!
Responder Con Cita
  #6  
Antiguo 30-04-2010
sizne sizne is offline
Miembro
 
Registrado: mar 2010
Posts: 104
Poder: 15
sizne Va por buen camino
Holas...
Miren estuve haciendo lo siguiente para mi duda... pero me los elimina todos los "reprobados" sin importar que haya o no duplicados
Cita:
DELETE FROM BDmaterias
WHERE IdM IN
(SELECT IdM
FROM BDmaterias b
WHERE NombreM = b.NombreM and (CodigoM=b.CodigoM)and
(CalificacionM='Reprobado')
...alguien???
Responder Con Cita
  #7  
Antiguo 01-05-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola de nuevo sizne.
Hoy con un poco más de tiempo, revisé a fondo el código anterior, cosa que no hice antes por carecer de él.
Y sí, efectivamente no hace lo que deseas.

Ahora bién, hice una tabla en interbase con los campos involucrados, y la cargué de la siguiente forma:
Código:
IdM  CodigoM   CalificacionM
-----------------------------
1    A         R             (abreviando...)
2    A         R
3    B         R
4    C         R
5    B         R             (mal bicho el profe ...)
La consulta la hice con SELECT para visualizar el resultado (si lo borro difícilmente lo vea):
Código:
IdM  CodigoM   CalificacionM
-----------------------------
1    A         R
3    B         R
Es decir que si cambiamos SELECT por DELETE , esos registros son los que se eliminarán. Por lo tanto
tenemos nuestro problema solucionado.

En definitiva la consulta queda así:
Código:
SELECT * FROM PRUEBA    
WHERE IdM NOT IN(
SELECT MAX(IdM) FROM PRUEBA
GROUP BY CodigoM, CalificacionM)
Fijate que usando MAX(IdM) elimina las primeras apariciones de repetición y usando MIN(IdM), elimina las repeticiones posteriores
Y por supuesto cambiá 'SELECT * FROM' por 'DELETE FROM', al menos si queres que borre...

Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 01-05-2010 a las 06:41:18.
Responder Con Cita
  #8  
Antiguo 01-05-2010
sizne sizne is offline
Miembro
 
Registrado: mar 2010
Posts: 104
Poder: 15
sizne Va por buen camino
Hola ecfisa, gracias eh!!!
Cambie unas cositas en el ejemplo
Código:
IdM  CodigoM   CalificacionM
-----------------------------
1    A         Reprob             (abreviando...)
2    A         Aprob
3    B         Reprob
4    C         Reprob
5    B         Reprob             (mal bicho el profe ...)
En este caso quiero que solo me de resultado:
Código:
IdM  CodigoM   CalificacionM
-----------------------------
2    A         Aprob
4    C         Reprob
5    B         Reprob
Como se vé solo elimina los primeros datos que fueron ingresados, sin importar la calificacionM.
Lo que hice fue lo siguiente en Delphi, funciona pero quiero reducir el codigo y que sea en menor tiempo la ejecucion....y en una sola tabla el recorrido.
Código Delphi [-]
procedure TFKardexM.verificarClick(Sender: TObject);
var i,j:integer;
begin
  i:=0;
  materia.First;
  while i< materia.RecordCount do
    begin
      i:=i+1;
      j:=0;
      materiaT.First;
      while j < materiaT.RecordCount do
      begin
        j:=j+1;
        if (materiaCodigoM.Text  = materiaTCodigoM.Text) then
          begin
            ShowMessage('Son iguales materia '+materiaCodigoM.Text);
            ShowMessage('Son iguales materiaT '+materiaTCodigoM.Text);
            ShowMessage('eliminara en AmateriaT);
            materiaT.Delete;
          end;
      materiaT.Next;
      end;
    materia.Next;
    end;
end;

Aqui estoy usando dos tablas, asi recorro uno por uno y comparo con cada registro de la OTRA tabla.
Pero si fuese solo en una tabla....ya no puedo usar el FIRST,NEXT para comparar....

Saludos...
Responder Con Cita
  #9  
Antiguo 01-05-2010
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola sizne.

A ver...
¿ Lo que queres es que se eliminen las apariciones de registros duplicados cuya calificacion sea 'Reprobado' ?

Si es eso bastaría con modificar el código sql así :
Código:
DELETE FROM PRUEBA
WHERE IdM NOT IN(
SELECT MAX(IdM) FROM PRUEBA 
GROUP BY CodigoM)
AND CalificacionM = 'Reprob'
Saludos.
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
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
Eliminacion duplicados y AS Cabanyaler SQL 2 19-04-2010 12:55:22
problema de eliminacion nikotina SQL 2 28-02-2007 14:34:21
Eliminacion de datos luxus Conexión con bases de datos 2 28-08-2006 16:05:34
Problemas de Eliminación Palmiro Conexión con bases de datos 8 03-02-2006 14:45:14
procedimiento de eliminacion kejos MS SQL Server 3 30-01-2006 16:46:02


La franja horaria es GMT +2. Ahora son las 21:36:45.


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