Cómo formar un código en base de datos Access
Quiero formar un código que aclaro no será el campo clave, que contenga el siguiente formato:
año actual + Especialidad + Consecutivo dentro de la Especialidad.
Las personas tienen un Año de inscripción (actual) además en un campo que se llama Especialidad que es un combobox se puede clasificar como que es especialista en:
Medicina Interna - MI
Ortopedia - OR
Oftalmología - OF
El Consecutivo dentro de la especialidad sería el número que se le asigna como tal, si es la SEGUNDA persona que se ingresa al sistema como especialista de Oftalmología en el presente año tendría el siguiente código:
2016 OF 2
Lo más complicado creo que es el tema del consecutivo..
1 respuesta
En la web de Neckkito tienes ejemplo de como crear consecutivos alfanuméricos, y si mal no recuerdo, en la de Angeles Sebas, también.
Un saludo.
Un nuevo foro de access, visítanos: http://nksvaccessolutions.com/Foro/
Descargué el ejemplo que está muy bueno y bien explicado, pero no concuerda exactamente con lo que deseo, quizás con algunas modificaciones como que la serie no empiece por "A".. sino en dependencia de la especialidad seleccionada para el registro, ... porque el autonumérico que necesito no es tan continuo como este, ya que puedo ingresar el segundo especialista en oftalmológica del 2016 (2016 OF 2) y apto seguido ingresar el quinto especialista de medicina interna del 2016.. (2016 MI 5)... espero haberme explicado bien.. gracias..
El funcionamiento es el mismo, en el código, en vez de "A","B", has de hacer referencia a tu cuadro combinado, para que coja el valor que tiene.
Y para seguir el autonumérico, has de buscar los últimos números del año y especialidad.
Estoy intentando eso.. pero entre comillas no me deja hacer la referencia puse ME.Espelialidad y como seguro lo toma por una cadena no hace nada, si le quito las comillas me da un error que no es un valor para una constante....
Lo puse todo ahí.. también para ponerle el año de la fecha actual lo puse donde creo debía ir.. pero me da error...
___________________________________
'Declaramos las variables
'Con la constante miSerie indicaríamos qué letras hay que añadir antes del
'número. Yo he situado la serie en "Axxxx", pero si quisiéramos "PPxxx" simplemente
'escribiríamos <Const miSerie As String = "PP">
Const miSerie As String = Me.Especialidad
Dim miAN As String, ultimoAN As String
Dim ultimoANNum As Long
'Comprobamos si hay valor en [Autonum]. Si lo hay es que estamos recorriendo
'los registros, por lo que no necesitamos calcular nada. En este caso salimos
If Not IsNull(Me.Autonum.Value) Then Exit Sub
'Comprobamos cuál es el último [Autonum] introducido a través de DLast()
ultimoAN = Nz(DLast("Autonum", "TDatos"), "")
'Si no hay registros obtendríamos una cadena vacía (""). En este caso tendríamos
'que empezar por el primero
If ultimoAN = "" Then
'Escribimos directamente el primer valor. Lo escribiremos en función del
'tamaño de campo que hayamos establecido
Me.Autonum.Value = Año(Fecha()) & miSerie & "0001"
Exit Sub
End If
'Si ha devuelto un valor vamos a coger su parte numérica. Como hemos definido el tamaño
'del campo en 5 debemos coger los últimos 4 caracteres. Si hubiéramos definido el tamaño
'del campo en 8, por ejemplo, deberíamos coger los últimos 7, así:
'<ultimoANNum = CLng(Right(ultimoAN, 7))>
'Convertimos al mismo tiempo ese valor en un entero largo
ultimoANNum = CLng(Right(ultimoAN, 4))
'Le añadimos una unidad
ultimoANNum = ultimoANNum + 1
'Si el valor superara 9999 avisamos y reiniciamos el contador. Lógicamente, si hubiéramos
'fijado un tamaño de campo de 7, por ejemplo, el valor a comprobar sería 999999
If ultimoANNum > 9999 Then
MsgBox "Se ha llegado al límite del contador. Este se reiniciará", vbInformation, "AVISO"
ultimoANNum = 1
End If
'Reconstruimos el alfanumérico teniendo en cuenta que debemos añadir los ceros anteriores
'al número. Eso lo hacemos con la adición de cuatro ceros (la parte numérica) y la
'función right()
miAN = miSerie & Right("0000" & ultimoANNum, 4)
'Si hubiéramos fijado el tamaño del campo en 7, por ejemplo, debemos:
'***Quitar una unidad para respetar la serie, por lo que nos quedan 6
'***En lugar de escribir 4 ceros escribiríamos 6 ceros, y cogeríamos los 6
' últimos caracteres de la derecha, así:
'<miSerie & Right("000000" & ultimoANNum, 6)
'Escribimos el valor en el campo del formulario
Me.Autonum.Value = miAN
MiSerie no es una constante, sino una variable, por eso te da error. Hazlo así:
Dim miSerie as string
miSerie = Me.Especialidad
Va saliendo, toma bien el valor del campo Me. Especialidad, lo que poner detrás 0001 para todo el mundo... no hace autonomerico y no se donde poner el año.. o como ponerlo mejor dicho.. gracias..
En esta línea:
ultimoAN = Nz(DLast("Autonum", "TDatos"), "")
Te falta indicarle los criterios para que te filtre por año y especialidad. Mira la ayuda de la función DLast()
Bdias.. he hecho y deshecho y no logro aún el resultado deseado, dígame si puedo enviarle el fichero a algún correo para que me lo revise a ver que puede estar faltando o sobrado.. saludos..
Dim ultimoAN as String
Dim ultimoANNum As Long
If Not IsNull(Me.Autonum.Value) Then Exit Sub
ultimoAN = Nz(DMax("Autonum", "TDatos","Año=" & Year(Date) & " AND Especialidad='" & Me.Especialidad & "'"), "")
If ultimoAN = "" Then
Me.Autonum= Año(Fecha()) & Me.Especialidad & Format(1,"0000")
Exit Sub
End If
ultimoANNum = CLng(Right(ultimoAN, 4))
ultimoANNum = ultimoANNum + 1
Me.Autonum= Año(Date) & Me.Especialidad & Format(ultimoANNum ,"0000")
Así te debería funcionar. Tendrás que revisar y adaptar los nombres de tus campos
Hola, hoy no he podido dedicar todo el tiempo que quisiera a este tema y es lo que me va faltando...
Me da un error aquí:
ultimoAN = Nz(DMax("Autonum", "Colaboradores", "Año=" & Year(Date) & " AND Especialidad='" & Me.Programa & "'"), "")
Cambié bien las cosas... pero nada.. lo otro es que dejándolo así:
ultimoAN = Nz(DMax("Autonum", "Colaboradores") , "")
Corre pero no hace el autonumético....
Saludos..
Dariel, el código lo acabo de probar y funciona perfectamente (solo había un pequeño fallo, hay que cambiar Año() por Year())
http://www.filebig.net/files/3ad25HQJy2
No dices qué error te da, por lo que no te puedo decir cómo solucionarlo, pero como te digo (y adjunto en el ejemplo) funciona perfectamente.
Muy bien!, tenía varios errores, estaba asignando el código al formulario, además de que no tenía el año como un campo si no que lo tomaba directamente del código... voy a probarlo y te cuento.. solo queda un detalle por lo que veo y es que si por error selecciono una especialidad incorrecta y pone el alfanumerico, al seleccionar otra no lo cambia hay que borrarlo, pero creo puedo resolverlo con limpiando el campo siempre antes... saludos
Siempre puedes hacer eso, lo de borrar el campo, o elimina la linea que comprueba si el campo tiene valor, de esa forma, siempre que actualices el combo, te actualizará el autonumérico. Pero ¡Ojo!, si ya tienes un número (por ej, el 10) y modificas un registro anterior (por ej el 3), el autonumérico te devolverá el siguiente (11)
- Compartir respuesta