** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Evitar Duplicar registro cuando coinciden 3 campos
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoEvitar Duplicar registro cuando coinciden 3 campos

 Responder Responder
Autor
Mensaje
JLMM Ver desplegable
Habitual
Habitual


Unido: 06/Julio/2015
Localización: Herrera
Estado: Sin conexión
Puntos: 70
Enlace directo a este mensaje Tema: Evitar Duplicar registro cuando coinciden 3 campos
    Enviado: 12/Abril/2017 a las 19:51
Buenas tardes, espero podais ayudarme, antes de nada informaro que utilizo access 2003 y he revisado en busqueda y no encontré nada.Describo mi duda:
 
Dispongo de un formulario con campos:
a) Operador 1: Jose (cuadro combinado)
b) Operador 2: Paco (cuadro combinado)
c) Fecha
 
Pues bien, debo evitar que dupliquen formulario cuando los tres campos coinciden. He intentado con incluir en la tabla estos tres campos como clave principal, pero sigue igual.
 
Espero podais ayudarme. Gracias de antemano
Arriba
xavi Ver desplegable
Administrador
Administrador
Avatar
Terrassa-BCN

Unido: 10/Mayo/2005
Localización: Catalunya ||||
Estado: Sin conexión
Puntos: 12975
Enlace directo a este mensaje Enviado: 12/Abril/2017 a las 19:59
Crea una función que evalúe la cuenta de registros que cumplen la condición y llámala desde el BeforeUpdate de cada uno de los controles implicados

Function HayDuplicados() As Boolean
Dim strCriterio As String
' Para empezar los 3 campos deben estar rellenos
If Me!Operador1 = "" Or Me!Operador2 = "" Or Not IsDate(Me!Fecha) Then
  HayDuplicados = False
  Exit Function
End If

' Los 3 campos rellenos
' Creamos criterio
strCriterio = "Operador1 = '" & Me!Operador1 & "' And Operador2 = '" & Me!Operador2 & "' AND Fecha = #" & Format(Me!fecha, "mm/dd/yyyy") & "#"
HayDuplicados = (Dcount("*", "LaTabla", strCriterio) > 0)
End Function

En el BeforeUpdate de cada uno de los controles lanzas la función:

If HayDuplicados Then
  MsgBox "Combinación duplicada.", vbExclamation, "AVISO"
  Cancel = True
End If

(escrito del tiron)

Xavi, un minyó de Terrassa

Mi web
Arriba
JLMM Ver desplegable
Habitual
Habitual


Unido: 06/Julio/2015
Localización: Herrera
Estado: Sin conexión
Puntos: 70
Enlace directo a este mensaje Enviado: 13/Abril/2017 a las 11:05
Gracias Xavi por ayudarme, pero estoy algo perdido con visual, lo que he echo es lo siguiente:
 
a)He creado un modulo e inserte la función
b)Formulario beforeupdate coloque el if - then
 
Pero nada sale error. despues incluí la función en el formulario y No coinciden los criterios... por donde puedo tirar...
 
Gracias por tu paciencia
Arriba
JLMM Ver desplegable
Habitual
Habitual


Unido: 06/Julio/2015
Localización: Herrera
Estado: Sin conexión
Puntos: 70
Enlace directo a este mensaje Enviado: 13/Abril/2017 a las 14:04
Xavi, he seguido probando y he colocado la función en el formulario (alt + f11) y lo he quitado del módulo.
Continuo manteniendo en beforeupdate la condición if-then.
Ahora me dice visual error 3464  No coinciden los datos de criterio y queda en amarillo la expresión
 
HayDuplicados = (Dcount("*", "Operador", strCriterio) > 0)
 
Qué me falta ? Siento ser tan "patoso"con el visual
Arriba
JLMM Ver desplegable
Habitual
Habitual


Unido: 06/Julio/2015
Localización: Herrera
Estado: Sin conexión
Puntos: 70
Enlace directo a este mensaje Enviado: 18/Abril/2017 a las 11:46
Xavi, he mirado por google y no encuentro camino para seguir adelante.
Necesitaría un "empujón" para saber por donde pueden ir el tema

Gracias de antemano por vuestras ayudas
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11668
Enlace directo a este mensaje Enviado: 18/Abril/2017 a las 15:18
Esto:

strCriterio) > 0

Tiene que ser un string, a mí no me lo parece, además de que veo un paréntesis cerrado, pero no veo ninguno abierto.

Pulsa F1 con la función DCount seleccionada y repasa la ayuda ... verás como te 'ayuda' a salir del atolladero.


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

Access Aplicaciones
Tecsys.es
Arriba
JLMM Ver desplegable
Habitual
Habitual


Unido: 06/Julio/2015
Localización: Herrera
Estado: Sin conexión
Puntos: 70
Enlace directo a este mensaje Enviado: 18/Abril/2017 a las 16:10
Sr Miura: Funciona ¡¡¡ Cuanto se lo agradezco

HayDuplicados = (Dcount("*", "Operador", strString) > 0)

Pero me permite al final guardar el registro. Esto me confunden.

Alguna ayuda para seguir. Mil gracias

Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11668
Enlace directo a este mensaje Enviado: 18/Abril/2017 a las 17:32
¿Y si posteas todo el código que has creado?


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

Access Aplicaciones
Tecsys.es
Arriba
JLMM Ver desplegable
Habitual
Habitual


Unido: 06/Julio/2015
Localización: Herrera
Estado: Sin conexión
Puntos: 70
Enlace directo a este mensaje Enviado: 19/Abril/2017 a las 14:16
ahí va Sr Miura:

Function HayDuplicados() As Boolean
Dim strCriterio As String

' Para empezar los 3 campos deben estar rellenos

If Me!OpInt = "" Or Me!OpExt = "" Or Not IsDate(Me!FechaParte) Then
HayDuplicados = False
Exit Function
End If

' Los 3 campos rellenos

' Creamos criterio

strCriterio = "tblOp = '" & Me!OpInt & "' And OpExt = '" & Me!OpExt & "' AND FechaParte = #" & Format(Me!FechaParte, "dd/mm/yyyy") & "#"
HayDuplicados = (DCount("*", "tblOp", strstring) > 0)
End Function



Private Sub OpExt_LostFocus()

If HayDuplicados Then
MsgBox "Parte Duplicada.", vbExclamation, "AVISO"
DoCmd.RunCommand acCmdUndo
Cancel = True


End If


End Sub

Bien he solucionado, no se si de forma rocambolesca, adjuntado "DoCmd.RunCommand acCmdUndo" después del msgbox.


Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11668
Enlace directo a este mensaje Enviado: 19/Abril/2017 a las 14:44
Mira lo que te ponía Xavi:

Cita
En el BeforeUpdate de cada uno de los controles lanzas la función:

If HayDuplicados Then
  MsgBox "Combinación duplicada.", vbExclamation, "AVISO"
  Cancel = True
End If
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
JLMM Ver desplegable
Habitual
Habitual


Unido: 06/Julio/2015
Localización: Herrera
Estado: Sin conexión
Puntos: 70
Enlace directo a este mensaje Enviado: 19/Abril/2017 a las 16:45
Que lío, colocado en BeforeUpdate, pero ahora al introducir un registro, totalmente diferente me indica por msgbox que es duplicado y después mensaje de Access que no hay ningún registro activo.

Es decir siempre me dice que es un registro duplicado. he borrado todos los registros de la tabla y he empezado desde cero, por si algún registro me estaba dando el valor duplicado.

Algún consejo? Gracias por vuestra paciencia
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11668
Enlace directo a este mensaje Enviado: 19/Abril/2017 a las 16:54
Pon un punto de interrupción al código y síguelo paso a paso, hasta que descubras dónde y por qué te da el mensaje.


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

Access Aplicaciones
Tecsys.es
Arriba
JLMM Ver desplegable
Habitual
Habitual


Unido: 06/Julio/2015
Localización: Herrera
Estado: Sin conexión
Puntos: 70
Enlace directo a este mensaje Enviado: 27/Abril/2017 a las 15:03
Bueno, después de colocarles puntos de interrupción el problema llega al BeforeUpdate.

He probado todo, cancel=false.
Como los campos eran cuadro combinado, he tomado el valor numérico del cuadro combinado y nada

Estoy perdido¡
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: En la dehesa
Estado: Sin conexión
Puntos: 11668
Enlace directo a este mensaje Enviado: 27/Abril/2017 a las 15:18
No he entendido nada de los pasos que da, el código que usas, los valores que toman las variables ....


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

Access Aplicaciones
Tecsys.es
Arriba
JLMM Ver desplegable
Habitual
Habitual


Unido: 06/Julio/2015
Localización: Herrera
Estado: Sin conexión
Puntos: 70
Enlace directo a este mensaje Enviado: 28/Abril/2017 a las 14:59
Espero poder explicarme, he colocado punto de interrupción en el código (con F9) y todo va bien hasta que llego a colocarlo en beforeupdate. Sigo igual, perdido.
Pensé, los campos los toma el formulario de un combobox y en la tabla queda registrado su número (por estar relacionado el campo). Así que modifico la función llamando a los campos numéricos de la tabla y no del valor del combobox.^
Nada sigo igual...

Siento ser tan pesado y no se si me explico bien. Os agradezco vuestra paciencia
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable