Page 1 of 1

Como obtener fechas quincenales constantes?

PostPosted: Wed Dec 21, 2022 10:56 pm
by FranciscoA
Saludos. Me explico:
Partiendo de una fecha inicial, se le suma 15 y se obtienen las dos fechas que necesitamos.
EJ
dFecIni := date()
dFecQ2 := dFecIni + 15
nQuincenas := 18

A partir de estas variables, queremos armar un array que contenga, en primer lugar, dos elementos con las fechas descritas.
Luego, segun el numero de quincenas (nQuincenas) iremos agregando los elementos para cada una de ellas, cuyas fechas
deberán siempre comenzar con los mismos dias, es decir, si Day(dFecIni) = 13 y Day(dFecQ2) = 28, todas las quincenas deben
comenzar con esos dias.

Si alguien ya ha desarrollado algo parecido, mucho agradeceré si puede compartir el código.

Esto es lo que he logrado hacer:

Code: Select all  Expand view
#include "FiveWin.ch"

Function Main()
local dFecIni  := date(), n, aArr := {}, nDayAnt := 0
local dFecQ2 := dFecIni + 15
local nQuincenas := 18
local dFecha := dFecIni

aadd( aArr, {1, dFecha} )
aadd( aArr, {2, dFecha + 15 } )

For n := 3 to nQuincenas
   dFecha := AddMonth( dFecha, 30, @nDayAnt )
   aadd( aArr, {n, dFecha} )

   n += 1
   aadd( aArr, {n, dFecha + 15} )
Next

XBROWSER aArr TITLE "FECHAS QUINCENALES CONSTANTES"   SETUP ( oBrw:cHeaders := {"QUINCENAS", "FECHAS"} )

Return aArr


Static Function AddMonth( dDate, nDays, nDayAnt )     //tomada del foro: Maestro Manuel Mercado.
   Local nMonth, nMonths, nDay, nYear, ;
         aDias := { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }

   If ( nDays % 30 ) > 0
      Return dDate + nDays
   EndIf

   nMonths := nDays / 30
   nMonth := Month( dDate ) + nMonths
   nDay := Day( dDate )
   nYear := Year( dDate )

   If nMonth > 12
      nMonth := nMonth - 12
      ++nYear
   EndIf

   If nDayAnt > 0
      nDay := nDayAnt
   EndIf

   nDayAnt := 0

   If nDay > aDias[ nMonth ]

      nDayAnt := nDay

      If nMonth == 2
         If ( ( nYear % 4 ) == 0 ) .and. ( ( ( nYear % 100 ) != 0 ) .or. ;
            ( ( nYear % 400 ) == 0 ) )
            nDay := If( nDay > 29, 29, nDay )
         Else
            nDay := 28
         EndIf
      Else
         nDay := aDias[ nMonth ]
      EndIf

   EndIf
Return CtoD( Str( nDay, 2 ) + "." + StrZero( nMonth, 2) + "." + LTrim( Str( nYear ) ) )

 

Saludos, nuevamente.

Re: Como obtener fechas quincenales constantes?

PostPosted: Wed Dec 21, 2022 11:06 pm
by FranciscoA
Se me olvidó mencionar que los dias que dan problemas son: 29 (Feb), 30, 31.

Re: Como obtener fechas quincenales constantes?

PostPosted: Wed Dec 21, 2022 11:53 pm
by cmsoft
Francisco:
Cual sería la lógica si la fecha no es válida?
Por ejemplo, si empiezas el 16/01/2022, la segunda quincena sería 31/01/2022 pero esos dos dias ya no serían válidos para todos los meses que tienen menos de 31 días.
Que desearías obtener para la segunda quincena? 16/02/2022 y 03/03/2022 o 16/02/2022 y 28/02/2022?
No se si soy claro con la pregunta

Re: Como obtener fechas quincenales constantes?

PostPosted: Thu Dec 22, 2022 12:26 am
by FranciscoA
cmsoft wrote:Francisco:
Que desearías obtener para la segunda quincena? 16/02/2022 y 03/03/2022 o 16/02/2022 y 28/02/2022?


Fuiste muy claro!
16/02/2022 y 28/02/2022
Saludos.

Re: Como obtener fechas quincenales constantes?

PostPosted: Thu Dec 22, 2022 2:59 am
by leandro
Utilizando esta logica, logramos el efecto que nosotros queríamos, no se si pueda servirte.

Image

Code: Select all  Expand view
     
        //si es quincenal
    nMese := round((::hEncabezado["numero_cuotas"]/2),0)
    FOR i:=1 TO nMese
        AADD(aTempo,AddMonth( ::hEncabezado["primera_cuota"] , i ) )
    NEXT
    AADD(aFechas,::hEncabezado["primera_cuota"])
    FOR i:=1 TO len(aTempo)
        dFech := aTempo[i]
        dFec2 := dFech - 15
        AADD(aFechas,dFec2)
        AADD(aFechas,dFech)
    NEXT

Re: Como obtener fechas quincenales constantes?

PostPosted: Thu Dec 22, 2022 3:25 pm
by FranciscoA
Cesar, Leandro. Gracias por contestar.

Leandro, parece ser lo que busco. Pruebo y comento.
Gracias.

Re: Como obtener fechas quincenales constantes?

PostPosted: Thu Dec 22, 2022 4:41 pm
by FranciscoA
Leandro:
Es lo que buscaba.
Muchas gracias.

Re: Como obtener fechas quincenales constantes?

PostPosted: Thu Dec 22, 2022 5:04 pm
by leandro
De nada Francisco es un gusto poder ayudar :D