Calcular en una consulta access la fecha de vencimiento

De nuevo tengo una consulta, que es similar a una anterior que ya realicé, pero ahora necesito el cálculo en una consulta de access.

Tengo una CONSULTA  en access: con un campo [Fechafactura]. Otro campo  [FormaPago] que suele ser 30, 60 o 90 días y un campo [DiaVcto] que suele ser 5, 10, 20 o 25 y que se corresponde al día de pago del mes.

La fórmula la necesito como he comentado en la consulta.

Ejemplo 1: fechafactura= 15/10/2018 FormaPago= 30 días. Esto sería el 15/11/2018 y DiaVcto= 20. En este caso la fechaVcto sería 20/11/2018.

Ejemplo 2: fechafactura=15/10/2018 FormaPago= 30 días. Esto sería el 15/11/2018 y DiaVcto=5. En este caso la fechaVcto sería 05/12/2018.

Ejemplo 3: fechafactura=15/10/2018 FormaPago= 0 días. Esto sería el 15/10/2018 y DiaVcto=5. En este caso la fechaVcto sería 05/11/2018. 

Respuesta
3

Paco: Te facilito un enlace que tiene una Función para ese proceso.

http://www.mvp-access.com/foro/vbacalculo-de-vencimiento-dia-pago_topic77307.html 

Un saludo >> Jacinto

Muchas gracias Jacinto, pero lo que necesito es "poner" el código en la consulta o similar. Para luego llevarlo a varios informes.

Paco: Ese código lo pones en un Módulo Estándar y lo llamas desde un campo de una consulta.

Aquí a la Función yo le he llamado VtoMasDiaPago y los parámetros como ves son >>

FechaFra, Forma de pago en días (30), Verdadero(-1) y los Días de Pago (10;15;20;30)

Tu pones tus cantidades. Un saludo >> Jacinto

Perdona mi insistencia, fruto de mi desconocimiento.

Creo entender que al módulo lo llamo VtoMasDiaPago ( con el código que me enviaste) y te ruego me digas como añado en la consulta si la FormaPago es también a 60 y a 90 días

Perdón Jacinto he olvidado darte las gracias por tu tiempo y paciencia.

Un saludo. Paco

Paco: El Nombre del módulo puede ser cualquiera >> Ejemplo MdlFunciones

Lo nombro así porque es posible que en otra ocasión quieras guardar otras Funciones aparte de esa.

La Función Original como habrás podido ver en el enlace se llama >> AWvencimiento y es la que yo he sustituido por >>VtoMasDiaPago

Si tu quieres respetar el Nombre Original, entonces la línea sería>>

DiaVtoFra:AWVencimiento([FechaFra];30;-1;10;15;20;30)

Un saludo >> Jacinto

Perdona una vez más mi tozudez, pero no consigo que me funcione el cálculo.

Mi módulo se llama: MdVtoconDiaPago con el siguiente código que tú me enviaste ya en una pregunta anterior:


'Esta funcion nos permite calcular la fecha de vencimiento con varios dias de pago o sin ellos.
'http://www.mvp-access.com/foro/vbacalculo-de-vencimiento-dia-pago_topic77307.html
'Adaptada por Jacinto Trillo Jareño en Fecha 28/09/2017 para Paco Sanchez
'Parametros:
'DFecha: Fecha de inicio del calculo; DPlazo: Numero de dias aplazados
'BAprox: Boolean, si es True indica que en los casos que el dia de pago no exista para ese mes, se obtendrá el ultimo dia del mes.
'DDias: Matriz con los dias de pago.
'Ejemplos:
'VtoMasDiaPago #12/12/2004#, 75, True = 25 / 2 / 5
'VtoMasDiaPago #12/12/2004#, 75, True, 10, 30 = 28 / 2 / 5
'VtoMasDiaPago #12/12/2004#, 75, False, 10, 30 = 10 / 3 / 5
'VtoMasDiaPago #12/12/2004#, 75, True, 20, 10, 5 = 5 / 3 / 5
Public Function VtoMasDiaPago(DFecha As Date, DPlazo As Integer, BAprox As Boolean, ParamArray DDias()) As Date
Dim VDia As Integer, NDia As Integer, SDias As Integer
DFecha = DFecha + DPlazo
Do
        For NDia = 0 To UBound(DDias())
                SDias = SDias + DDias(NDia)
                VDia = DDias(NDia) - Day(DateSerial(Year(DFecha), Month(DFecha), DDias(NDia)))
                If (Day(DFecha) = VDia And BAprox) Or Day(DFecha) = DDias(NDia) Then Exit Do
        Next
        If SDias = 0 Then Exit Do
        DFecha = DFecha + 1
Loop
VtoMasDiaPago = DFecha
'MsgBox "El día de vencimiento en estas condiciones es el: " & VtoMasDiaPago
End Function


y que me funciona perfectamente en un formulario en el que yo utilizo los campos [fechafactura], [formapago], [díaVto] y el cálculo me lo da en [fechaVto].

Cuando utilizo la consulta actual que necesito con lo que me has enviado DiaVtoFra: (VtoMadDiaPago ([fechaFra];30-1;5;10;20)    Siendo 5;10;20 los días de pago que yo utilizo.

El cálcuo es incorrecto:

con un cliente que tengo [formapago]=0 y [DiaVto]=5   el resultado es 10/01/2019. Cuando debería ser 05/01/2019

con otro cliente que tengo [formapago]=0 y [DiaVto]=0   el resultado es 10/01/2019. Cuando debería ser 06/12/2018.

Teniendo en cuenta en ambos casos que [fechaFactura]:Fecha() que se corresponde con 06/12/2018

Espero haberme explicado con claridad y Perdona mi insistencia, pero creo que es lo que necesito utilizar.

Gracias Paco

No hay nada que disculpar. Simplemente intentas resolver un problema y pides ayuda para ello.

Ignoro como tienes tu estructura de datos, pero me temo que setrata del modo en el que informas.

Yo he tomado dos posiciones con fecha 06/12/2018, pongo las condiciones que citas y obtengo el resultado que tu esperabas.

Te adjunto la Consulta (imagen) y el resultado. Como extensión del comentario ten en cuenta que el último parámetro de la Función es una matriz que a suvez puede tener 1 o varios valores.

Ya que usas por lo que veo distintos días de pago (o eso parece), te he puesto hasta cuatro valores. La secuencia de llenado ya lo ves >> 0, 5, 10 ,20 o 1, 8, 16, 25 o 0, 0, 0, 0.

Puedes informar de un solo valor, pero al llamar la función desde una consulta, lo haces como te indico o con Condicionales sobre algún campo de Clientes. Esto último es un poco complejo.

Si aún así no sales del atasco me comentas. Un saludo >> Jacinto

Pues sigo de nuevo con mi rollo.

Te envío el diseño de la consulta de datos anexados, donde ejecuto lo que tú me mandas (prefierio la anterior) ya que en mi ficha cliente solo tengo un campo DiaVto

y te envío el resultado de esta consulta donde aparece fechaFactura 06/12/2018, que en la consulta es fecha() y donde se ve fechaVto 10/01/2019

Siendo los campos de este cliente FormaPago=0  y DiaVto=0

el resultado tiene que ser FechaVto = 06/12/2018

Si pudiera resolverlo aquí, me sería mucho más fácil.

No encuentro donde está el fallo, si en la consulta      

DiaVtoFra: VtoMasDiaPago([fechafactura];30-1;5;10;20;30)     

o, quizás esté en el módulo. Pero ya te lo he enviado esta mañana y funciona en otro formulario a la perfección

Gracias una vez más.

Paco

Paco: Si solo tienes un día de vencimiento que por lo que veo llamas DiaVto, simplifica la llamado con>>

DiaVtoFra: VtoMasDiaPago([FechaFactura];[FormasPago];-1;[DiaVto])

El 5,10... etc no pintan nada. Pero has de llevar DiaVto a un campo de la consulta, porque no veo que lo estés haciendo.

Ya me contarás. Un saludo >> Jacinto

No sé que admiro más de ti: tus conocimientos de access, tu rapidez en responderme, tu paciencia o tu disponibilidad para ayudar. Supongo que todas.

Estoy probando tu última respuesta y creo que funciona perfectamente.

MUCHÍSIMAS GRACIAS UNA VEZ MÁS.

Paco Sánchez

1 respuesta más de otro experto

Respuesta
2

¿Tiene qué ser en una consulta? Yo te lo pongo en código y tu lo pasas a una consulta.

Cuando pongo el cursor sobre FechaVcto(pero podría ser en otro evento)

En el siguiente

En el siguiente

El código del evento Al recibir el enfoque del cuadro de texto  FechaVcto es

Private Sub FechaVcto_GotFocus()
If Month([FechaFactura]) <= Month(FechaFactura + FormaPago) Then
FechaVcto = DiaVcto & "/" & Format(DateAdd("m", 1, FechaFactura + FormaPago), "mm/yyyy")
End If
End Sub

Muchas gracias Icue por tu rapidez y solución.

Te comento lo necesito en una consulta, porque después paso la fechVcto a varios informes. Y no sé como hacerlo en la consulta. Si me puedes ayudar en como hacerlo, mi agradecimiento sería más que infinito, (que ya lo es).

Supongo que el código también funciona con este ejemplo 4: fechafactura=10/10/2018 FormaPago= 0 días. Esto sería el 10/10/2018 y DiaVcto=15. En este caso la fechaVcto sería 15/10/2018. 

Muchas gracias de nuevo

Vamos por partes

1º ¿qué mejor sitio para tener la fechaVcto que en la misma tabla?

La puedes "usar" en cualquier sitio, o bien con su propio valor o bien usando Dlookup

2º Reconozco que me cegué con las fechas que ponías. No se me ocurrió pensar(con lo que duele) en que pasaría si las fechas fueran estas últimas que acabas de poner. Me pongo manos a la obra.

Quedaría así

El código es

Private Sub FechaVcto_GotFocus()
If DiaVcto > Day(FechaFactura + FormaPago) Then
FechaVcto = CDate(DiaVcto & "/" & Format((FechaFactura + FormaPago), "mm/yyyy"))
ElseIf Month([FechaFactura]) <= Month(FechaFactura + FormaPago) Then
FechaVcto = CDate(DiaVcto & "/" & Format(DateAdd("m", 1, FechaFactura + FormaPago), "mm/yyyy"))
End If
End Sub

Perdona Icue, de nuevo mi pesadez y desconocimiento.

Cómo "pongo" el código que me envías?:

Private Sub FechaVcto_GotFocus()
If DiaVcto > Day(FechaFactura + FormaPago) Then
FechaVcto = CDate(DiaVcto & "/" & Format((FechaFactura + FormaPago), "mm/yyyy"))
ElseIf Month([FechaFactura]) <= Month(FechaFactura + FormaPago) Then
FechaVcto = CDate(DiaVcto & "/" & Format(DateAdd("m", 1, FechaFactura + FormaPago), "mm/yyyy"))
End If
End Sub

En el campo [fechaVcto] de mi consulta

Gracias de nuevo. Paco

En vista diseño del formulario selecciona el control FechaVcto. Pulsa arriba en Hoja de propiedades y se abrirá la ventana de propiedades de ese control. Selecciona la solapa Eventos y haz clic en el "rectángulo" blanco a la derecha de Al recibir el enfoque. Te aparecerá el botón de tres puntos(...). Si lo pulsas te aparece la ventana del generador. Selecciona Generador de código y Aceptar

Se abrirá la ventana del editor de VB y pon

Pero no es en ninguna consulta, es el formulario donde escribes los datos. ¿Para que hacer una consulta, que ademas el campo calculado no te lo guarda en ningún sitio, si lo puedes obtener automáticamente cuando pones los datos y te lo guarda "para siempre" en una tabla.

Perdona Icue de nuevo, pero he adaptado el código a los nombre de mis campos en un formulario  y me da un error "no coinciden los tipos".

Te adjunto el código tal como lo tengo:

Private Sub Selec_AfterUpdate()
If DiaVto > Day(FechaHoy + FormaPago) Then
FechaVtoHoy = CDate(DiaVto & "/" & Format((FechaHoy + FormaPago), "mm/yyyy"))
ElseIf Month([FechaHoy]) <= Month(FechaHoy + FormaPago) Then
FechaVtoHoy = CDate(DiaVto & "/" & Format(DateAdd("m", 1, FechaHoy + FormaPago), "mm/yyyy"))
End If
End Sub


Gracias de nuevo y disculpa mi insistencia.

Paco

Creo que lo mejor es que si quieres, repito, si quieres, mándame un mensaje(sólo el mensaje) a [email protected] y te mando un ejemplo, que es como mejor se vé. Si lo haces, en el asunto del mensaje pon tu alias Paco Sánchez, ya que si no sé quien me escribe ni los abro.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas