traer repetir repetidos registros quitar numerar mostrar insertar evitar eliminar duplicados consulta agrupar sql database ms-access duplicate-removal

repetir - quitar duplicados en consulta sql



Evitar registros duplicados, consultar antes de crear nuevos registros (1)

Configuración: estoy creando una base de datos de acceso ms para registrar los resultados de los experimentos que realizaré yo y otros. He creado una forma y un subformulario; la forma principal contiene campos sobre la configuración del equipo y el subformulario contiene los experimentos con esa configuración del equipo. El enlace principal y el enlace hijo son los ID de configuración.

Problema: aunque los campos en la forma principal de [configuración] están limitados a las selecciones de cuadro combinado, todavía hay numerosas combinaciones de configuración. Por lo tanto, cuando el usuario ingresa información en el formulario, es posible que no se den cuenta de que ya existe un registro con la misma configuración y dado que el ID de configuración es un autonumero, parecerá ser un registro único cuando en realidad no lo es.

Pregunta: Me gustaría ejecutar una consulta sobre el evento BeforeInsert para verificar si existe un registro con la misma configuración antes de crear este registro. Si el registro no existe, proceda de la forma habitual; si existe, entonces alerta al usuario y tráelos a ese registro. No sé cómo lograr esto. Lo que he intentado hasta ahora para hacer esto no vale la pena mencionarlo, pero sigo intentando descubrir algo hasta que alguien responda esta publicación.


Creo que querrás dos cosas, dependiendo de qué tan fácil de usar quieras para la interfaz.

Índice único

Agregue un índice único de varias columnas en las columnas en la tabla de Configuraciones en el que su combinación de valores no quiere ser duplicada en otra fila. Puede leer cómo en el enlace proporcionado por KFleschner en los comentarios a su publicación original, o ver la segunda respuesta de esta pregunta que tiene una captura de pantalla para acompañar los pasos: ¿Podemos crear índices únicos multicolumnas en las bases de datos de acceso de MS? . Esto no permitirá duplicados en la tabla de Configuraciones.

Por ejemplo, si su configuración y experimentos eran para equipos de computación y tenía una tabla de Configuración con las siguientes columnas:

SettingID, RAM_GB, CPU_GHz

Entonces su clave principal sería (SettingID) y su índice único de múltiples columnas estaría activado (RAM_GB, CPU_GHz), porque solo quiere un registro con la misma capacidad de RAM y velocidad de CPU.

En el lenguaje de base de datos, su clave principal, SettingID, será lo que se conoce como clave sustituta . Y el nuevo índice único de múltiples columnas será lo que se conoce como una clave natural . Ambos se pueden usar para identificar una fila única, pero la clave principal (la clave sustituta) es lo que se usa en cualquier relación de clave externa , como el ID de configuración en su tabla de Experimentos.

Esto por sí solo evitará el problema duplicado, ya que se aplicará en el nivel de la base de datos. Sin embargo, no hará que su formulario salte automáticamente al registro con una clave natural correspondiente. En su lugar, Access alertará al usuario con un mensaje en la misma línea en que ingresó un registro que violó un índice. Pero nada más. El usuario tendrá que cancelar el nuevo registro e ir a buscar el mismo.

Antes del evento de actualización

El evento Before Insert se activa con el primer carácter de entrada para un nuevo registro. Consulte http://msdn.microsoft.com/en-us/library/office/ff835397.aspx para obtener detalles. Esto es demasiado pronto, quiere el evento Before Update. Y agrega el código al evento de esta manera:

Private Sub Form_BeforeUpdate(Cancel As Integer) Set rst = Me.RecordsetClone rst.FindFirst "[SettingID] <> " & Me.SettingID & " AND [RAM_GB] = " & Me.RAM_GB & " AND [CPU_GHz] = " & Me.CPU_GHz If Not rst.NoMatch Then Cancel = True If MsgBox("Setting already exist; goto existing record?", vbYesNo) = vbYes Then Me.Undo DoCmd.SearchForRecord , , acFirst, "[SettingID] = " & rst("SettingID") End If End If rst.Close End Sub

Este código supone algunas cosas:

  1. [RAM_GB] y [CPU_GHz] son las columnas de su índice único de columnas múltiples.
  2. [SettingID] es la columna en su clave principal.

Ajusta los nombres de las columnas y sus necesidades y luego también tendrás una forma de solicitar y navegar automáticamente al registro existente.