Crear campo numérico que reinicie al cambiar de año
Tengo que hacer una base de datos de correspondencia que tenga un campo contador (pero no autonumérico) que se reinicie al cambiar el año.
Por favor, explícame muy detalladamente cada paso que soy principiante en el VBA y con las indicaciones que he encontrado en internet no he sido capaz de sacarlo sola.
Por favor, explícame muy detalladamente cada paso que soy principiante en el VBA y con las indicaciones que he encontrado en internet no he sido capaz de sacarlo sola.
1 Respuesta
Respuesta de María Celia Ibarra
1
1
María Celia Ibarra, Calculista Científica (Universidad Nacional de La Plata)
Contá con mi ayuda con todo gusto. Te cuento que es más fácil ayudarte y llegar rápido a una solución cuando se explica bien el problema. Me ha sucedido que después de 5 o 6 cambios de mensajes recién he podido comprender el problema.
Ahora tu consulta.
Hay muchas formas de hacerlo. Lo primero que se me ocurre es guardar el año en una tabla. Yo suelo usar una tabla Parámetros (ya que sos nueva, te recomiendo que no uses acentos, ni eñes en nombre de tablas y campos) donde guardo información de ese tipo.
Entonces, la segunda cosa sería hacer una macro que se ejecute cada vez que se abre la base y que compare la fecha actual (la del sistema en que está corriendo) con el dato guardado en Parámetros, si el año ha cambiado entonces reiniciará el contador.
Fíjate si hasta acá estoy entendiendo bien. Si es así sería bueno que me explicaras prolijamente lo que hace la aplicación con que estás trabajando. Una cosa que se me ocurrió es si reiniciar el contador no generará conflictos de duplicación.
En caso de que esta solución te convenga yo te escribiría la función que debería ejecutar la macro para realizar el chequeo de año y en el caso de que haya cambiado realice el cambio.
Ahora tu consulta.
Hay muchas formas de hacerlo. Lo primero que se me ocurre es guardar el año en una tabla. Yo suelo usar una tabla Parámetros (ya que sos nueva, te recomiendo que no uses acentos, ni eñes en nombre de tablas y campos) donde guardo información de ese tipo.
Entonces, la segunda cosa sería hacer una macro que se ejecute cada vez que se abre la base y que compare la fecha actual (la del sistema en que está corriendo) con el dato guardado en Parámetros, si el año ha cambiado entonces reiniciará el contador.
Fíjate si hasta acá estoy entendiendo bien. Si es así sería bueno que me explicaras prolijamente lo que hace la aplicación con que estás trabajando. Una cosa que se me ocurrió es si reiniciar el contador no generará conflictos de duplicación.
En caso de que esta solución te convenga yo te escribiría la función que debería ejecutar la macro para realizar el chequeo de año y en el caso de que haya cambiado realice el cambio.
Te cuento más concretamente:
Tengo una base de datos que tiene los siguientes campos:
Código (que es el campo contador, se puede duplicar años distintos)
Fecha de envío
Fecha de respuesta
Remitente
Asunto
Destinatario
La finalidad que quiero conseguir es que el campo CÓDIGO se genere automáticamente al hacer un nuevo registro y que reinicie la cuenta de cartas recibidas al comenzar un nuevo año. Es decir, si en 2007 llevo 45 cartas el CÓDIGO sería 0045. Si la primera carta recibida en 2008 es el 12 de enero de 2008 su CÓDIGO sería 0001 (aunque hubiera habido dicho código en la primera carta recibida en 2007).
Me he explicado o lo he liado demasiado.
Muchas gracias por ser tan rápida y por tu dedicación a mi inexperiencia.
Un saludo,
María
Tengo una base de datos que tiene los siguientes campos:
Código (que es el campo contador, se puede duplicar años distintos)
Fecha de envío
Fecha de respuesta
Remitente
Asunto
Destinatario
La finalidad que quiero conseguir es que el campo CÓDIGO se genere automáticamente al hacer un nuevo registro y que reinicie la cuenta de cartas recibidas al comenzar un nuevo año. Es decir, si en 2007 llevo 45 cartas el CÓDIGO sería 0045. Si la primera carta recibida en 2008 es el 12 de enero de 2008 su CÓDIGO sería 0001 (aunque hubiera habido dicho código en la primera carta recibida en 2007).
Me he explicado o lo he liado demasiado.
Muchas gracias por ser tan rápida y por tu dedicación a mi inexperiencia.
Un saludo,
María
Muy clara tu explicación, María.
No se cuanto se ha desarrollado el sistema.
¿Hay un formulario donde das de alta una nueva carta? Si es así yo agregaría a ese formulario el siguiente código.
Private Sub Form_BeforeInsert(Cancel As Integer)
Dim UltimaCuenta As Long
UltimaCuenta = DMax("Cuenta", "Cartas")
Cuenta = UltimaCuenta + 1
SendKeys "{F9}"
End Sub
Yo lo probé y funciona perfecto. Supuse que la tabla se llama "Cartas"
Con esto solamente se incrementa el contador al agregar un nuevo registro.
Para probarlo tenés que escribir algo en alguno de los datos del nuevo registro. Apenas comiences a hacerlo te colocará el número.
Se me está ocurriendo una forma sencilla de solucionar todo.
Necesito que me digas si esta prueba funcionó.
No se cuanto se ha desarrollado el sistema.
¿Hay un formulario donde das de alta una nueva carta? Si es así yo agregaría a ese formulario el siguiente código.
Private Sub Form_BeforeInsert(Cancel As Integer)
Dim UltimaCuenta As Long
UltimaCuenta = DMax("Cuenta", "Cartas")
Cuenta = UltimaCuenta + 1
SendKeys "{F9}"
End Sub
Yo lo probé y funciona perfecto. Supuse que la tabla se llama "Cartas"
Con esto solamente se incrementa el contador al agregar un nuevo registro.
Para probarlo tenés que escribir algo en alguno de los datos del nuevo registro. Apenas comiences a hacerlo te colocará el número.
Se me está ocurriendo una forma sencilla de solucionar todo.
Necesito que me digas si esta prueba funcionó.
Buenas tardes, Marciana:
La prueba ha funcionado a la perfección.
Muchísimas gracias. Ya sólo falta reiniciar al cambiar de año.
Agradeciéndote tu esfuerzo, te envío un saludo,
María.
La prueba ha funcionado a la perfección.
Muchísimas gracias. Ya sólo falta reiniciar al cambiar de año.
Agradeciéndote tu esfuerzo, te envío un saludo,
María.
Esto resuelve, pero hay un problema que me apareció después. Para resolver todo bien hay que hacer lo siguiente:
1) Crear una tabla Parámetros que tenga un solo campo "Anio" de tipo Long
2) A la tabla Cartas agregar un campo Anio de tipo long que tenga valor predeterminado
=year(Date())
3)Agregar en el formulario cartas el siguiente código:
Public Function VerificaAnio()
Dim rst As New ADODB.Recordset
Dim AnioActual As Integer
Dim UltimaCuenta As Long
Rst. Open "Parametros", CurrentProject. Connection, adOpenDynamic, adLockOptimistic
rst. MoveFirst
AnioActual = Year(Date)
If rst("Anio") = AnioActual Then
UltimaCuenta = Nz(DMax("Cuenta", "Cartas", "Anio = " & AnioActual), 0)
VerificaAnio = UltimaCuenta + 1
Else
rst("Anio") = AnioActual
rst.Update
VerificaAnio = 1
End If
rst.Close
End Function
Private Sub Form_BeforeInsert(Cancel As Integer)
Cuenta = VerificaAnio()
SendKeys "{F9}"
End Sub
Contame como te fue.
1) Crear una tabla Parámetros que tenga un solo campo "Anio" de tipo Long
2) A la tabla Cartas agregar un campo Anio de tipo long que tenga valor predeterminado
=year(Date())
3)Agregar en el formulario cartas el siguiente código:
Public Function VerificaAnio()
Dim rst As New ADODB.Recordset
Dim AnioActual As Integer
Dim UltimaCuenta As Long
Rst. Open "Parametros", CurrentProject. Connection, adOpenDynamic, adLockOptimistic
rst. MoveFirst
AnioActual = Year(Date)
If rst("Anio") = AnioActual Then
UltimaCuenta = Nz(DMax("Cuenta", "Cartas", "Anio = " & AnioActual), 0)
VerificaAnio = UltimaCuenta + 1
Else
rst("Anio") = AnioActual
rst.Update
VerificaAnio = 1
End If
rst.Close
End Function
Private Sub Form_BeforeInsert(Cancel As Integer)
Cuenta = VerificaAnio()
SendKeys "{F9}"
End Sub
Contame como te fue.
Marciana, disculpa que te moleste de nuevo con el mismo asunto, pero es que me marca en amarillo Private Sub Form_Before Insert y en azul Cuenta indicando "no se ha definido la variable".
No sé qué es lo que he hecho más.
Me puedes orientar, por favor.
Muchas gracias por tu ayuda y paciencia.
Un saludo,
María
No sé qué es lo que he hecho más.
Me puedes orientar, por favor.
Muchas gracias por tu ayuda y paciencia.
Un saludo,
María
Te sugiero lo siguiente:
1) Verificar que la tabla "Carta" tenga un campo que se llama "Cuenta", y un campo "Anio". Si los nombres no coinciden deberás hacer los cambios correspondientes.
2)Creá un formulario nuevo de tipo columna con la tabla Carta
3) Poné el formulario del paso 2 en modo diseño y en la ventana código de ese formulario pegá el último código que te envié.
4) Verificá que tenés la tabla "Parametros" con el campo "Anio" y que tiene como dato 2007.
Yo tengo hecha una base con esta solución y funciona bien.
Una vez que funcione esta parte tengo alguna sugerencia que hacerte para hacer pruebas y mejorar el funcionamiento.
1) Verificar que la tabla "Carta" tenga un campo que se llama "Cuenta", y un campo "Anio". Si los nombres no coinciden deberás hacer los cambios correspondientes.
2)Creá un formulario nuevo de tipo columna con la tabla Carta
3) Poné el formulario del paso 2 en modo diseño y en la ventana código de ese formulario pegá el último código que te envié.
4) Verificá que tenés la tabla "Parametros" con el campo "Anio" y que tiene como dato 2007.
Yo tengo hecha una base con esta solución y funciona bien.
Una vez que funcione esta parte tengo alguna sugerencia que hacerte para hacer pruebas y mejorar el funcionamiento.
Buenos días, Marciana,
Ha funcionado a la perfección. El problema es que, al inicio del código me
salía predeterminado "option Explcit" y no funcionaba, pero funciona
perfecto. Muchísimas gracias por tu ayuda. Espero tus noticias para las
mejoras que me has comentado.
Gracias de nuevo. Un saludo,
María D.
Ha funcionado a la perfección. El problema es que, al inicio del código me
salía predeterminado "option Explcit" y no funcionaba, pero funciona
perfecto. Muchísimas gracias por tu ayuda. Espero tus noticias para las
mejoras que me has comentado.
Gracias de nuevo. Un saludo,
María D.
Me alegro mucho que todo funcione bien. La Opción "Option Explicit" es muy importante, se activa desde Herramientas/Opciones y su activación te obliga a declarar todas las variables. Esto contribuye a mejorar la calidad del código y a evitar errores.
En el formulario donde actualizás Cartas te sugiero que el control "Cuenta" abras sus propiedades (hay un botón Propiedades en la barra de herramientas, tenés que tener seleccionado el control) En la ficha "Otras" (lo digo de memoria, me puedo equivocar) elige la opción "Punto de tabulación" en No. esto hace que cuando se activa el formulario el cursor no se posiciones en el control Cuenta porque este se debe actualizar automáticamente. Es más en la ficha "Datos" (otra vez de memoria) también en Propiedades, elegí la opción "Bloqueado" en Sí. Esto hace que el usuario no la modifique inadvertidamente.
Ha sido muy agradable dialogar contigo. Marciana
En el formulario donde actualizás Cartas te sugiero que el control "Cuenta" abras sus propiedades (hay un botón Propiedades en la barra de herramientas, tenés que tener seleccionado el control) En la ficha "Otras" (lo digo de memoria, me puedo equivocar) elige la opción "Punto de tabulación" en No. esto hace que cuando se activa el formulario el cursor no se posiciones en el control Cuenta porque este se debe actualizar automáticamente. Es más en la ficha "Datos" (otra vez de memoria) también en Propiedades, elegí la opción "Bloqueado" en Sí. Esto hace que el usuario no la modifique inadvertidamente.
Ha sido muy agradable dialogar contigo. Marciana
- Compartir respuesta
- Anónimo
ahora mismo