Access - Evitar duplicados de Registro

 
Vista:
sin imagen de perfil

Evitar duplicados de Registro

Publicado por Alvaro (2 intervenciones) el 08/01/2018 00:54:04
Buenas noches, os detallo mi problema:

Estoy creando una Base de Datos en Access 2016 de Facturas recibidas, en ella la integra dos tablas principales Proveedores y Facturas Proveedores. En la tabla Factura Proveedores tengo varios campos (Fecha_Recepción, Num_Factura, Proveedor (busca los datos en la tabla del mismo nombre) e importe.

He creado un formulario donde voy metiendo los datos de las facturas y quiero crear un evento (con vuestra ayuda) en el campo Num_Factura que antes de actualizar busque si existe otra factura con el mismo número de factura y que sea del mismo Proveedor. (El orden de inserción de datos es Fecha_Recepción, Proveedor, Num_Factura, etc.) En caso de coincida me saltara un MsgBox advirtiendo que la factura ya esta registrada y devolviendo el SetFocus a Num_Factura.

Os dejo hasta donde he llegado:

1
2
3
4
5
6
7
Private Sub Num_Factura_BeforeUpdate (Cancel As Integer)
 
If DCount([Num_Factura], "Factura_Proveedores", "Num_Factura='"&  Num_Factura &"'")>0 Then
         MsgBox "La Factura "& [Num_Factura] &" ya existe", vbExclamtion
End If
 
End Sub


Gracias de antemano
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Evitar duplicados de Registro

Publicado por Anonimo (3316 intervenciones) el 08/01/2018 09:17:49
Según se desprende de lo expuesto, los datos que diferencian a las facturas son tres:
.- el numero (se deduce que es alfanumérico)
.- la fecha (la ideal seria la de emisión, la de recepción es inconsistente, si acaso un dato a añadir como información)
.- el proveedor


En su localización deberían intervenir los tres datos y seria algo similar a:

DCount("*", "Factura_Proveedores", "Num_Factura='"& Me.Num_Factura &"' AND Proveedor ='" & ?????? & "' AND FECHA_XXX = " & CDbl (CDate (" & aquí la fecha & ")))

Notas:
.- Un asterisco define al registro (lo que se cuenta: los registros que cumplen las condiciones)
.- Me.Num_Factura ==> referencia al cuadro de texto del formulario
.- ?????? ==> la referencia al proveedor
.- FECHA_XXX ==> debería ser la de emisión (concreta) y no la de recepción (inconclusa/abstracta) para la que se puede utilizar la fecha de introducción del registro (DATE) como dato anecdótico o de control interno.

.- Con AND aunamos los tres condicionales
.- al proveedor se le considera un dato alfanumérico (si es un ID numérico se eliminan las comillas simples)
.- a la fecha (en principio un texto libre con formato de fecha) se le trata para convertirlo primero a fecha Access (CDATE) y a numero (CDBL) con lo que se evitan los problemas con los formatos regionales.


La secuencia quedaría así:
1
2
3
4
5
6
7
8
9
10
Private Sub Num_Factura_BeforeUpdate (Cancel As Integer)
 
If DCount ........... > 0 Then
         MsgBox "La Factura "& [Num_Factura] &" ya existe", vbExclamtion
         Cancel = TRUE ' aborta el proceso activando el parámetro CANCEL que por defecto es FALSE
         Me.UNDO ' elimina los datos introducidos, es como ir a un nuevo registro sin desplazarse
        Me.Nun_Factura.SetFocus ' enviamos el foco a un campo concreto (el numero de factura)
End If
 
End Sub


A mayores un INDICE en la tabla, evitaría que se pudiera introducir un registro que no cumpla las condiciones
Utilizar como fecha la de recepción, puede dar lugar a introducir mas de una vez la misma factura (jugando con el orden o memoria del usuario)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Evitar duplicados de Registro

Publicado por Alvaro (2 intervenciones) el 08/01/2018 17:03:12
Gracias por la información, al trasladar y cuadrar el código me da un error.

Cuadro-error

Codigo

Relacion
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Evitar duplicados de Registro

Publicado por Anonimo (3316 intervenciones) el 09/01/2018 01:21:51
Al tratar la fecha en la condición se puede hacer de dos formas, una es integrando la función en la condición la otra es darle simplemente el dato resultante (o bien una o bien otra) .... yo he aplicado ambas y ello no es lo correcto.

Suponiendo que el dato se toma de un cuadro de texto, la referencia al cuadro de texto es suficiente (no necesita las comillas), aplicare el método de darle un numero (esto es: aplicare las dos funciones sin integrarlas en la condición)

DCount("*", "Factura_Proveedores", "Num_Factura='"& Me.Num_Factura &"' AND Provee ='" & Me.Provee & "' AND FECHA_XXX = " & CDbl (CDate ( Me.FFactura )))

Se puede verificar el correcto funcionamiento de la doble función asi (en un evento en el que exista una fecha en el campo)

MsgBox CDbl (CDate ( Me.FFactura ))

Debería devolver un numero, una fecha (la actual en la que respondo, el 09/01/2018 ) devolvería el numero 43109

Conviene prestar atención al tipo de dato de Provee en la tabla, normalmente los IDs suelen ser numéricos (y si así fuera: sobrarían las comillas simples)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar