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

Simular un campo autonumérico

19 de marzo de 2024 ACCESS, El rincón de Happy, Formularios

Pregunta

¿Se puede simular una campo autonumérico en un formulario?

Respuesta

Este pequeño truco es una ampliación a lo que aparece en el tema Campo contador y sólo será válido en un formulario en vista “Formulario simple” (es decir, ni formulario continuo, ni en vista hoja de datos).

Pongamos un ejemplo, simulando un proceso común. Tenemos, por un lado:

Tabla:
– Nombre: Facturas
Campo:
– Nombre: IdFactura.
– Tipo: Entero largo

Por otro lado, tenemos un formulario:

Formulario:
– Origen del registro: tabla Facturas
Cuadro de texto:
– Nombre: IdFactura.
– Origen del control: IdFactura.
– Visible: Falso
Cuadro de texto:
– Nombre: txtIdFactura.
– Origen del control: ninguno.

El cuadro de texto txtIdFactura nos servirá para “simular” nuestro autonumérico. A partir de aquí, vamos a jugar con algunos eventos del formulario. En el módulo de código del formulario pondremos el siguiente código:

Codigo

' al pasar de registro a registro, si vemos que estamos en un nuevo 
' registro, escribimos en nuestro "autonumérico" la palabra (Auto).
' Si es un registro existente, entonces mostramos el valor de IdFactura' IdFactura 
Private Sub Form_Current()
    If Not Me.NewRecord Then
        Me.txtIdFactura = Me.IdFactura
    Else
        Me.txtIdFactura = "(Auto)"
    End If
End Sub

Con eso hemos conseguido que el campo que utilizamos para mostrar el contador de facturas, o como queráis llamarlo, parezca visualmente un autonumérico. Ahora utilizaremos el evento Antes de insertar (BeforeInsert) del formulario para hacer que tome un valor, cuando estemos en un nuevo registro. De esta manera conseguimos el mismo efecto que hace un verdadero campo autonumérico, el cual muestra la palabra (Autonumérico) hasta el momento en que empezamos a introducir datos en el registro.

Tenemos este otro código:

' en el momento en que se empiece a introducir datos en un nuevo registro
' saltará este evento, cargando el valor máximo del campo IdFactura + 1
' en el campo txtIdFactura, es decir el siguiente número correlativo.
Private Sub Form_BeforeInsert(Cancel As Integer)
    If Me.NewRecord Then
        Me.txtIdFactura = Nz(DMax("IdFactura", "Facturas")) + 1
    End If
End Sub

Por último, utilizaremos el evento Antes de actualizar (BeforeUpdate) para realmente introducir el siguiente número correlativo en el campo IdFactura de la tabla Facturas. Esto lo haremos en este evento, el cual es el último que se produce justo antes de que el registro sea actualizado definitivamente en la tabla, para minimizar el riesgo de duplicar este valor en la tabla, en el caso de que otro usuario estuviera añadiendo un registro en ese mismo momento. Fijaros que actualizamos IdFactura volviendo a consultar el máximo valor del campo en la tabla + 1, en vez de simplemente copiar el valor existente en txtIdFactura. Así siempre podríamos asegurarnos de que vamos a actualizar con el valor adecuado.

También podríamos comparar el valor que se va a introducir en la tabla con el existente en txtIdFactura y, si no es el mismo, informar al usuario de que ya existe una factura con el número que aparece en el formulario, pues otro usuario ya adjudicó ese valor anteriormente (puede darse el caso de que este usuario abriera el formulario para agregar una factura, se le “adjudicara” un número a esta posible nueva factura, y en medio de este proceso decidiera que es un buen momento para tomar un “cafelito”, dejando a medias la inserción de esta nueva factura. Cuando volviera de tomarse su “cafelito”, es posible que otro compañero hubiera estado introduciendo también nuevas facturas, con lo cual el valor que el usuario del “cafelito” ve en pantalla ha quedado obsoleto y ya está ocupado).

En fin, como decíamos ayer… por último tendríamos este código en el evento Antes de actualizar (BeforeUpdate):

' aquí simplemente se le da un número correlativo al campo IdFactura,
' pero podría ser conveniente cotejar este valor con el que aparece
' en el control txtIdFactura, y en caso de ser diferentes, enviar
' un mensaje informativo al usuario.
Private Sub Form_BeforeUpdate(Cancel As Integer)
    If Me.NewRecord Then
       Me.IdFactura = Nz(DMax("IdFactura", "Facturas")) + 1
    End If
End Sub

Con esto estaríamos simulando un autonumérico y minimizando el riesgo de duplicidad de datos (aunque el tema de la concurrencia puede llegar a complicarse mucho más, y desde luego, esta es sólo una solución simple al riesgo de duplicidad de datos, no es ni mucho menos, una solución definitiva).

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 – Simular un campo autonumérico (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