Juanjo Luna

MVP Microsoft 365 Apps & Services 2023

LinkedIn Learning Instructor

Presidente de Access User Groups España

CEO Luna-Soft

Desarrollador

Consultor Informático

Juanjo Luna

MVP Microsoft 365 Apps & Services 2023

LinkedIn Learning Instructor

Presidente de Access User Groups España

CEO Luna-Soft

Desarrollador

Consultor Informático

Blog Post

Campo contador sin usar autonumérico

6 de febrero de 2024 ACCESS, El rincón de Happy, Tablas

Pregunta

¿Qué código tengo que utilizar para conseguir que un campo numérico se convierta en un campo contador? No quiero utilizar un campo autonumérico, pues tengo entendido que no es lo más adecuado para tener un campo contador

Respuesta

Una manera para que un campo numérico se convierta en campo contador sería utilizar la función de agregado DMax, la cual devuelve el valor máximo del campo de una tabla.

Pongamos un supuesto. Tenemos:

– Una tabla llamada “Facturas”
– Un campo llamado “Contador” en la tabla “Facturas”
– Un formulario basado en la tabla “Facturas”, y un cuadro de texto cuya propiedad Origen del control es el campo “Contador”

Para hacer que este cuadro de texto vaya numerando consecutivamente todos los nuevos registros, asociaríamos el siguiente código al evento Antes de insertar (BeforeInsert) o al evento Antes de actualizar (BeforeUpdate) del formulario:

If Me.NewRecord Then
    Me.Contador = Nz(DMax("Contador", "Facturas")) + 1
End If

La función Nz se usa para cuando la tabla no tenga registros. En ese caso, la función Dmax devolvería un valor nulo y por tanto también obtendriamos un valor nulo, pues Nulo + 1 = Nulo.

Pregunta

Hablas de la posibilidad de utilizar ese código en dos eventos diferentes. ¿Me podrías aclarar la diferencia de hacerlo en uno o en otro?

Respuesta

Si quieres simular el efecto que produce un autonumérico, el cual genera el siguiente número en el mismo momento en que empiezas a introducir información en el registro, entonces debes utilizar ese código en el evento Antes de insertar (BeforeInsert).

Sin embargo, si tu aplicación puede ser utilizada por varios usuarios al mismo tiempo, se podría dar la circunstancia de que dos o más personas agregaran un nuevo registro a esa tabla al mismo tiempo. Si estás utilizando el evento Antes de insertar (BeforeInsert) entonces nos encontraríamos con un problema de concurrencia y duplicidad de datos (que deberían ser únicos). Para prevenir y minimizar este riesgo podemos en cambio, utilizar el evento Antes de actualizar (BeforeUpdate) el cual se producirá en el último momento, cuando el usuario decida guardar el registro (o cambie de registro, que provocará también que se guarde el registro).

NOTA

Antes, en este tema, se recomendaba utilizar el código arriba expuesto desde el evento Al activar registro (Current), pero hacerlo así tiene la particularidad de que en el caso de querer eliminar el nuevo registro en el momento en que este se genera, es decir, sin salir de él, el código no funciona correctamente y genera un número consecutivo sobre el que se acaba de eliminar.

Por ejemplo, supongamos que entramos en un nuevo registro y se genera, digamos, el número 10. Sin salir del registro, nos lo pensamos mejor y lo borramos. Entonces debería generarse de nuevo el número 10… pues no, si ese código se ejecuta desde el evento Al activar registro (Current), genera el número 11. Si este registro también lo eliminamos, el código generará el número 12, y así sucesivamente. Si, por el contrario, el código lo ejecutamos desde cualquiera de los eventos Antes de insertar (BeforeInsert) o Antes de actualizar (BeforeUpdate), entonces sí, el código siempre generará los números que estábamos esperando (es decir, números correlativos).

Créditos

con el fin de dar a conocer el trabajo de uno de los más grandes en el mundo de Access en español, y tras solicitar su permiso, replico este artículo de Juan M Afán de Ribera. Todos los derechos y autoría corresponden a él. Access & VBA FAQ – Campo contador (archive.org)

Taggs:
Related Posts
Opciones de impresión a través de código

Pregunta Sé cómo imprimir un informe mediante código y sé cómo hacer para que aparezca el cuadro de diálogo imprimir,…

Totales por página

Cómo conseguir en un informe calcular sólo el total para cada página

Write a comment