Imprimir página | Cerrar ventana

Detección de duplicados

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=87054
Fecha de impresión: 26/Marzo/2026 a las 15:29


Tema: Detección de duplicados
Publicado por: JoseraGR
Asunto: Detección de duplicados
Fecha de publicación: 30/Marzo/2025 a las 21:06
Buenas

Aqui estamos otra vez con otro tema que tengo, digamos que ando afinando la base de datos que tengo y esto son ya pequeños detalles para que quede mas "fina" la base de datos.
La cuestión es que tengo un formulario en el que voy rellenando varios datos del modelo ferroviario que tengo. Todos están relacionados mediante el campo REFERENCIA, el cuan lo tengo como campo clave en todas las tablas, no permitiendo que esté vacío y siendo obligatorio su cumplimentación. Al se campo clave no permite duplicados, y hasta aqui bien. Lo que ocurre es que me dice que el modelo ya existe cuando le doy a salir o paso a cualquier otra acción en el formulario.
La cuestión es que quiero que cuando introduzca la REFERENCIA en el cuadro de texto en el evento "al salir", realice una búsqueda por si estuviera duplicado, y en caso de estarlo me diera un mensaje de error.
NO se si con todo este rollo me he explicado bien de que es lo que busco.

Os dejo aqui el código que he realizado:
Private Sub txtReferencia_Exit(Cancel As Integer)
    Dim vNuevaReferencia As String
    Dim vReferencia As String
    Dim dbs As dao.Database
    Dim rts As dao.Recordset
    'Tomamos el valor de la referencia nueva
    vNuevaReferencia = Forms!F_Principal!txtReferencia.Value
    'Inicializa la referencia
    vReferencia = ""
    Set dbs = CurrentDb
    Set rts = dbs.OpenRecordset("T_ModeloGeneral", dbOpenSnapshot)
    'comprobamos que la consulta no esta vacia
    If rts.RecordCount <> 0 Then
        'Nos movemos al primer registro
        rts.MoveFirst
        'Recorremos la tabla hasta el final
        Do Until rts.EOF
            'Tomamos el valor de la referencia de cada registro
            vReferencia = rts.Fields("Referencia").Value
            'Verificamos que la nueva referencia no esta ya incluida
            If vNuevaReferencia <> vReferencia Then
                'Movemos el recordset al siguiente registro
                rts.MoveNext
            Else
                If vReferencia <> "" Then
                    'Mensaje de error al introducir datos
                    MsgBox "LA REFERENCIA INDICADA YA EXISTE", vbOKOnly, "ERROR DATOS"
                    'Damos como valor vacio a la referencia nueva
                    'Forms!F_Principal!txtReferencia.Value = ""
                    'Movemos el recordset al ultimo registro
                    rst.MoveLast
                End If
            End If
        Loop
    End If
    'Cerramos conexiones y liberamos memoria
    rts.Close
    dbs.Close
    Set rts = Nothing
    Set dbs = Nothing

End Sub

El problema lo tengo solamente cuando la REFERENCIA esta repetida, se queda colgado y tengo que cerrar la base, pues como me obliga a rellenarlo no me responde en ningún momento.

Bueno espero vuestras respuesta a ver que ideas tenéis.

Un saludo



Respuestas:
Publicado por: Mihura
Fecha de publicación: 30/Marzo/2025 a las 23:10
Don Juanjo Luna (Lunasoft) MVP me manda esto ....

¡Hola! Aquí hay algunas sugerencias para mejorar tu código y evitar que se quede colgado cuando la referencia está repetida:
Simplificar la lógica de búsqueda: En lugar de recorrer todos los registros, puedes usar una consulta directa para verificar si la referencia ya existe.
Evitar el uso de MoveLast: Esto puede causar problemas si el recordset está vacío o si ya estás en el último registro.
Aquí tienes una versión mejorada de tu código:
Private Sub txtReferencia_Exit(Cancel As Integer)
    Dim vNuevaReferencia As String
    Dim dbs As dao.Database
    Dim rts As dao.Recordset
    'Tomamos el valor de la referencia nueva
    vNuevaReferencia = Forms!F_Principal!txtReferencia.Value
    Set dbs = CurrentDb
    'Realizamos una consulta directa para verificar si la referencia ya existe
    Set rts = dbs.OpenRecordset("SELECT Referencia FROM T_ModeloGeneral WHERE Referencia = '" & vNuevaReferencia & "'", dbOpenSnapshot)
   'Si encontramos registros, la referencia ya existe
    If Not rts.EOF Then
        MsgBox "LA REFERENCIA INDICADA YA EXISTE", vbOKOnly, "ERROR DATOS"
        'Cancelar la salida del cuadro de texto
        Cancel = True
    End If
    'Cerramos conexiones y liberamos memoria
    rts.Close
    dbs.Close
    Set rts = Nothing
    Set dbs = Nothing
End Sub

Está sin comprobar ... 


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

http://www.accessaplicaciones.com" rel="nofollow - Access Aplicaciones
http://www.tecsys.es" rel="nofollow - Tecsys.es


Publicado por: jlsalamanca
Fecha de publicación: 30/Marzo/2025 a las 23:13
Hola buenas noches,
Supongo que habrá más expertos que yo pero te contesto lo que yo haría en tu caso
Primero utilizar el evento después de modificar
Segundo utilizar la función dlookup para comprobar si existe la referencia el tú tabla más o menos sería
If dlookup("referencia","nombredelatabla en la que está referencia","referencia="& me.txttreferencia)=me.txtreferencia


Publicado por: xavi
Fecha de publicación: 31/Marzo/2025 a las 09:02
Desde la ignorancia: ¿porqué el evento Al salir?

Yo utilizaría el evento Antes de actualizar. Algo así:

If DCount("*", "T_ModeloGeneral", "Referencia ='" & Me!txtReferencia & "'") > 0 Then
  MsgBox "La referencia ya existe", vbExclamation
  Cancel = True
End if

Un saludo


-------------
Xavi, un minyó de Terrassa

http://www.llodax.com" rel="nofollow - Mi web



Imprimir página | Cerrar ventana