Control acceso de personas mediante Access

Después de mucho leer y aprender gracias vosotros, esta es mi primera pregunta.

En su momento hice una base de datos de socios (evento deportivo) con su correspondiente código de barras con la intención de poder controlar el acceso de los mismos al recinto. Como es lógico un socio = un acceso. Los datos se introducen mediante el típico lector de códigos.

He pensado en crear un formulario con el correspondiente campo para introducir el codigo mediante la citada pistola. Podría incluir la opción "evitar" duplicados, pero esto me mostraría el típico mensaje y ralentizaría la lectura de códigos. Por ello había pensado en almacenar el código escaneado en una variable y compararlo con todos los códigos introducidos hasta el momento:

- Si NO EXISTE: Almacenar la información de la vaiable en un nuevo registro, mostrando la pantalla en verde para inmediatamente después permitir la introducción de un nuevo código.

- Si EXISTE: No grabar ningun tipo de información, mostrar la pantalla en rojo, y permitir la introducción de un nuevo código.

El problema, desconozco el código a utilizar de VBA para realizar dicha comparación.

1 respuesta

Respuesta
2

No sé si es lo más óptimo, pero una posibilidad es contar cuantos registros hay en tu tabla con ese código. Algo así:

'recogemos el valor del código en la variable codigo, en este caso la rescato de un control del formulario que se llama codigoo
codigo = Me.codigoo.Value
'contamos cuantos registros hay en la tabla CODIGOS en los que el valor del campo ACCESO es igual al valor de la variable
cuantos = DCount("*", "[CODIGOS]", "[ACCESO]= " & codigo & "")
If cuantos = 0 Then
    'si no hay ningún registro coincidente insertamos en la tabla
    SSQL = "INSERT INTO [CODIGOS] (ACCESO) select " & codigo & ""
    DoCmd.RunSQL SSQL
    'y coloreamos el control de verde
    Me.codigoo.BackColor = RGB(0, 255, 0)
Else
    'caso contrario coloreamos de rojo
    Me.codigoo.BackColor = RGB(255, 0, 0)
End If

Quizás haya cogido mal el código o no sea compatible con lo hecho hasta ahora. Como siempre me suelo complicar un poco pidiendo que hagas mas cosas a la vez, y sigo sin hacerlo funcionar.

Amplio información por si es de interés:

- Tabla: T_ACCESOS ---> Campos: ID_ACCESO (Autonum), CODIGO_BARRAS, FECHA.

- Formulario: F_ACCESOS ---> Cuadros de Texto: ESCANEOS -- Campos: CODIGO_BARRAS y FECHA (Automática).

El código de barras es del tipo: *1020170125* (12 caracteres, incluidos asteríscos). Aunque no lo comento, extraigo del mismo distintos fragmentos para posteriores cálculos y estadística.

Como ya menciono en el mensaje original, la intención es escanear mediante pistola de códigos el código de barras, quedando guardado en la variable (STRING) de nombre VAR_CODIGO. Antes de poder volcar los datos sobre la tabla y generar un nuevo registro, quiero comprobar si ese código ha sido escaneado previamente.

El formulario F_ACCESOS tiene como origen de los datos la tabla T_ACCESOS, y tras cada escaneo, carga un nuevo registro automáticamente para agilizar la tarea.

Como digo, en este apartado estoy un poco perdido, es lo que tiene aprender sobre la marcha y con diferentes manuales y ejemplos. Muchas gracias de nuevo.

He vuelto a adaptar el código a mis necesidades, probando con tabla y formulario simple, y el error que me da ahora es de sintaxis (falta operador). Imagino que es porque mi código es del tipo texto.

Fallo mío, supuse que el código de barras era numérico. En VBA cuando utilizamos funciones como DCOUNT, DSUM, DLOOKUP, etc o cuando montamos sentencias SQL, dependiendo del tipo de datos del campo al que nos referimos debemos escribir las variables de una forma u otra:

Para campos numéricos enteros así: " & variable & "

Para campos numéricos con decimales así: '" & variable & "'

Para campos texto así: """ & variable & """

Para campos de fechas así: # " & variable & " #

Entonces, entiendo que recoges el valor del código de barras en el cuadro de texto ESCANEOS del formulario, ¿correcto? Si es así el código sería así:

'recogemos el valor del código en la variable codigo
codigo = Me.ESCANEOS.Value
'contamos cuantos registros hay en la tabla T_ACCESOS en los que el valor del campo CODIGO_BARRAS es igual al valor de la variable
cuantos = DCount("*", "[T_ACCESOS]", "[CODIGO_BARRAS]= """ & codigo & """")
If cuantos = 0 Then
    'si no hay ningún registro coincidente insertamos en la tabla
    SSQL = "INSERT INTO [T_ACCESOS] (CODIGO_BARRAS) select """ & codigo & """"
    DoCmd.RunSQL SSQL
    'y coloreamos el control de verde
    Me.ESCANEOS.BackColor = RGB(0, 255, 0)
Else
    'caso contrario coloreamos de rojo
    Me.ESCANEOS.BackColor = RGB(255, 0, 0)
End If

Si siempre que insertas en la tabla quieres que la fecha sea la de hoy, te recomiendo poner como valor predeterminado en el campo FECHA de la tabla esto: fecha()

De este modo siempre que insertes en la tabla, en el campo fecha te pondrá la fecha de hoy y el código de arriba te funcionará perfectamente. Si quieres poder modificar la fecha, entonces deberás recoger el valor de la fecha del formulario en una variable:

lafecha=me.FECHA.value

Y modificar la instrucción insert:

SSQL = "INSERT INTO [T_ACCESOS] (CODIGO_BARRAS,FECHA) select """ & codigo & """, # " & lafecha & " #"

Espero que con esto lo puedas resolver. Caso contrario lo dices y seguimos.

Muchas gracias de nuevo, estoy aprendiendo mucho gracias a este problema, pero sigo sin hacerlo funcionar correctamente. Si funciona la comprobación, pero me sigue dando error.

En vez de usar la función SSQL, había pensado en hacer primero la comprobación, y posteriormente guardar los valores a cada campo, pero de ninguna manera me funciona.

He subido a MEGA la base, sin añadir el código de comprobación de duplicado, aunque no funciona correctamente la opción de que me permita añadir otro código sin tener que pulsar intro u otra tecla, es decir: Tras introducir el código con la pistola, que me permita leer uno nuevo tras hacer las pertinentes comprobaciones. Como tras cada lectura carga un nuevo registro, no puedo comprobar que se grabó en el anterior. Una opcion sería mostrar un listado con las últimas 10 lecturas, aunque de nuevo se me escapa. Como digo, no acabo de solucionar un problema y me complico la vida.

En el RAR que he subido a MEGA incluyo un listado de códigos de ejemplo para probar.

https://mega.nz/#!9cJxyB4Q

Gracias por toda la ayuda que me estás brindado. A ver si acabo esto y retomo los cursos y tutoriales porque sobre la marcha es imposible.

¿Entonces ahora el dcount te funciona pero te salta error en el insert? Algo hemos avanzado al menos... Para acceder a la BBDD me pide una clave de cifrado.

Desconozco el proceso por el que vuelcas los datos desde la pistola de escaneo a access, pero si el valor del código de barras finalmente lo vuelcas al cuadro de texto ESCANEOS del formulario, para que funcione como indicas puedes probar de poner el código en el evento "Al cambiar" de ese cuadro de texto, de este modo no tendrás que apretar un botón o lo que sea para que se ejecute el código, sino que se ejecutará cada vez que cambie el valor del cuadro de texto.

Pásame la clave de mega y lo miro, si quieres por correo electrónico a [email protected] 

Bueno, actualizo primero para dar las gracias Víctor por que sin su ayuda no lo habría conseguido. Siguiendo sus pasos al fin he conseguido lo que quería, y a la vez he aprendido mucho sobre VBA.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas