Está en la página 1de 3

Formularios : Simular un campo autonumrico

Autor/es: Juan M Afn de Ribera

Este pequeo truco es una ampliacin a lo que aparece en el tema Campo contador y slo ser vlido en un formulario en vista "Formulario simple" (es decir, ni formulario continuo, ni en vista hoja de datos). Pongamos un ejemplo, simulando un proceso comn. 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 autonumrico. A partir de aqu, vamos a jugar con algunos eventos del formulario. En el mdulo de cdigo del formulario pondremos el siguiente cdigo:
' al pasar de registro a registro, si vemos que estamos en un nuevo ' registro, escribimos en nuestro "autonumrico" 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 queris llamarlo, parezca visualmente un autonumrico. 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 autonumrico , el cual muestra la palabra (Autonumrico) hasta el momento en que empezamos a introducir datos en el registro. Tenemos este otro cdigo:
' en el momento en que se empiece a introducir datos en un nuevo registro ' saltar este evento, cargando el valor mximo del campo IdFactura + 1 ' en el campo txtIdFactura, es decir el siguiente nmero 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 nmero 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 d e 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 aadiendo un registro en ese mismo momento. Fijaros que actualizamos IdFactura volviendo a consultar el mximo valor del campo en la tabla + 1, en vez de simplemente copiar el valor existente en txtIdFactura. As siempre podramos asegurarnos de que vamos a actualizar con el valor adecuado. Tambin podramos comparar el valor que se va a intro ducir 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 nmero 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 nmero 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 insercin de esta nueva factura. Cuand o volviera de tomarse su "cafelito", es posible que otro compaero hubiera estado introduciendo tambin 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 decamos ayer por ltimo tendramos este cdigo en el evento Antes de actualizar (BeforeUpdate):
' aqu simplemente se le da un nmero correlativo al campo IdFactura, ' pero podra 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 estaramos simulando un autonumrico y minimizando el riesgo de duplicidad de datos (aunque el tema de la concurrencia puede llegar a complicarse mucho ms, y desde luego, esta es slo una solucin simple al riesgo de duplicidad de datos, no es ni mucho menos, una solucin defini tiva).
Ejemplos:

Temas relacionados: Campo contador fCounter (campo contador)

También podría gustarte