** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Eliminar registros duplicados, consulta group by
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoEliminar registros duplicados, consulta group by

 Responder Responder
Autor
Mensaje
paloma Ver desplegable
Habitual
Habitual


Unido: 24/Junio/2010
Estado: Sin conexión
Puntos: 97
Enlace directo a este mensaje Tema: Eliminar registros duplicados, consulta group by
    Enviado: 05/Marzo/2023 a las 19:45

Hola. Estoy tratando de eliminar registros duplicados de una tabla que después de recoger los datos de excel, se quedan duplicados. Pero no soy capaz.

Lo que intento hacer es pasar una consulta de agrupación para contar los números de veces que existe un registro con el mismo Pedido y misma Posición. Son los dos datos indistinguibles de los registros. Y luego eliminar los registros que contengan esos datos, el número de veces menos 1.

No sé si está bien lo que tengo, yo creo que no, me parece una chapuza pero bueno, en la línea rsttbl.Delete me salta que el registro ya está eliminado. No consigo que el bucle For pase una vuelta menos. ¿Una ayuda plis? Estoy desesperada Confused

      Dim strPdDupl As String
      Dim rstPdDupl As Recordset
      strPdDupl = "SELECT First(tblHcoPedidos" & iAño & ".Pedido) AS PedidoCampo, First(tblHcoPedidos" & iAño & ".Pos) AS PosCampo, Count(tblHcoPedidos" & iAño & ".Pedido) AS NDeDuplicados " _
      & " FROM tblHcoPedidos" & iAño & " GROUP BY tblHcoPedidos" & iAño & ".Pedido, tblHcoPedidos" & iAño & ".Pos " _
      & " HAVING (((Count(tblHcoPedidos" & iAño & ".Pedido))>1) AND ((Count(tblHcoPedidos" & iAño & ".Pos))>1));"
      Set rstPdDupl = CurrentDb.OpenRecordset(strPdDupl)
      While Not rstPdDupl.EOF
         Dim x As Integer
         Dim w As Long
         w = rstPdDupl!PedidoCampo
         Dim rsttbl As Recordset
         Set rsttbl = CurrentDb.OpenRecordset("tblHcoPedidos" & iAño)
         While Not rsttbl.EOF
            If rsttbl!Pedido = rstPdDupl!PedidoCampo Then
               x = rstPdDupl!NDeDuplicados
               Dim r As Integer
               For r = 1 To x - 1
                  rsttbl.Delete
               Next
            End If
        rsttbl.MoveNext
        Wend
        rstPdDupl.MoveNext
     Wend


Gracias,
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13962
Enlace directo a este mensaje Enviado: 05/Marzo/2023 a las 19:59
En vez de solucionar el problema no lo crees.  LOL

Define en esa tabla un índice único por los campos Pedido y Posicion y cuando vayas a añadirlos a la misma no te dejará hacerlo, como ya no hay duplicados no tendrás que eliminarlos.


Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
paloma Ver desplegable
Habitual
Habitual


Unido: 24/Junio/2010
Estado: Sin conexión
Puntos: 97
Enlace directo a este mensaje Enviado: 06/Marzo/2023 a las 11:58

ayy el problema es que en el fichero de excel, las filas del mismo pedido y posición, tienen diferentes columnas con datos. Una fila tiene la columna cumplimentada del proveedor, otra fila tiene la columna del importe... Es un carajal. Yo lo que hacía era llevármelo a access y ahí tratarlo todo, pasando toda la info a todos los registros con mismo pedido y posición. Pero claro, una vez que ya están, no puedo hacer lo que dices Ermm

No sé qué hacer,, 
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13962
Enlace directo a este mensaje Enviado: 06/Marzo/2023 a las 13:44
¿Y cuál es el problema? ... la tabla destino es la que no te va a dejar poner duplicados.

Si más no, primero importalo a una tabla temporal y de aquí una vez procesados los pasas a la definitiva.

Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
paloma Ver desplegable
Habitual
Habitual


Unido: 24/Junio/2010
Estado: Sin conexión
Puntos: 97
Enlace directo a este mensaje Enviado: 06/Marzo/2023 a las 20:27

Vale, gracias Mihura, pero hay otro problema jeje. El Pedido y la posición, por separados, sí pueden repetirse. Es decir, puede haber un pedido 9874 y Posición 1 y también puede haber un pedido 9874 y Posición 2 o pedido 8888 y Posición 1

Entonces no puedo poner en la tabla destino un índice único en esos dos campos. 

Lo que estoy intentando hacer es copiar en la tabla destino pero con GROUP BY o incluso con DISTINCT pero sigo sin lograr que me copie únicamente un solo registro:

INSERT INTO tblHcoPedidos2023 (Pedido, Pos, Suministrador, Concepto, Fecha, Importe) SELECT DISTINCT Pedido, Pos, Suministrador, Concepto, Fecha, Importe FROM tblHcoPedidosTemp


INSERT INTO tblHcoPedidos2023 (Pedido, Pos, Suministrador, Concepto, Fecha, Importe) SELECT Pedido, Pos, Suministrador, Concepto, Fecha, Importe 
FROM tblHcoPedidosTemp
GROUP BY tblHcoPedidosTemp.Pedido, tblHcoPedidosTemp.Pos, tblHcoPedidosTemp.Suministrador, tblHcoPedidosTemp.Concepto, tblHcoPedidosTemp.Fecha, tblHcoPedidosTemp.Importe

En este último, si pusiese los campos el Pedido y Posición, me copia solo un registro de cada pero claro, la instrucción Group by me obliga a meter todos los campos y ya se descuadra

¿Qué puedo hacer?

Mil gracias
 
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 13962
Enlace directo a este mensaje Enviado: 06/Marzo/2023 a las 21:38
Se puede crear un índice único con dos o más campos. No hay problema.
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
paloma Ver desplegable
Habitual
Habitual


Unido: 24/Junio/2010
Estado: Sin conexión
Puntos: 97
Enlace directo a este mensaje Enviado: 06/Marzo/2023 a las 21:56

ya pero yo si pongo los campos Pedido y Posición como clave (sin duplicados) solo me cogerá un registro de los que tengan varios Pedidos y Posiciones pero como decía antes, puedo tener varios pedidos y posiciones repetidos. Lo importante es la combinación Pedido-Posición.

Es decir, por ejemplo, los registros:
Pedido 8888 y Posicion 1
Pedido 8888 y Posicion 1
Pedido 8888 y Posicion 2
Pedido 8888 y Posicion 2
Pedido 9999 y Posicion 1

De estos registros, me interesa que coger el pedido 8888 - Posición 1, pedido 8888 - Posición 2 y pedido 9999 - Posición 1 y al ser estos campos clave 

De todas formas, lo he intentado y no me los pega por la infracción de clave 
Arriba
paloma Ver desplegable
Habitual
Habitual


Unido: 24/Junio/2010
Estado: Sin conexión
Puntos: 97
Enlace directo a este mensaje Enviado: 06/Marzo/2023 a las 22:19

Ya lo tengo, aunque no sé cómo tirará con la tabla real, he estado haciendo pruebas con una de pruebas de apenas registros.

Saco un recordset DISTINCT para sacar los registros únicos, sin duplicar y luego pego los valores de ese recordset a otro de la tabla destino.

Dim strUnico As String
Dim rstUnico As Recordset
Dim rst2 As Recordset
strUnico = "SELECT DISTINCT * FROM tblHcoPedidosTemp"
Set rstUnico = CurrentDb.OpenRecordset(strUnico)
While Not rstUnico.EOF
   Set rst2 = CurrentDb.OpenRecordset("tblHcoPedidos2023")
      rst2.AddNew
      rst2!Pedido = rstUnico!Pedido
      rst2!Pos = rstUnico!Pos
      rst2!Suministrador = rstUnico!Suministrador 
      rst2!Concepto= rstUnico!Concepto
      rst2!Fecha= rstUnico!Fecha
      rst2!Importe= rstUnico!Importe
      rst2.Update
rstUnico.MoveNext
Wend
rst2.Close: Set rst2 = Nothing
rstUnico.Close: Set rstUnico = Nothing

Muchas gracias por todo de todas maneras, 

Saludos,
Arriba
paloma Ver desplegable
Habitual
Habitual


Unido: 24/Junio/2010
Estado: Sin conexión
Puntos: 97
Enlace directo a este mensaje Enviado: 06/Marzo/2023 a las 22:32

bueno, no me funciona del todo jiji, me sigue duplicando algo, bueno voy a serguir dándole vueltas :)
Arriba
paloma Ver desplegable
Habitual
Habitual


Unido: 24/Junio/2010
Estado: Sin conexión
Puntos: 97
Enlace directo a este mensaje Enviado: 06/Marzo/2023 a las 22:46


creo que ya está!!

es: strUnico = "SELECT DISTINCT Pedido, Pos FROM tblHcoPedidosTemp"
Arriba
paloma Ver desplegable
Habitual
Habitual


Unido: 24/Junio/2010
Estado: Sin conexión
Puntos: 97
Enlace directo a este mensaje Enviado: 06/Marzo/2023 a las 23:53

Ahora sí. No podía recoger el resto de valores únicamente con el DISTINCT Pedido, Pos. Ahora está ok

     Dim strUnico As String
     Dim rstUnico As Recordset
     Dim rst1, rst2 As Recordset
     strUnico = "SELECT DISTINCT Pedido, Pos FROM tblHcoPedidosTemp"
     'RECORDSET CON LOS REGISTROS ÚNICOS, CON PEDIDO Y POSICIÓN
     Set rstUnico = CurrentDb.OpenRecordset(strUnico)
     While Not rstUnico.EOF
        'RECORDSET TABLA ORIGEN CUYO PEDIDO Y POSICIÓN COINCIDE CON EL RECORDSET ANTERIOR
        Set rst1 = CurrentDb.OpenRecordset("SELECT * FROM tblHcoPedidosTemp WHERE tblHcoPedidosTemp.Pedido = " & rstUnico!Pedido & " AND tblHcoPedidosTemp.Pos = " & rstUnico!Pos)
           'RECORDSET TABLA DESTINO
           Set rst2 = CurrentDb.OpenRecordset("tblHcoPedidos" & iAño)
           rst2.AddNew
           rst2!Pedido = rst1!Pedido
           rst2!Pos = rst1!Pos
           rst2!Suministrador = rst1!Suministrador 
           rst2!Concepto= rst1!Concepto
           rst2!Fecha= rst1!Fecha
           rst2!Importe= rst1!Importe
           rst2.Update
     rstUnico.MoveNext
     Wend
     rst2.Close: Set rst2 = Nothing
     rst1.Close: Set rst1 = Nothing
     rstUnico.Close: Set rstUnico = Nothing



Arriba
paloma Ver desplegable
Habitual
Habitual


Unido: 24/Junio/2010
Estado: Sin conexión
Puntos: 97
Enlace directo a este mensaje Enviado: 01/Abril/2023 a las 19:27
Por favor, pueden cerrar el hilo, el tema está resuelto tal y como indico en mi último mensaje
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable