¿Necesito una función año para un record source?

Tengo un formulario principal para buscar facturas en función de unos requisitos, entre ellos el año de facturas y un subformulario donde este ultimo me muestra las facturas que tengo. Pues bien cuando acaba el año por ejemplo ahora que acabara el 2020, esta facturas las envío a una tabla de históricos llamada TblaHistoricosFacturas y en la tabla de facturas del año actual llamada TblFacturas comienzo un nuevo ciclo para las facturas del año 2021, con lo cual reseteo y empiezo de 0.

Pues la idea que tengo es la siguiente:

Si en la cabecera del formulario tengo puesto el año en el que nos encontramos el subformulario tendrá un record source que tira de una consulta de la tabla de TblFacturas, si por el contrario en vez del año en curso le coloco otro año anterior al actual quiero que el record source tire de otra consulta la tabla de TblHistoricosFacturas.

He colocado este código pero aunque no me da error no me da tampoco los resultados que necesito.

Por otro lado os envío una imagen con el formulario y en amarillo el cuadro combinado que he puesto para filtrar el cual se llama Cuadro_combinado35

De ante mano Gracias

2 respuestas

Respuesta
1

Vamos por partes. Citas un Texto 25, pero donde se elige el Estado es un combinado. Por otro lado, en principio no necesitarías tablas de histórico, ni nada. No dices en que campo de la tabla Facturas se puede saber si está pagada o pendiente, por tanto obvio eso. Si tengo una tabla única Pedidos( sería Facturas) donde puedes ver que hay muchos registros

Si en el combinado ElegirAño selecciono 2019

Si por el contrario selecciono 2018

El código del evento Después de actualizar del combinado ElegirAño es simplemente

Private Sub ElegirAño_AfterUpdate()
Me.Pedidos.Form.RecordSource = "select * from pedidos where year([fechapedido])=" & Me.ElegirAño & ""
End Sub

Y si, supongamos en la tabla Pedidos(Facturas) hubiera un campo Estado donde apareciera lo de Pendiente, Pagada, etc y quieres que en un combinado( por la imagen) donde seleccionas el estado, al que llamaremos elegir estado, podrías poner el código como

Private Sub ElegirAño_AfterUpdate()
Me.Pedidos.Form.RecordSource = "select * from pedidos where year([fechapedido])=" & Me.ElegirAño & " and estado ='" & Me.elegirestado & "'"
End Sub

Hola Julián, gracias por contestar. Mi problema no esta en si están pagadas o pendientes, fijate solo en las primeraslíneas de código y lovidate de el select. Como bien te he comentado, cuando el año acaba, hago un cierre anual de facturas y las paso de la tabla TblCbFacturas a TblHistoricoFacturas y comienzo desde cero con la numeración de las facturas (que por eso las paso a un histórico, a parte de que pesa menos la tabla con un año que con todos) lo de pagada o pendiente es otra historia que ya la tengo resuelta. Mi pregunta es como puedo cambiar el recordsourse del formulario en función del año. De manera que si le dejo puesto el año en curso me tire de una consulta y si le pongo un año anterior me tire de otra. Donde cada consulta tirara de una tabla u otra.

Gracias 

Pues lo que te decía. Supongamos que tengo una tabla Histórico con los registros de años anteriores al actual

Y otra tabla Actual con los registros del año 2020

En el formulario elijo un año en el combinado

me pone los registros del año elegido. Si elijo otro

Y si elijo otro

Me pone los del año en curso

El código es

Private Sub ElegirAño_AfterUpdate()
If ElegirAño = year(Date) Then
Me.Pedidos.Form.RecordSource = "select * from actual"
Else
Me.Pedidos.Form.RecordSource = "select * from historico where year([fechapedido])=" & Me.ElegirAño & ""
End If
End Sub

Hola Julián de nuevo, he estado considerando la opción de no hacer la tabla de históricos, pero el problema que se me presenta es que me gustaría que a primeros de año el numero de factura comenzará de 0, me explicó. Para este año el número de factura empieza por F20-0001 y terminaré por F20-0280, pues bien ahora cuando comience el 2021 quiero que empiece por F21-0001 de nuevo hasta el final de año que llegará al número que sea. El problema que tengo es que poseo un campo índice llamado "id" que es autonumérico, un campo llamado "Numero_documento" que es tipo texto corto (le he puesto texto porque sino no me haría la suma que te detallo más abajo), y su valor es igual al campo "id" ya que lo copia y por último un campo llamado Nombre_documento que es en realidad el numero de factura, o sea F20-0000. Este ultimo lo consigo de esta manera

me. Numero_documento = me.Id

Me.Nombre_documento = Nz(SubFormUltimaFacturaCreada!ÚltimoDeNumero_documento, 0) + 1

Me.Documento_nombre = "F" + Me.Texto24 + "-" + Me.Numero_Documento (Donde Texto24 es un campo que me calcula las dos ultimas cifras del año asi "Me.Texto24.Value = Right(Date, 2)")

Pues bien mi problema esta en que cuando llegue el día 1 de enero si hago una factura me cambiara el F20 por el F21, pero me seguirá con la numeración correlativa a la que llevaba en el 2020 o sea F21-0281 y lo que quiero es que me empiece de 0 F21-0001.

Se que es algo lioso si no conoces bien me bd, pero estoy seguro que si lees atentamente comprenderás el problema. Soy un aficionado a Access y me encanta pero no tengo suficientes conocimientos para realizar esto. Pero me encantan los retos.

Gracias de antemano.

Saludos

Si tengo el formulario Ventas, y el año de la fecha del sistema es el 2020 en que estamos.

Escribo una fecha para la factura y al pulsar Enter

Me voy a otro registro, escribo la misma u otra fecha

Me voy a otro, puedes ver que son registros distintos por las fecha de ventas

Ahora llega el cambio de año( y por eso te decía que daba exactamente igual, que es la instrucción la que comprueba que año es)

Puedes ver que le he cambiado loa fecha del sistema.

Ahora voy a escribir una fecha, lógicamente del año que viene)

En cuanto la escribo y pulso Enter

Ya me la pone "a partir" del año siguiente y no tengo que preocuparme. Y como te decía, la instrucción es

Private Sub FechaVenta_AfterUpdate()
Dim a As Integer
a = Nz(DCount("*", "ventas", "year([fechaventa])=year(date())")) + 1
NumFactura = "F" & Right(Year(Date), 2) & "-" & Format(a, "0000")
End Sub

Yo lo he puesto en el evento Después de actualizar del control FechaVenta pero podría estar en cualquier otro.

Lo pruebo y te digo, Gracias.

hola Julián, lo he estado probando y va genial, pero he descubierto un problema y es que si he creado por ejemplo las factura, f20-001: f20-002 y f20-003 y si elimino (que no es normal y lo entiendo) la f20-002 cuando creo una nueva factura me sale de nuevo la f20-003 que ya la tenia creada ya que estamos utilizando la función dcont y es normal. lo que me gustaría depurar este error y no  poder eliminar una factura ya creada con antelación a la ultima para evitar estos errores. ¿Cómo podría condenar estas facturas ya creadas?, lo suyo seria que me creara un aviso donde me diga que no puedo borrar dicha factura  y en su lugar que sustituya el nombre del cliente pero no el numero ni la fecha.

gracias de antemano.

saludos

No problemo, pero te recuerdo que la AEAT cuando se le presentan las cuentas quiere las facturas correlativas y si se hubiera "saltado" alguna, justificación documentada de porqué.

Si, digamos, la parte derecha del Numfactura va a tener tres dígitos. Tengo la tabla Ventas

Donde elimino, con código o desde aquí un registro, en este caso el 002

Cuando me voy al formulario Ventas y escribo una fecha en un registro nuevo( puedes ver que el cursor aún está en el control FechaVenta

Cuando pulso Enter

Le ha puesto en NumFactura el siguiente al último. En este caso el código es

Private Sub FechaVenta_AfterUpdate()
Dim a As Integer
a = Val(Nz(DMax("right([numfactura],3)", "ventas", "year([fechaventa])=year(date())"))) + 1
NumFactura = "F" & Right(Year(Date), 2) & "-" & Format(a, "000")
End Sub

Es decir, que trate 003 como si fuera entero, es la función Val

Respuesta
1

Como le explican es lo mejor, no obstante, desconozco el tipo de datos del campo "estado" ya que el texto "TODAS" se puede obtener de una consulta de unión. Para no complicarnos supongamos que el texto lo ha definido como "lista de valores" en el combo box. Siguiendo la respuesta de Julián solo adicionaría lo siguiente.

gracias Eduardo

En la primera línea le está indicando que si elige el año actual tome el histórico por que tiene :

IF Me.Cuadro_combinado35=Year(Date) Then ... y debe ser:

IF Me.Cuadro_combinado35<Year(Date) Then

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas