** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Detección de duplicados
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Detección de duplicados

 Responder Responder
Autor
Mensaje
JoseraGR Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 06/Octubre/2020
Localización: Granada
Estado: Sin conexión
Puntos: 31
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita JoseraGR Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Detección de duplicados
    Enviado: 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
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: en línea
Puntos: 14428
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita Mihura Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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.

Access Aplicaciones
Tecsys.es
Arriba
jlsalamanca Ver desplegable
Nuevo
Nuevo
Avatar

Unido: 26/Noviembre/2013
Localización: madrid
Estado: Sin conexión
Puntos: 35
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita jlsalamanca Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 14926
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita xavi Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 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

Mi web
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable