¿Campo autonumérico sin usar autonumérico?

Necesito un campo que no sea estrictamente autonumérico para numerar muestras en una base de datos de análisis. He visto en esta página una solución que sería que se numerara solo el control desde el formulario al cambiar de registro mediante una consulta de actualización. Digamos que eso permitiría que al llegar la fecha de cambio de año, manualmente se reiniciara la numeración y empezase a contar desde cero, sumándole uno desde la consulta de actualización. He llegado a esto porque he probado muchas soluciones de las que hay en esta página y otras en visual basic y no me funcionan, probablemente por culpa mía.
Ojalá podáis ayudarme.

1 Respuesta

Respuesta
1
En http://www.mvp-access.com/foro buscando por "Falso autonumérico" puedes encontrar varias soluciones al respecto.
Incluso hay una función (creo que de Chea) que permite meterle prefijos y cosas de esas.
Perdona, Xavi,
Las funciones estas se pegan como módulos imagino y le añades un evento a un control que se llama strcampo de una tabla que se llama strtabla, de una base de datos sin nombre definido, para que cargue la función. ¿Es así? Lo he puesto en antes de cargar y en "al entrar", pero la verdad no hace nada. Perdona, pero estoy muy verde en visual basic. Te reproduzco la función:
Public Function AutoNumerico(strTabla As String, strCampo As String) As Integer
Dim dbs As Database, rst As Recordset, strMaximo As String
' creo una cadena con la select para obtener el valor más alto del campo
strMaximo = "SELECT Max(" & strCampo & ") as Mayor FROM    " & strTabla
Set dbs = CurrentDbSet
rst = dbs.OpenRecordset(strMaximo)   ' abro un recordset con esa cadena
If IsNull(rst!Mayor) Then AutoNumerico = 1                        ' si la tabla está vacía
Else
AutoNumerico = rst!Mayor + 1           ' devuelvo el valor incrementado en uno
End If ' cierro el recordset
rst.CloseSet rst = Nothing
Set dbs = Nothing
End Function     ' AutoNumerico
Creas un módulo independiente y pegas esa función. Asegurate de que el módulo no se llame igual que la función (eso da error).
En el formulario, en el evento Current (Al activar registro) pones el siguiente código:
If Me.NewRecord Then
  Me!campoId.DefaultValue = AutoNumerico("laTabla", "elcampoId")
End If
Prueba y comentas.
Xavi
Hecho. Me dice que "Error de compilación: No se ha definido el tipo por el usuario" y subraya en el código "dbs as database". El modulo lo he creado en "opción compare database"
Marca la referencia Microsoft DAO 3.6 Object Library y cambia esta linea:
Dim dbs As DAO.Database, rst As DAO.Recordset...
Por cierto, supongo que es un error de transcripción, pero lo que apqrece como:
Set dbs = CurrentDbSet
rst = dbs.OpenRecordset(strMaximo)   ' abro un recordset con esa cadena
debe ser:
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset(strMaximo)   ' abro un recordset con esa cadena
Me sigue saliendo lo mismo,
Option Compare Database
Public Function AutoNumerico(strTabla As String, strcampo As String) As Integer
Dim dbs As DAO.Database, rst As DAO.Recordset, strMaximo As String
' Dim dbs As Database, rst As Recordset, strMaximo As String
' creo una cadena con la select para obtener el valor más alto del campo
strMaximo = "SELECT Max(" & strcampo & ") as Mayor FROM    " & strTabla
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset(strMaximo)   ' abro un recordset con esa cadena
If IsNull(rst!Mayor) Then AutoNumerico = 1                        ' si la tabla está vacía
Else
AutoNumerico = rst!Mayor + 1           ' devuelvo el valor incrementado en uno
End If ' cierro el recordset
rst.CloseSet rst = Nothing
Set dbs = Nothing
End Function     ' AutoNumerico
¿Has marcado la referencia?
En caso afirmativo, comprueba que está por encima de Microsoft ActiveX Data Objects x.x Library
Perdona, no se donde se marca la referencia, me temo
Abres el editor de VBA, menú Herramientas, Referencias y ahí marcas la que te he dicho.
He avanzado hasta este punto. No sé si estará mal escrito, pero me dice que no puede encontrar la tabla o consulta de entrada de la tabla... y me señala:
Set rst = dbs.OpenRecordset(strMaximo)
En cualquier caso, te agradezco enormemente el esfuerzo
Para hacer las cosas fáciles...
Nombre de la tabla dónde insertaras el registro: ____________
Nombre del campo dónde simularas el autonumerico: _____________
¿Cómo llamas a la función desde el formulario? (Copia el código exacto)
Xavi
Nombre de la tabla dónde insertaras el registro: strtabla
Nombre del campo dónde simularas el autonumérico: strtabla
Private Sub Form_Current()
If Me.NewRecord Then
  Me!strcampo.DefaultValue = AutoNumerico("strtabla", "strcampo")
End If
End Sub
No había cambiado en tu código el nombre de los campos. Ahora funciona, pero a partir de 10, el autonumérico se para y sigue dando 10 de modo constante.
Te estoy dando trabajo exageradamente. Ahora que funciona ya la función, supongo que será cuestión de revisarla entera.
Muchas gracias, solo tenía el campo en texto en lugar de en número. Gracias por tu comprensión y dedicación. Extremadamente amable.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas