Simular un campo autonumérico
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)
Pregunta Sé cómo imprimir un informe mediante código y sé cómo hacer para que aparezca el cuadro de diálogo imprimir,…
Cómo conseguir en un informe calcular sólo el total para cada página