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 RUN
- #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.