Agregar fechas a un campo y que sea siempre el día 30

Mi necesidad es la siguiente, tengo un formulario F_Entradas con un campo llamado FechaFactura que pertenece a una tabla llamada T_Facturas y tengo otro campo que se llama Vencimiento y necesito que en vencimiento le añada la fecha según la forma de pago (30, 60, 90, 120 días), eso lo tengo solucionado con la siguiente sentencia:

If me.formadepago = 2 then

Me.Domiciliado = DateAdd("m", 2, [FechaFactura])

end if

Mi problema que no puede solucionar es que siempre pagamos el día 30 de cada mes y necesito que me sume los meses pero siempre el día 30 (exceptuando febrero, que seria el día 28)

ejemplo:

24/02/22 -->  30/04/22

05/02/22 -->  30/04/22

31/03/22  --> 30/05/22

25/12/22 --> 28/02/22

4 Respuestas

Respuesta
1

Puede probar con esto:

DateAdd("d", -1, DateSerial(Year(DateAdd("m", 3, fecha)), Month(DateAdd("m", 3, fecha)), 1))

Disculpe. Me quedé con la idea de que quería que la fecha fuera el último día del mes, en lugar del día 30 excepto en febrero. Pero es fácil de adaptar, tal como le ha indicado Enrique Feijóo

Ésta podría ser la corrección:

DateSerial(Year(DateAdd("m", 2, fecha)), Month(DateAdd("m", 2, fecha)), iif(Month(DateAdd("m", 2, fecha))=2, 28, 30))
Respuesta
1

Pruebe con esta función, guárdela en un módulo: Requiere 3 parámetros el último es opcional.

mfecha      = FechaFactura

intDias       = Plazo 

intDiapago = El día del corte, si se omite se asigna 30.

Public Function fechaplazo(mfecha As Date, intDias As Byte, Optional intDiapago As Byte) As Date
' Función para fijar la fecha de cobro un día específico del mes
' Plazos de 30, 60, 90, 120 días
' Hace los ajustes para el mes de febrero teniendo en cuenta el año bisiesto
' Elaborada por:
' EDUARDO PÉREZ FERNÁNDEZ
 ' Fecha :     27/06/2022
 ' Parámetros:
 '            mfecha     = Fecha inicial
 '            intDias    = Plazo en Dias 30, 60, 90, 120 aunque puede ser cualquier otro
 '            intDiapago = Día del mes para cobro o vencimiento cuota
 '
 ' Ejemplos de llamada:
 '
 '                          fechaplazo("15/01/2020",30,30)  ---> Retorna 29/03/2020
 '                          fechaplazo("15/01/2021",90,30)  ---> Retorna 30/04/2021
     Dim DiasMes As Integer
     If CLng(intDiapago) = 0 Then
       intDiapago = 30
     End If
      fechaplazo = DateAdd("d", intDias, mfecha)
      DiasMes = Day(DateSerial(Year(fechaplazo), Month(fechaplazo) + 1, 0))
      If DiasMes < 30 Then
       fechaplazo = DateSerial(Year(fechaplazo), Month(fechaplazo), DiasMes)
       fechaplazo = DateAdd("d", DiasMes, fechaplazo)
      Else
       fechaplaz

Ejemplos:

? fechaplazo("15/01/2020",30,30) 
29/03/2020   ' Febero Año bisiesto. 30 días y corte el día 30

? fechaplazo("15/01/2021",30,30) 

28/03/2021  ' Febrero Año no bisiesto. 30 días y corte el día 30

? fechaplazo("15/01/2021",90,30) 
30/04/2021 ' Año no bisiesto. 90 días y corte el  día 30

De acuerdo con su información puede utilizar la función , por ejemplo

Si formadepago=1 cambie 60 por 30

Si formadepago= 3 cambie 60 por 90

Si formadepago = 4 cambie 60 por 120

En todos los casos si el corte lo hace no el 30 sino el día 20, cambie el 30 por 20 etc.

If Me.formadepago = 2 Then
 Me.Domiciliado = fechaplazo([FechaFactura], 60, 30)
End If

Me faltó parte de la función, disculpe.

Public Function fechaplazo(mfecha As Date, intDias As Byte, Optional intDiapago As Byte) As Date
' Función para fijar la fecha de cobro un día específico del mes
' Plazos de 30, 60, 90, 120 días
' Hace los ajustes para el mes de febrero teniendo en cuenta el año bisiesto
' Elaborada por:
' EDUARDO PÉREZ FERNÁNDEZ
 ' Fecha :     27/06/2022
 ' Parámetros:
 '            mfecha     = Fecha inicial
 '            intDias    = Plazo en Dias 30, 60, 90, 120 aunque puede ser cualquier otro
 '            intDiapago = Día del mes para cobro o vencimiento cuota
 '
 ' Ejemplos de llamada:
 '
 '                          fechaplazo("15/01/2020",30,30)  ---> Retorna 29/03/2020
 '                          fechaplazo("15/01/2021",90,30)  ---> Retorna 30/04/2021
     Dim DiasMes As Integer
     If CLng(intDiapago) = 0 Then
       intDiapago = 30
     End If
      fechaplazo = DateAdd("d", intDias, mfecha)
      DiasMes = Day(DateSerial(Year(fechaplazo), Month(fechaplazo) + 1, 0))
      If DiasMes < 30 Then
       fechaplazo = DateSerial(Year(fechaplazo), Month(fechaplazo), DiasMes)
       fechaplazo = DateAdd("d", DiasMes, fechaplazo)
      Else
       fechaplazo = DateSerial(Year(fechaplazo), Month(fechaplazo), 30)
      End If
End Function
Respuesta
1

La función DateSerial permite construir fechas

Una vez calculado el vencimiento se utiliza la función para modificar la fecha, tomando tus referencias:

Me.Domiciliado = DateSerial(Year(Me.Domiciliado), Month(Me.Domiciliado), 30 +2 *(Month(Me.Domiciliado ) =2))

Hay una fórmula para obtener el ultimo día del mes (sea 30, 31, 28 o 29) por si fuera adecuada al calculo.

Respuesta
1

Me permito agregar mi granito.

Observa que el 23/02/2024 es bisiesto, pues da igual

El código del evento Después de actualizar del combinado Vencimiento es

Private Sub Vencimiento_AfterUpdate()
Domiciliado = DateAdd("d", Vencimiento, FechaFactura)
Select Case Month([Domiciliado])
Case 1, 3, 5, 7, 8, 10, 12
Domiciliado = DateSerial(Year([Domiciliado]), Month([Domiciliado]) + 1, 0) - 1
Case Else
Domiciliado = DateSerial(Year([Domiciliado]), Month([Domiciliado]) + 1, 0)
End Select
End Sub

Utilizo primero el control Domiciliado para que me diga el mes que le correspondería en función de los días que le añada en Vencimiento y después, dependiendo de si tiene 31 días o no que le ponga el valor

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas