Access & VBA FAQ
| | | |
Indice de temas
Tablas
Consultas
Formularios
Informes
Macros
Módulos
Base de datos
Miscelánea
API
Utilidades
Problemas
Cadenas
Fechas
Todos los temas
Formularios : Simular un campo autonumérico
Autor/es:
Juan M Afán de Ribera
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:
' 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).

Ejemplos:

 

Temas relacionados:

Campo contador

fCounter (campo contador)

 

Última actualización: 9/1/2005