Cuadro de texto como autonumérico con año
Tengo un campo texto (NumExpte) y quiero que incremente su valor numérico de uno en uno, con el formato; 001/2013, 002/2013 y así sucesivamente; y que al cambiar el año el registro se ponga a cero y salga el año en vigor, de esta forma; 001/2014, 002/2014 y que los registro se actualicen en caso de eliminar alguno.
He probado poniendo código a un botón de comando (nuevo) pero no lo he podido conseguir.
¿Podrías decirme como debo codificar este botón?
1 Respuesta
en la página: http://angelessebas.es/
En el apartado supuestos y soluciones ---> código ---> Crear un correlativo, empezando por 1 cada año
Tienes un ejemplo que te puede ayudar.
Me cuentas.
Hola,
exactamente tengo una tabla con diferentes campos y uno de ellos (NumExpte) texto, quiero que en el formulario con un botón de comando (nuevo) este campo, el cual esta bloqueado, al añadir un registro nuevo en dicho campo aparezca como 001/2013 y así sucesivamente.
Espero haberme explicado bien.
Muchas gracias
¿Has mirado el código que te dije...?
Como verás ese código es para actualizar una tabla, si tú quieres que sea el valor de un cuadro de texto, tendrás que cambiar:
Rs2. Edit
rs2!Correlativo =
rs2.Update
Por:
form!NombreDelCuadroDeTexto.Value=
He adaptado tu código a mi formulario y no he conseguido que funcione.
No se si me explicado bien en lo que necesito.
Tengo una tabla con diversos campos tipo texto, numero, fecha. De esta tabla he creado un formulario con todos estos campos.
He insertado varios botones de comando (nuevo, guardar, imprimir, buscar, salir). Y necesito que al entrar a este formulario desde uno principal, el campo numexpte se muestre en blanco y tras rellenar un nuevo registro y guardarlo, en dicho campo, me aparezca el nº de registro con el que se guarda en la tabla y el año en curso, en este formato (001/2013). El campo Numexpte lo tengo bloqueado para que cuando guarde o añada un nuevo registro (botón nuevo) automáticamente me aparezca en numero que corresponde a este registro con el año. También, que si elimino alguno, este se actualice para mostrar los registros reales que tiene la tabla.
Se que es muy difícil hacerlo, y te agradezco la ayuda que me has prestado.
Un saludo.
El código sería:
' Declaramos las variables que necesitamos:
Dim db As Database Dim rs1 As Recordset Dim rs2 As Recordset Dim rs3 As Recordset Dim baño As String Dim vCorrelativo As Integer
' Activamos la BD:
Set db = CurrentDb
' Vemos el último correlativo (será el de la última fecha con correlativo)
Set rs1 = db.OpenRecordset("Select Max(FechaInicio) as MáximaFecha from CrearCorrelativo where Correlativo is not null")
' Si no devuelve registros, quiere decir que no hay ningún correlativo creado, crearemos el 1º:
If IsNull(rs1!MáximaFecha) Then
Set rs2 = db.OpenRecordset("Select FechaInicio, Correlativo from CrearCorrelativo order by oFechaInicio")
form!Numexpte.value = "001/" & Trim(Str(Year(rs2!FechaInicio)))
End If
' Ya estamos seguros de que hay por lo menos 1 correlativo creado, haremos los siguientes:
' Vemos la última fecha que tiene correlativo:
Set rs1 = db.OpenRecordset("Select Max(FechaInicio) as MáximaFecha from CrearCorrelativo where Correlativo is not null")
' Buscamos en la tabla el correlativo último perteneciente a esa fecha:
Set rs3 = db.OpenRecordset("Select Max(Correlativo) as MáximoCorrelativo from CrearCorrelativo where FechaInicio=cdate('" & rs1!MáximaFecha & "')")
' Igualamos las variables al valor que tienen en este campo el año y el correlativo:
vaño = Right(rs3!MáximoCorrelativo, 4) vCorrelativo = Val(Left(rs3!MáximoCorrelativo, 3))
' Creamos el recordset con los registros a los que falta el correlativo ordenados por el campo FechaInicio:
Set rs2 = db.OpenRecordset("Select FechaInicio, Correlativo from CrearCorrelativo where Correlativo is null order by FechaInicio")
' Recorremos el recordset con Do While, si el año coincide el correlativo aumenta en 1, si el año cambia el correlativo empieza otra vez por 1:
Do While Not rs2.EOF
If baño = Trim(Str(Year(rs2!FechaInicio))) Then
vCorrelativo = vCorrelativo + 1
form!Numexpte.value = String(3 - Len(Trim(Str(vCorrelativo))), "0") & Trim(Str(vCorrelativo)) & "/" & vaño
Else
vCorrelativo = 1 baño = Trim(Str(Year(rs2!FechaInicio)))
form!Numexpte.value = String(3 - Len(Trim(Str(vCorrelativo))), "0") & Trim(Str(vCorrelativo)) & "/" & baño
End If
rs2.MoveNext
Loop
Es decir, en vez de actualizar el campo de la tabla, das el valor al cuadro de texto del formulario.
Me cuentas.
Hola,
Perdona mi ignorancia, pero en el código pones año y correlativo, entiendo que estos son dos campos de la tabla, distintos del campo Numexpte que también existe en la tabla y donde deben guardarse ambos datos: 001/2013 o es el campo que mi tabla debo sustituir por numexpte.
Un saludo
Una cosa, las variables donde la debo declarar al entrar al formulario, al cargarlo, o en el botón de comando (nuevo)
Gracias por todo
Hola,
Este es código que puesto y consigue hacer parte de lo quiero, aunque necesito ayuda para el formato 001/2013.
Private Sub NUMEXPTE_Change()
Dim vNum As Variant
vNum = Me.[NUMEXPTE].Value
'Si el campo no está en blanco sale del proceso
If Not IsNull(vNum) Or vNum <> "" Then Exit Sub
'Buscamos el valor máximo de la tabla de origen
Dim vMax As Variant
vMax = Nz(DMax("[NUMEXPTE]", "ENTRADA"))
'Si el valor máximo es cero por Nz porque no haya registros
'le asigna el valor uno. Si no añade una unidad al número
'más alto
If vMax = 0 Then
vMax = 1
Else
vMax = vMax + 1
End If
'Asignamos el nuevo valor al número
Me.[NUMEXPTE].Value = vMax
End Sub
Para crear el 001/2013:
String(3 - Len(Trim(Str(vMax))), "0") & Trim(Str(vMax)) & "/" & Trim(Str(Year(Date())))
Esto es para el año de la fecha del día (Date())
Te quedaría:
Me.[NUMEXPTE].Value =String(3 - Len(Trim(Str(vMax))), "0") & Trim(Str(vMax)) & "/" & Trim(Str(Year(Date())))
Si tienes alguna duda sobre alguna función, en la página, apartado Funciones, tienes ejemplos de ellas.
Hola,
Así me ha quedado el código, pero no me sale el año, sale solamente el numero de registro seguido de / , es decir : 4/ y no 004/2013.
Private Sub NUMEXPTE_Change()
Dim vNum As Variant
vNum = Me.[NUMEXPTE].Value
'Si el campo no está en blanco sale del proceso
If Not IsNull(vNum) Or vNum <> "" Then Exit Sub
'Buscamos el valor máximo de la tabla de origen
Dim vMax As Variant
vMax = Nz(DMax("[NUMEXPTE]", "ENTRADA"))
'Si el valor máximo es cero por Nz porque no haya registros
'le asigna el valor uno. Si no añade una unidad al número
'más alto
If vMax = 0 Then
vMax = 1
Else
vMax = vMax + 1
End If
'Asignamos el nuevo valor al número
Me.[NUMEXPTE].Value = vMax
Me.[NUMEXPTE].Value = String(3 - Len(Trim(Str(vMax))), "0") & Trim(Str(vMax)) & "/" & Trim(Str(Year(Date)))
Otra cosa, al salir del formulario le he añadido este código para que no me añada ningún registro, pero al insertarle el código que me has proporcionado al Numexpte Change() el formulario me da error al entrar en el código vMax=vMax + 1
Private Sub Form_Current()
Dim vNum As Variant
vNum = Me.[NUMEXPTE].Value
If Not IsNull(vNum) Or vNum <> "" Then Exit Sub
Dim vMax As Variant
vMax = Nz(DMax("[NUMEXPTE]", "ENTRADA"))
If vMax = 0 Then
vMax = 1
Else
vMax = vMax + 1
End If
'Asignamos el nuevo valor al número
Me.[NUMEXPTE].Value = vMax
End Sub
Espero que puedas ayudarme, y disculpa por las molestias causadas por mi torpeza.
Un saludo.
Esto te sobra: Me.[NUMEXPTE].Value = vMax
¿Para qué vas a darle un valor si luego le vas a dar otro...?
En cuanto al año... no se, prueba a poner (para ver que devuelve):
MsgBox Trim(Str(Year(Date)))
Me.[NUMEXPTE].Value = String(3 - Len(Trim(Str(vMax))), "0") & Trim(Str(vMax)) & "/" & Trim(Str(Year(Date)))
Me cuentas.
Hola,
Perdona por la tardanza. He quitado lo que sobraba y he añadido lo que me has sugerido.
Ahora simplemente me sale el nº de expediente y nada mas, sin la barra.
Ya no se que hacer.
Saludos
Pues... no sé, si quieres mándame la BD (en access 2003, es el único que tengo) para echarle un vistazo.
Hola,
Te envié por c.e. la base de datos. Espero que la hayas recibido, si no es así por favor dímelo para volver a enviártela.
Un saludo
Ahora mismo te iba a contestar. La recibí pero no la puedo abrir ya que está en formato accdb y yo tengo el access 2003 (.mdb)
Pásala a este formato y me la envías.
Hola,
He creado una consulta MaxExpteAño y en la columna NUMEXPTE he puesto lo siguiente:
SELECT Max(Right([NUMEXPTE],1)) AS Numeral,
Format([FECHA],"yyyy") AS Año
FROM DROGA
GROUP BY Format([FECHA],"yyyy");
Luego en el formulario he agregado el siguiente código, que me funciona pero solamente a partir de que haya 1 registro, si no hay registro no me funciona.
Private Sub FECHA_AfterUpdate()
Me.NUMEXPTE = Format(Me.FECHA, "yyyy") &
"/" & Format(((DLookup("[Numeral]",
"MaxExpteAño", "[Año]=" & Format(Me.FECHA,
"yyyy") & "")) + 1), "000")
End Sub
Podrías decirme que código puedo utilizar para que si no hay ningún registro me lo me lo inicie con el 2013/001.
Un saludo
Tendrás que ver si el DLookup te devuelve algún valor:
if isnull(dlookup(...........))=true then
darías el valor con el 001
else
el valor siguiente
end if
Hola,
Siento las molestias que te puedo causar, pero es que de código se muy poquito.
Podrías ponerme la instrucción completa con el código que tengo y el que tu indicas.
Te lo agradecería.
Pues yo pongo la instrucción If isnull(dlookup(....))= true then antes de Me,NUMEXPTE= Format(.........., y me dice que esta instrucción no puede ser opcional.
Un saludo.
Hola,
He incluido este código, pero en NUMEXPTE solamente me sale el año y no el número de expediente, es decir: 2013/
Private Sub FECHA_AfterUpdate()
Dim vNum As Variant
vNum = Me.NUMEXPTE.Value
If Not IsNull(vNum) Or vNum <> "" Then Exit Sub
Dim vLookup As Variant
vLookup = Nz(DLookup("NUMEXPTE", "PRODUCTO"))
If vLookup = 0 Then
vLookup = Format(Me.FECHA, "yyyy") & "/" & Format(((DLookup("[Numeral]", "MaxExpteAñoProducto", "[Año]=" & Format(Me.FECHA, "yyyy") & "")) + 1), "000")
End If
Me.NUMEXPTE.Value = vLookup
End Sub
Primero, perdona la tardanza, tengo un problema familiar que no me permite dedicar todo el tiempo que desearía al foro.
Después... veo 2 If ... then y un solo End If
¿Dónde cierras el otro...?
Si escribo End If después de Exit Sub no sale ningún error pero el campo NumExpte del formulario aparece en blanco pasando al campo hora.
Private Sub FECHA_AfterUpdate()
Dim vNum As Variant
vNum = Me.NUMEXPTE.Value
If Not IsNull(vNum) Or vNum <> "" Then
End If
Exit Sub
Dim vLookup As Variant
vLookup = Nz(DLookup("NUMEXPTE", "PRODUCTO"))
If vLookup = 0 Then
vLookup = Format(Me.FECHA, "yyyy") & "/" & Format(((DLookup("[Numeral]", "MaxExpteAño", "[Año]=" & Format(Me.FECHA, "yyyy") & "")) + 1), "000")
End If
Me.NUMEXPTE.Value = vLookup
End Sub
Si coloco End If después de Exit Sub me sale error y al depurar me dice que Dlookup=Vacío
Private Sub FECHA_AfterUpdate()
Dim vNum As Variant
vNum = Me.NUMEXPTE.Value
If Not IsNull(vNum) Or vNum <> "" Then
Exit Sub
End If
Dim vLookup As Variant
vLookup = Nz(DLookup("NUMEXPTE", "PRODUCTO"))
If vLookup = 0 Then
vLookup = Format(Me.FECHA, "yyyy") & "/" & Format(((DLookup("[Numeral]", "MaxExpteAño", "[Año]=" & Format(Me.FECHA, "yyyy") & "")) + 1), "000")
End If
Me.NUMEXPTE.Value = vLookup
End Sub
Por otro lado quisiera saber como asignar IDproducto de manera automática para que el cuadro combinado del Producto al elegir uno aparezca el idproducto en un cuadro de texto y que cambie dependiendo del producto elegido.
Y también quisiera el código de un botón de comando para que el formulario muestre todos los registros que hubiese hasta el momento y verlos en Snapshot y poder imprimir el que se muestra en pantalla y al darle doble click vuelva a mostrarlos en Dynaset.
Te pregunto esto porque cada vez que entro y salgo del formulario en el recorset de abajo del formulario no me aparece el total de los registro, solamente los que voy agregando y así cada vez que abro el formulario.
Espero que puedas ayudarme como hasta ahora.
Un saludo.
Un saludo.
¿No puedes pasar la BD a access 2003 y mandármela...?
Es que no te creas que me entero muy bien de lo que estás haciendo...
Perdona por la tardanza, pero con la Semana Santa......,
He recibido la base, pero he comprobado que si añado un nuevo expediente me sale con el 2012/001, aunque la fecha sea de 2013. Si elimino todos los registros para empezar con la base de datos vacía, en número expediente del formulario me sale el año y la barra pero no el número de expediente: 2013/
Un saludo
El lunes lo miro, estoy de Semana Santa y no tengo el ordenador... Funciono con el IPad y, lógicamente, no tengo access.
Entonces... Hasta el lunes.
He mirado la BD que te mandé y... funciona bien, ¿has hecho algún cambio en ella...?
Hola,
La he probado, pero si añado un nuevo registro me sale así 2013/. Si en la fecha le pongo xx/xx/2012, me sale 2013/. No se si es porque yo trabajo con la versión 2007. Da igual la fecha que ponga siempre me sale 2013/... No lo entiendo. He mirado el código y es igual pero nada de nada.
¿Por qué será?
Un Saludo
No te entendía bien lo que me decías. Esto pasa porque entendí que querías hacerlo sobre la fecha del día, por ello puse en el cuadro de texto txtFecha el valor predeterminado=Fecha(), para que automáticamente coja la fecha del día.
Si lo que quieres es meter tú la fecha, tendrías que quitar el valor predeterminado del cuadro de texto y el código lo tendrías que poner en la acción al perder el enfoque del cuadro de texto txtFecha en vez de ponerlo en la acción al cargar del formulario.
Si lo haces así, te aconsejo que antes de ejecutar el código hagas una comprobación de que la fecha es válida, esto lo harías con la función IsDate()
Hola.
No se si me he explicado bien. Cuando digo que pongo una fecha xx/xx/2013 del cuadro de texto FECHA lo hago del calendario que sale al entrar a dicho cuadro y selecciono la fecha que me interesa del calendario no la pongo yo tal cual.
Por eso te digo que seleccione la fecha que seleccione siempre me sale 2013, y si borro de la tabla PRODUCTOS todos los registros, en el formulario al salir de cuadro de texto FECHA me muestra en NUMEXPTE 2013/, pero no sale el nº de registro que le corresponde.
Si añado uno nuevo, da igual la fecha que seleccione, porque me sale 2012/001.
En cuanto a la función IsDate() ya me pierdo.
Espero haberme explicado
Un saludo.
Tu puedes seleccionar la fecha, escribirla... o lo que quieras, pero el código está basado en el valor del cuadro de texto y calcula el nuevo nº de expediente en base a ese cuadro de texto y además lo calcula "al cargar el formulario" en base a la fecha del día, si lo quieres de otra forma, tendrás que quitar el predeterminado del cuadro de texto y poner que el código se ejecute en otra acción, esta acción será una posterior a elegir la fecha.
Si la fecha la seleccionas en un calendario, no tendrás que utilizar la función IsDate() para comprobar si es válida.
Me cuentas.
Hola.
Si he entendido bien, el cuadro de texto NUMEXPTE refleja el año según lo seleccionado en el cuadro de texto FECHA (cuyo formato es calendario) y en nº que le asigna al expediente lo hace al cargar el formulario. Entonces por que cuando yo selecciono en la fecha un año distinto al actual (2013), el cuadro de texto NUMEXPTE me refleja 2013/ y no me sale el nº de expediente que corresponde según los registro de la tabla.
Creo que Dlookup solamente me devuelve "2013/" pero no el nº de registro
y el problema creo que es por que en la fórmula de Vlookup :
vLookup = Format(Me.FECHA, "yyyy") & "/" & Format(((DLookup("[Numeral]", "MaxExpteAño", "[Año]=" & Format(Me.FECHA, "yyyy") & "")) + 1), "000")
no recoge lo indicado en lo que está en negrita.
Inserte la fecha que inserte siempre me sale :2013/
Un saludo.
En mi código no utilizo el DLookup para nada...
Sinceramente, no se lo que estás haciendo... si la BD que te mandé funciona... ¿por qué cambiarlo...?
Hola,
En la base de datos que me enviaste, utilizas ese comando, en la salida del cuadro de texto fecha:
Private Sub FECHA_AfterUpdate()
Dim vNum As Variant
vNum = Me.NUMEXPTE.Value
If Not IsNull(vNum) Or vNum <> "" Then
End If
Exit Sub
Dim vLookup As Variant
vLookup = Nz(DLookup("NUMEXPTE", "PRODUCTO"))
If vLookup = 0 Then
vLookup = Format(Me.FECHA, "yyyy") & "/" & Format(((DLookup("[Numeral]", "MaxExpteAño", "[Año]=" & Format(Me.FECHA, "yyyy") & "")) + 1), "000")
End If
Me.NUMEXPTE.Value = vLookup
End Sub
Por correo te remito la base
Un saludo
Pero este código está en el formulario expedienteproducto, no en el formulario RegistroNuevo que es el formulario que hice yo.
Hola,
Perdona mi despiste. He mirado el formulario RegistroNuevo, pero la fecha viene determinada por el día actual. Quisiera saber como utilizar ese mismo código pero para que funcione en el formulario Expedienteproducto, donde la fecha la no es el día actual sino la que yo le indique.
Un saludo.
Hola,
He probado el código que me enviaste y lo pegado en el comando guardar. Funciona bien añadiendo nuevos registro dependiendo del año de campo fecha, pero hay un problema y es que si cierro el formulario y vuelvo a entrar añado un nuevo registro me duplica el último que existe en la tabla. He probado a ponerle al compo Numexpte de la tabla (indexado: si (sin duplicados) pero al guardar el registro me sale una información en la cual no se puede guardar porque habría duplicados de registros).
Como podría hacerlo para que al entrar de nuevo en el formulario continuara a partir del siguiente numero que haya guardado en la tabla dependiendo del año.
Un saludo.
Si puedes, es mejor que me mandes la BD (en access 2003) para verlo y hablar sobre ello.
- Compartir respuesta