|
Responder
|
| Autor | |
rokoko
Colaborador
Unido: 16/Febrero/2008 Localización: Pamplona Estado: Sin conexión Puntos: 3071 |
Tema: No repetir numero en un registro en X camposEnviado: 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
|
|
![]() |
|
pitxiku
Colaborador
Unido: 27/Septiembre/2017 Localización: En mi casa Estado: Sin conexión Puntos: 1536 |
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 |
|
![]() |
|
rokoko
Colaborador
Unido: 16/Febrero/2008 Localización: Pamplona Estado: Sin conexión Puntos: 3071 |
Enviado: 21/Abril/2024 a las 18:45 |
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 |
|
![]() |
|
pitxiku
Colaborador
Unido: 27/Septiembre/2017 Localización: En mi casa Estado: Sin conexión Puntos: 1536 |
Enviado: 22/Abril/2024 a las 22:28 |
|
Pistas: bloque de instrucciones Si, comparaciones y lanzar error cuando haya 2 datos iguales.
|
|
![]() |
|
rokoko
Colaborador
Unido: 16/Febrero/2008 Localización: Pamplona Estado: Sin conexión Puntos: 3071 |
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 |
|
![]() |
|
pitxiku
Colaborador
Unido: 27/Septiembre/2017 Localización: En mi casa Estado: Sin conexión Puntos: 1536 |
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.
|
|
![]() |
|
joanka
Habitual
Unido: 07/Abril/2021 Localización: Lleida Estado: Sin conexión Puntos: 144 |
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
|
|
![]() |
|
rokoko
Colaborador
Unido: 16/Febrero/2008 Localización: Pamplona Estado: Sin conexión Puntos: 3071 |
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 .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 |
|
![]() |
|
rokoko
Colaborador
Unido: 16/Febrero/2008 Localización: Pamplona Estado: Sin conexión Puntos: 3071 |
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
|
|
![]() |
|
Responder
|
|
|
Tweet
|
| Ir al foro | Permisos de foro ![]() Usted No puede publicar nuevos temas en este foro Usted No puede responder a temas en este foro Usted No puede borrar sus mensajes en este foro Usted No puede editar sus mensajes en este foro Usted No puede crear encuestas en este foro Usted No puede votar en encuestas en este foro |