Existen varias formas de crear un campo autonumérico en Acess, una de las formas más sencillas es aplicar la función Dmax, veamos como…
Crear campo autonumérico en Access utilizando la función DMax
Aunque Access posee un campo autonumérico por defecto no es conveniente utilizarlo ya que no podemos controlarlo y si borras un registro se quedará el hueco ya que no se puede editar, en la mayoría de los casos en mucho mejor crear el nuestro para así poder controlarlo, vamos a ver como crear un campo autonumérico con la función DMax que incremente en una unidad cada vez que creamos un registro nuevo.
La función DMax no se puede utilizar directamente en la tabla, hay que usarla en un formulario, veamos como funciona ésta interesante función de Access.
La función Dmax lo que hace es averiguar el valor más alto de un campo numérico:DMax("Campo","Tabla")
lo que hacemos es pasarle a la función los parámetros del campo autonumérico y de la tabla que contiene dicho campo, es decir:
Campo: nombre del campo autonumérico en cuestión.
Tabla: Nombre de la tabla que contiene el campo.

Para que no nos de error cuando no hay ningún registro en la tabla aplicaremos la función NZ de ésta manera:Nz(DMax("Campo","Tabla"),0)
con ésto hacemos que si no hay ningún registro creado en la tabla nos de un cero, pero de momento solo conseguimos averiguar el valor máximo del campo y lo que pretendemos es que se vaya incrementando por lo que nuestro código quedaría así:Nz(DMax("Campo","Tabla"),0) +1
Veamos como aplicarlo en un formulario, para ello usaremos el evento Current del form (al activar registro), el código quedaría así:
Como se ve hemos aplicado una condición: Si es un nuevo registro entonces aplicamos la función.
Me.Control es el nombre del control de texto en el formulario que enlaza con el campo numérico de la tabla.
Este código lo pegáis directamente en el VB del formulario.
Descarga
Debido a que muchos usuarios han manifestado en los comentarios problemas para implementar el código y además no sabían como hacer para que no se crearan nuevos registros al pulsar el botón de «Ir al registro siguiente», he creado un ejemplo sencillo para que se vea, en el siguiente enlace lo puedes descargar, está en Access 2003.
>> Descargar ejemplo autonumérico con Dmax
Necesito Crear un Campo autonumérico
Hola , amigos , necesito crear un campo autonumérico , que comience con EIA12 y EIM25 ¿Es posible?
Gracias
Debes calcular primero el
Debes calcular primero el número y luego lo concatenas con las letras.
correlativo
buen dia si me correlative es asi Res0000 como deberia ser mi programacion
Amigo,
Pásame tu correo y te
Amigo,
Pásame tu correo y te mando la base de datos para que me ilustres con tu sapeinsa.
Sí se puede, y de varias
Sí se puede, y de varias formas distintas, pero la forma más optima depende de como lo tengas planteado.
Porque si tu creas un formulario (de una tabla)con un subformulario relacionado por un determinado campo (de otra tabla), a través de los indices puedes hacerlo automáticamente.
Y otra forma puede ser cargando datos con recordset de ambas tablas.
O creando una tabla de numeradores… en fin.. las posibilidades son muchas y habría que aplicar la que mejor se adapta a tus necesidades. Es difícil si ver tu base de datos.
Gracias por contestar tan
Gracias por contestar tan rápido!
Lo que veo en este código en una sola tabla en donde el num. de factura = consecutivo+serie de factura+año? Pero no veo la interacción con otra tabla o algo así como una condición… la cosa es que yo no pondré nada en el formulario de inicio, quiero que por ejemplo:
id1,tbl1 => id,tbl2
1 1
1 2
1 3
2 1
2 2
3 1
3 2
3 3
3 4
…
Ambos deben estar en tablas distintas pero que el segundo «vea» el primer autonumérico y si cambia el primero, el segundo reinicie su contador en 1 y así sucesivamente.
Se puede esto?
Autonumérico que dependa de otro autonumérico.
Amigo!
Ya me funciona bien el autonumérico con el siguiente código:
Private Sub Form_Current()
If Me.NewRecord Then
Me.[Id_trabajo].DefaultValue = Nz(DMax(«id_trabajo», «tbl_trabajos»), 0) + 1
End If
End Sub
Funciona bien, se detiene (no genera mas números).
Puse 2 códigos de tal forma que uno liga al otro pero es ascendente infinito.
Ahora quiero generar un autonumérico que cambie si cambie el primero.
Es decir: ID de la tabl2, cambie a 1, si ID de la tbl1 cambia.
He intentado varias formas pero no le doy!
Me podrías ayudar? Gracias.
Este es un ejemplo para que
Este es un ejemplo para que el contador se reinicie por Año y serie:;
AUTONUMERICO BASADO EN LA SERIE Y EL AÑO QUE SE PONGA EN EL FORMULARIO
Private Sub Form_BeforeUpdate(Cancel As Integer)
Me.txtnumFactura = Nz(DMax(«NumFactura», «tblFacturas», «SerFactura = ‘» & Me.cboSerFactura & «‘And añoFactura =» & Me.AñoFactura), 0) + 1
End Sub
Excelente amigo!!!! Muchas
Excelente amigo!!!! Muchas gracias por tu apoyo..!!!! funciona a la perfección!!! Gracias, gracias!!!
Pon éste código en el botón
Pon éste código en el botón de Ir al siguiente registro:
Private Sub RegistroSiguiente_Click()
On Error GoTo Err_RegistroSiguiente_Click
If Me.Numero = DMax(«Numero», «Tabla1») Then
MsgBox «Este es el último registro»
Else
DoCmd.GoToRecord , , acNext
End If
Exit_RegistroSiguiente_Click:
Exit Sub
Err_RegistroSiguiente_Click:
MsgBox Err.Description
Resume Exit_RegistroSiguiente_Click
End Sub
Función Dmax
Sí amigo. Mil disculpas. Ya lo verifiqué y sí lo hace así. Pero fíjate que no logro detenerlo al darle siguiente y siguiente. No uso macros, uso los controles del propio formulario. Le puse un requerido a otro campo y lo detiene, pero no sé cómo controlar el mensaje de error que manda access para personalizar el error. Gracias por contestar tan rápido.
Campo autonumérico.
Hola amigo!
Fíjate que use este código, funciona bien, pero el problema es que si elimino el último registro o si simplemente no lo uso, sigue contando desde el último que creó y no el consecutivo que tiene la «tabla» en el «campo» requerido. Es decir, si me quedé en el 15 y selecciono uno nuevo, sigue el 16. Pero si no lo deseo o lo borro. en el nuevo registro no sigue el 16, continúa con el 17 y así. Se comporta igual que el autonumérico de access. Me puedes ayudar?
La función Dmax busca el
La función Dmax busca el número máximo en la tabla, lo que te puede pasar es que no borras realmente el número en la tabla, revisalo bien.
el mismo error
por favor tengo el mismo error que tu, me sigue generando registros al llegar al ultimo. como hiciste para solucionarlo
Ok, mea culpa, todo
Ok, mea culpa, todo arreglado, tuve un fallo al transcribir el código.
El mismo código? Que versión
El mismo código? Que versión de access? En que parte del código? Muy pocos datos!
¿Por qué me da el error de
¿Por qué me da el error de compilación «No se encontró el método o el dato miembro»?
Solucionado
Ya lo solucioné! Puse una condición que desabilita los botones de navegación cuando llega a los extremos.
Gracias por los aportes.
Saludos
Es porque creaste más los
Es porque creaste más los botones de navegar. Es decir cuando estas en el ultimo y le das a siguiente no debería avanzar (que es cuando crea un nuevo). Deberías tener primer,anterior,siguiente,ultimo donde tendrías que tener un condicional preguntando si estas en el primer registro (en caso de los dos primeros botones) o si estas en el ultimo (el caso de los dos siguientes) y no hacer nada (No llamar a la macro o mover el recorset), luego si quieres introducir un nuevo registro deberás crear otro botón.
Posible solución
Es porque creaste mal los botones de navegar o por lo menos es lo que yo haría. Es decir cuando estas en el ultimo y le das a siguiente no debería avanzar (que es cuando crea un nuevo). Deberías tener primer,anterior,siguiente,ultimo donde tendrías que tener un condicional preguntando si estas en el primer registro (en caso de los dos primeros botones) o si estas en el ultimo (el caso de los dos siguientes) y no hacer nada (No llamar a la macro o mover el recorset), luego si quieres introducir un nuevo registro deberás crear otro botón. Pensar que este autonumerico solo sirve si queréis tener los números sequencialmente consecutivos (sin saltarse ninguno) para otros menesteres usar un integer autonumerico (si no pasa nada si hay saltos numerales).
como lo freno
Hola, utilicé este código en una base de datos que estoy desarrollando y tengo el siguiente problema.
Cuando voy navegando a través de los registros con los botones de navegación y llego al último y vuelvo a clickear en el botón «siguente registro» automáticamente me sigue creando nuevos registros. En el formulario eliminé los botones de navegación para colocar unos personalizados, entonces no tengo el contador de registros, por lo cual no se cual es el último registro y navegando entre los registros buscando alguno en particular siempre termino creando un registro nuevo cuando no lo necesito.
Quisiera que cuando voy navegando con los botones y llego al último registro se detenga y solo me cree un nuevo registro con el botón «nuevo registro».
No se si fui claro, cualquier cosa me explayo un poco más.
Muchas gracias!
Slds,
Gabriel
Valor requerido
Una posible solución sería poner un campo «requerido» en la tabla, aparte del campo autonumerico, de esa manera no te dejaría crear un nuevo registro si ese campo está vacio. Te saltará un mensaje de access indicando el error, luego podrías capturar ese mensaje y poner uno personalizado.
Tienes razón aquí dejo el
Tienes razón aquí dejo el código de muestra:
Private Sub btTest_Click()
Dim max As Currency
max = Nz(DMax(«[campoNumerico]», «tabla», «[CampoTexto] = ‘» & Me![cuadroTexto] & «‘»), 0)
max = max + 1
End Sub
Nota: se podría hacer como función para que devuelva el valor 🙂
Esto lo tendré que poner en el después de insertar verdad? O no seria correcto? En el antes de actualizar parece peligroso no?
reinicio autonumerico cada año
ayuda… tengo 2 campos IdFolio que genere un autonumerico con este codigo que esta funcionando bien:
Private Sub Form_BeforeInsert(Cancel As Integer)
If Me.NewRecord Then
Me.txtFolio = Nz(DMax(«IdFolio», «Facturas»)) + 1
End If
End Sub
Private Sub Form_BeforeUpdate(Cancel As Integer)
If Me.NewRecord Then
Me.IdFolio = Nz(DMax(«IdFolio», «Facturas»)) + 1
End If
End Sub
Private Sub Form_Current()
If Not Me.NewRecord Then
Me.txtFolio = Me.IdFolio
Else
Me.txtFolio = «(Auto)»
End If
End Sub
y el otro campo es FolioAño cambia cada año a=2010, B=2011 tambien funciona bien
lo que necesito es reiniciar en 1 cada año el IDfolio
te agradezco si me puedes ayudar
Imaginemos que debemos crear
Imaginemos que debemos crear un campo autonumerico pero anualmente. Es decir tenemos un campo que marca el AÑO y NUM (La clave primaria es otra) se puede hacer por un campo filtrado por el año?
GRACIAS
Autonumericos por años
Si se puede, tan solo hay que añadir una condición más que seria el campo AÑO.
Campo autonumérico
Hola amigos, deseo saber si el truco para crear nuestro propio campo auotnumérico sirve para un formulario que contiene un subformualrio porque yo traté de utilizarlo en un caso de estos y cuando intenté pasar del formulario a subformulario me salió un mensaje que dice: «La clave principal no puede tener un valor null» y eso es cierto; Se podría pensar que debo trasladar a otro campo la clave principal, pero en ese caso se perdería la relación entre el formulario principal y el subformulario.
Espero su respuesta. Gracias
Relaciones
Como clave principal tienes que poner al campo autonumerico que has creado y olvidarte del campo autonumerico que te crea access.