Pagina 1 di 1

Calcolare il numero di Lunedi

Inviato: giovedì 21 novembre 2013, 9:22
da ilmaurino
Salve a tutti
qualcuno sa aiutarmi??'
Dovrei calcolare il numero di lunedì che ci sono fra due date... come faccio??

Re: Calcolare il numero di Lunedi

Inviato: venerdì 22 novembre 2013, 10:07
da raybaudi
Questa funzione crea una lista di tutti i lunedì fra due date, compresi eventuali lunedì delle due date.
( cioè tra il 04/11/2013 e il 25/11/2013 restituisce una lista di 4 lunedì )
Per poi calcolarne il numero ti basterà: ValueCount ( Mondays ( StartDate ; EndDate ) )

Codice: Seleziona tutto

/*
Mondays ( StartDate ; EndDate ) Custom Function
*/
Case(
StartDate and EndDate and StartDate ≤ EndDate ;
List ( If ( DayOfWeek ( StartDate ) = 2 ; StartDate ); Mondays ( StartDate + 1 ; EndDate ) ) 
)

Re: Calcolare il numero di Lunedi

Inviato: venerdì 22 novembre 2013, 12:03
da ilmaurino
grazie
la provo subito

Re: Calcolare il numero di Lunedi

Inviato: venerdì 22 novembre 2013, 18:51
da ilmaurino
Ho provato e funziona
ma se uso come data finale date successive al 2041 non funziona

Re: Calcolare il numero di Lunedi

Inviato: sabato 23 novembre 2013, 14:28
da raybaudi
Le funzioni ricorsive ( e questa lo è ) hanno un numero di ricorsioni limitato.

Nota che dal 23/11/2013 al 23/11/2040 ci sono la bellezza di 1409 lunedì e FileMaker deve tenere in memoria la bellezza di 15498 caratteri della lista ( questa funzione lo può fare ma solo per 10.000 ricorsioni )

Se hai la necessità di trovare il numero di lunedì fra due date che differiscono per più di 27 anni, puoi provare quest'altra che funziona fino a 136.

Codice: Seleziona tutto

/*
MondaysNumber ( StartDate ; EndDate ; CountValues ) Custom Function tail recursive
*/
Case(
StartDate and EndDate and StartDate ≤ EndDate ;
MondaysNumber ( StartDate + 1 ; EndDate ; CountValues + ( DayOfWeek ( StartDate ) = 2 ) ) ;
CountValues
)
Se poi le necessità sono ancora maggiori, si dovrà usare un looping script.
Tieni però presente che, per questo tipo di calcolo, spesso ( e questo è un caso ) si può usare un semplice campo calcolato come questo:

Codice: Seleziona tutto

Let(
newDate = EndDate - Choose ( DayOfWeek ( EndDate ) - 1 ; 6 ; 0 ; 1 ; 2 ; 3 ; 4 ; 5 ) ;
If ( StartDate and EndDate and EndDate ≥ StartDate ; Div ( newDate - StartDate ; 7 ) + 1 )
)