** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - No repetir  numero en un registro en X campos
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoNo repetir numero en un registro en X campos

 Responder Responder
Autor
Mensaje
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 3071
Enlace directo a este mensaje Tema: No repetir numero en un registro en X campos
    Enviado: 20/Abril/2024 a las 18:13
Saludos a todos. Hacia tiempo que no me dejaba caer por aqui....la vida me ha llevado por otro camino.
A ver si consigo explicarme.

En una sola linea de registro y en unos campos concretos no quiero que se repita un numero por ejemplo en campo 1-2-3

id     Campo1   Campo2   campo3    Campo4   campo5
1       808           809         810       811            812
2       808           808         810       850            808
3       809           808         808       850            850         


El id 1 seria correcto, pero el id 2 e id 3 incorrectos se repiten el numero 808 en campo 1-2-3

La verificación seria al darle a un botón del formulario(no continuo) por ejemplo y que salte algún aviso

Llevo dandole vueltas mucho rato y no se como plantearlo, a ver si me dais alguna pista.

Saludos
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1536
Enlace directo a este mensaje Enviado: 20/Abril/2024 a las 23:48
¿Versión de Access?

Si tu Access dispone de macros de datos, puedes crear una macro "Antes del cambio", donde verifiques que esos 3 datos son distintos:

- https://access-global.net/access-macros-de-datos-elementales/

- https://learn.microsoft.com/es-es/office/client-developer/access/desktop-database-reference/before-change-macro-event
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 3071
Enlace directo a este mensaje Enviado: 21/Abril/2024 a las 18:45
Publicado originalmente por pitxiku pitxiku escribió:

¿Versión de Access?

Si tu Access dispone de macros de datos, puedes crear una macro "Antes del cambio", donde verifiques que esos 3 datos son distintos:

- https://access-global.net/access-macros-de-datos-elementales/

- https://learn.microsoft.com/es-es/office/client-developer/access/desktop-database-reference/before-change-macro-event

Ya veo que con formato mdb no esta esta opción. Va a correr en un pc con runtime y me imagino que funcionara bien con accdb.

Lo miro a ver... alguna pista de como plantear la macro??

Gracias


Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1536
Enlace directo a este mensaje Enviado: 22/Abril/2024 a las 22:28
Pistas: bloque de instrucciones Si, comparaciones y lanzar error cuando haya 2 datos iguales.
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 3071
Enlace directo a este mensaje Enviado: 27/Abril/2024 a las 09:51
Ahora que he sacado un rato, llevo probando varias cosas, pero no lo consigo.
Estoy utilizando Antes de cambio, mi idea es que si todos los campos que quiero son diferentes Ok, Si no, provocar un error.

Pero siempre me provoca el error.
Dejo una captura de mi idea.

https://www.dropbox.com/scl/fi/e20s73tvnicbruf24bfyi/Macro.jpg?rlkey=60rehc6472hn3e5sanw3aee5g&dl=0

Saludos


Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1536
Enlace directo a este mensaje Enviado: 28/Abril/2024 a las 13:01
Con 3 campos, como era tu primer ejemplo, es sencillo:

- Si Campo1 = Campo2 --> lanza el error
- Si Campo2 = Campo3 --> lanza el error
- Si Campo1 = Campo3 --> lanza el error

Pero en tu captura hay un montón de campos, con este sistema te puede salir un churro de macro. Se puede hacer, pero hay que comparar cada dato con todos los siguientes, por lo que es complicado no dejarte algo en el tintero, o localizar algún error en la programación de la macro.

Una posibilidad es usar una función de VBA que gestione este tema: le pasas todos los campos como parámetros, y usas algún sistema de los que hay en Internet para verificar los duplicados. Uno (¿sencillo?) es agregar esos datos como elementos a una colección, usando el mismo dato como clave de la colección. Como no se pueden duplicar claves, te dará un error cuando haya 2 datos duplicados:


En mis pruebas, el parámetro Key no me ha dado fallo por usar números, pero si es tu caso, conviértelos en texto o agrega algún carácter raro para obligar a VBA a tratarlos como texto: el índice dentro de la colección siempre es un número y la clave un texto, para que VBA siempre sepa por qué tipo de referencia debe buscar el elemento.

Un pequeño ejemplo: Rokoko_duplicados.zip

Otra posibilidad es usar una función recursiva, donde cada elemento se compara con todos los que hay detrás. Por si te quieres entretener.
Arriba
joanka Ver desplegable
Habitual
Habitual


Unido: 07/Abril/2021
Localización: Lleida
Estado: Sin conexión
Puntos: 144
Enlace directo a este mensaje Enviado: 28/Abril/2024 a las 13:06
Hola,

La forma correcta sería ejecutar un recordset con VBA y evaluar los registros, creo que la macro con "SI" te evalúa el registro en el que estas, igualmente las condiciones del "SI" que has puesto en la captura no se parecen en nada a campo1, campo2, o campo3
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 3071
Enlace directo a este mensaje Enviado: 28/Abril/2024 a las 21:06
Gracias por la info y las molestias, lo voy a mirar a ver si lo puedo hacer mas elegante.
De momento lo he solucionado de una forma sencilla, pero poco profesional por decirlo de alguna forma Big smile.

Meto los datos en una tabla y busco duplicados.....

Function VerificoDuplicados() As Boolean


DoCmd.SetWarnings False
'Vacio tabla, solo se utiliza para esto
DoCmd.RunSQL "DELETE tbVerificarCampoClaveTEMP.* FROM tbVerificarCampoClaveTEMP;"

'Meto todos los campos que no quiero que se repitan. Nz para si esta vacio meta 0 y no de error
DoCmd.RunSQL "INSERT INTO tbVerificarCampoClaveTEMP ( Trabajador ) SELECT " & Nz(Me.AmbuCond, 0) & " AS Expr1;"
DoCmd.RunSQL "INSERT INTO tbVerificarCampoClaveTEMP ( Trabajador ) SELECT " & Nz(Me.AmbuBom, 0) & " AS Expr1;"

DoCmd.RunSQL "INSERT INTO tbVerificarCampoClaveTEMP ( Trabajador ) SELECT " & Nz(Me.Bom1, 0) & " AS Expr1;"
DoCmd.RunSQL "INSERT INTO tbVerificarCampoClaveTEMP ( Trabajador ) SELECT " & Nz(Me.Bom2, 0) & " AS Expr1;"
DoCmd.RunSQL "INSERT INTO tbVerificarCampoClaveTEMP ( Trabajador ) SELECT " & Nz(Me.Bom3, 0) & " AS Expr1;"
DoCmd.RunSQL "INSERT INTO tbVerificarCampoClaveTEMP ( Trabajador ) SELECT " & Nz(Me.Bom4, 0) & " AS Expr1;"
DoCmd.RunSQL "INSERT INTO tbVerificarCampoClaveTEMP ( Trabajador ) SELECT " & Nz(Me.Bom5, 0) & " AS Expr1;"
DoCmd.RunSQL "INSERT INTO tbVerificarCampoClaveTEMP ( Trabajador ) SELECT " & Nz(Me.Bom6, 0) & " AS Expr1;"
DoCmd.RunSQL "INSERT INTO tbVerificarCampoClaveTEMP ( Trabajador ) SELECT " & Nz(Me.Bom7, 0) & " AS Expr1;"
DoCmd.RunSQL "INSERT INTO tbVerificarCampoClaveTEMP ( Trabajador ) SELECT " & Nz(Me.Bom8, 0) & " AS Expr1;"
DoCmd.RunSQL "INSERT INTO tbVerificarCampoClaveTEMP ( Trabajador ) SELECT " & Nz(Me.Bom9, 0) & " AS Expr1;"
DoCmd.RunSQL "INSERT INTO tbVerificarCampoClaveTEMP ( Trabajador ) SELECT " & Nz(Me.Bom10, 0) & " AS Expr1;"

DoCmd.RunSQL "INSERT INTO tbVerificarCampoClaveTEMP ( Trabajador ) SELECT " & Nz(Me.Cabo1, 0) & " AS Expr1;"
DoCmd.RunSQL "INSERT INTO tbVerificarCampoClaveTEMP ( Trabajador ) SELECT " & Nz(Me.Cabo2, 0) & " AS Expr1;"
DoCmd.RunSQL "INSERT INTO tbVerificarCampoClaveTEMP ( Trabajador ) SELECT " & Nz(Me.Cabo3, 0) & " AS Expr1;"
DoCmd.RunSQL "INSERT INTO tbVerificarCampoClaveTEMP ( Trabajador ) SELECT " & Nz(Me.Cabo4, 0) & " AS Expr1;"

DoCmd.RunSQL "INSERT INTO tbVerificarCampoClaveTEMP ( Trabajador ) SELECT " & Nz(Me.Cond1, 0) & " AS Expr1;"
DoCmd.RunSQL "INSERT INTO tbVerificarCampoClaveTEMP ( Trabajador ) SELECT " & Nz(Me.Cond2, 0) & " AS Expr1;"
DoCmd.RunSQL "INSERT INTO tbVerificarCampoClaveTEMP ( Trabajador ) SELECT " & Nz(Me.Cond3, 0) & " AS Expr1;"
DoCmd.RunSQL "INSERT INTO tbVerificarCampoClaveTEMP ( Trabajador ) SELECT " & Nz(Me.Cond4, 0) & " AS Expr1;"

DoCmd.RunSQL "INSERT INTO tbVerificarCampoClaveTEMP ( Trabajador ) SELECT " & Nz(Me.GRT_1, 0) & " AS Expr1;"
DoCmd.RunSQL "INSERT INTO tbVerificarCampoClaveTEMP ( Trabajador ) SELECT " & Nz(Me.GRT_2, 0) & " AS Expr1;"

DoCmd.SetWarnings True

'Si encuntra un duplicado...diferente a 0, lo filtro en la consulta los 0 si los pone Nz
If DCount("*", "Buscar duplicados por tbVerificarCampoClave") > 0 Then
VerificoDuplicados = True
Else
VerificoDuplicados = False
End If

End Function



'Llamo a funcion que me verifica campos que no quiero duplicados de trabajadores
If VerificoDuplicados = True Then
MsgBox "Campos clave duplicados, no puede haber ninguno de los principales repetidos."
Exit Sub
End If


Editado por rokoko - 28/Abril/2024 a las 21:29
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 3071
Enlace directo a este mensaje Enviado: 05/Mayo/2024 a las 19:29
Buenas.

Pues de momento lo dejo como en el hilo de arriba. Me es suficiente.
He estado probando lo de pitxiku, pero no lo acabo de cuadrar...

Se puede cerrar

Saludos y gracias
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable