FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Como obtener fechas quincenales constantes?
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Como obtener fechas quincenales constantes?
Posted: Wed Dec 21, 2022 10:56 PM
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 (fw): Select all Collapse
#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.
Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Como obtener fechas quincenales constantes?
Posted: Wed Dec 21, 2022 11:06 PM

Se me olvidó mencionar que los dias que dan problemas son: 29 (Feb), 30, 31.

Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 1344
Joined: Wed Nov 16, 2005 09:14 PM
Re: Como obtener fechas quincenales constantes?
Posted: Wed Dec 21, 2022 11:53 PM

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

Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Como obtener fechas quincenales constantes?
Posted: Thu Dec 22, 2022 12:26 AM
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.
Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Re: Como obtener fechas quincenales constantes?
Posted: Thu Dec 22, 2022 02:59 AM
Utilizando esta logica, logramos el efecto que nosotros queríamos, no se si pueda servirte.


Code (fw): Select all Collapse
       
        //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
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Como obtener fechas quincenales constantes?
Posted: Thu Dec 22, 2022 03:25 PM

Cesar, Leandro. Gracias por contestar.

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

Gracias.

Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 2170
Joined: Fri Jul 18, 2008 01:24 AM
Re: Como obtener fechas quincenales constantes?
Posted: Thu Dec 22, 2022 04:41 PM

Leandro:

Es lo que buscaba.

Muchas gracias.

Francisco J. Alegría P.

Chinandega, Nicaragua.



Fwxh-MySql-TMySql
Posts: 1816
Joined: Wed Oct 26, 2005 02:49 PM
Re: Como obtener fechas quincenales constantes?
Posted: Thu Dec 22, 2022 05:04 PM
De nada Francisco es un gusto poder ayudar :D
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com

[ Turbo Incremental Link64 6.98 Embarcadero 7.70 ] [ FiveWin 25.01 ] [ xHarbour 64 bits) ]

Continue the discussion