Evitar registros duplicados mediante función

Es una pregunta para Jacinto Trillo
Me gustaría crear una función si se puede y si no en algún evento del formulario, para evitar crear duplicados, es decir que cuando introdujera los valores en los campos del registro del formulario me impidiera añadir registros iguales o actualizar los registros si es un registro antiguo con los valores de otro, si ya tengo otro idéntico (salvo por el ID que siempre será diferente) saltando un msgbox y deshaciendo todo lo rellenado por ejemplo o alguna otra idea que consideres.

Para verlo mejor si puedes incorporar la función o evento a tu ejemplo de RegistrosSiNoTodos que me enviaste, sería genial porque lo entiendo mejor con ejemplos.

Cuando puedas... No hay prisa, y a la espera de tu ayuda muchísimas.

Respuesta
1

Depro. Entre que termino de prepararte tu BD, mira éste código porque será el que teincluya, para evitar Duplicados desde la entrada del Titulo.

‘En la Cabecera del Módulo asociado al Formulario. Fuera de cualquier Procedimiento o Función
Dim IntentosTITULO As Integer

Private Sub Form_Load()
On Error GoTo Form_Load_TratamientoErrores

IntentosTITULO = 0

Form_Load_Salir:
On Error GoTo 0
Exit Sub
Form_Load_TratamientoErrores:
MsgBox "Error " & Err.Number & " en Procedimiento.: Form_Load de Documento VBA: Form_Clientes (" & Err.Description & ")"
Resume Form_Load_Salir
End Sub

Private Sub TITULO_BeforeUpdate(Cancel As Integer)
On Error GoTo TITULO_BeforeUpdate_Err

If (Eval("DLookUp(""[TITULO]"",""[LIBROS]"",""[TITULO] = Form.[TITULO] "") Is Not Null")) Then
'Si el valor de TITULO no es único, muestra un mensaje.
Beep
MsgBox "El TITULO que has introducido ya existe." & vbCrLf & "Introduce uno que sea Unico.", vbCritical, "TITULO DE LIBRO YA EXISTE"
IntentosTITULO = IntentosTITULO + 1

Call CuentaIntentos ' Para permitir solo tres Intentos
'Vuelve al control TITULO.
DoCmd.CancelEvent
End If

TITULO_BeforeUpdate_Exit:
Exit Sub
TITULO_BeforeUpdate_Err:
MsgBox Error$
Resume TITULO_BeforeUpdate_Exit
End Sub

Function CuentaIntentos()

If IntentosTITULO = 3 Then
MsgBox "Llevas tres Intentos sin exito." & vbCrLf & "El Formulario se cerrará", vbCritical, "MUCHOS INTENTOS"
DoCmd.Close acForm, "NombreDeTuFormulario"
End If
End Function

Mis saludos >> Jacinto

Hola Jacinto

El problema que veo es que si solo nos basamos en el titulo del libro, cabe la posibilidad que sin ser duplicados haya varios libros con el mismo título pero de distinto autor, editorial o incluso puede haber dos titulos iguales del mismo autor, editorial, etc. pero uno es el volumen 1  y el otro es el Volumen 2 (campo Tomo_Volumen). O sea que habría 2 titulos iguales pero serían diferentes registros.

Para evitar esto...¿Podría ampliarse el testeo de si es duplicado no solo al campo título sino que incluyera otros campos como "autor", "editorial", "tomo_volumen" y "año"?

O bien que se comprobarán todos los campos excepto el IDLIBRO (que como es clave ppal siempre es única) y cuando hubiera rellenado todo el registro en "antes de actualizar" me avisara, ... pero claro eso implica estar un buen rato rellenando el reg. para luego arriesgarte a que sea un duplicado.

Creo, no sé qué piensas que tal vez sea mejor usar la función comprobando más campos como te comenté antes, pero no todos:

TITULO, AUTOR, EDITORIAL, TOMO_VOLUMEN, AÑO

si éstos están duplicados es que el registro es un duplicado.

Ya me cuentas

Un saludo y muchas gracias por la ayuda

Rafael: Esto serán dos paellas, pero si eres especialista bienvenidas sean.

Tendré que hacer algún ensayo antes de mandarte un código improvisado que te pueda causar problemas. Me parece buena idea asegurar que no hay duplicidad, sondeando más de un Campo. Mis saludos >> Jacinto

Hola Jacinto

Dos paellas, fideuá de Gandía y arroz al horno de Xátiva como mínimo... :-)

Si necesitas algún dato más sobre el formulario o los campos me dices.

Muchas gracias

Hola Jacinto

Cuando puedas, en relación a esta pregunta de "evitar registros duplicados mediante función"... quedó pendiente ampliar la función para sondear más de un campo (ver respuestas del 9 de Enero, una mía y una tuya).

Un saludo y gracias por todo

Rafa: Ciertamente ésta pregunta estaba pendiente por mi parte, y la verdad es que no lo recordaba. En cualquier caso ahora recuerdo que era por un tema de "Extensión" del código necesario y con el riesgo de dejar ventanas de Error. Habías comentado el Filtrar>>

Titulo, autor, editorial, tomo_volumen, año

Retomo el asunto, y te comento que en la operativa normal, será muy dificil capturar un Duplicado, sin que haya un Identificador único, que en caso de Bibliotecas creo que es el ISBN y en algún caso éste y poco más o solo el ISBN. Lo ignoro

Imagina que fácil será "Solo" con un Campo el que no detecte Duplicado:

Titulo:

Recopilación de las Obras de León X

Recopilación de las Obras de Leon X >> Distinto (Tiene un acento de menos)

Recopilacion de las Obras de León X >> Distinto (Tiene un acento de menos)

Recopilación de las Obras de León X >> Distinto (Tiene un espacio de más)

Y mucho más solo con el Título.

Multiplica ésta casuistica por 5 Campos. Realmente todo es posible hacerlo, pero para controlar un proceso, primero hay que preguntarse la forma más sencilla de hacerlo.

Y al final mi pregunta es: ¿Por qué no añadir el campo del ISBN y sondeamos el Duplicado por ese Campo?.

Espero tus noticias. Saludos >> Jacinto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas