Access & C.

Estrazione casuale di date a partire da una data di inizio ed all'interno di un intervallo di tempo (date casuali).
L'amico Danilo mi ha scritto perchè ha un problema: senza soffermarsi nei dettagli, lui vorrebbe scegliere trimestralmente una data casuale a partire da quella precedentemente scelta, evitando sabati, domeniche e festività.

Soluzione

La cosa migliore mi è sembrata quella di implementare una funzione che restituisca una data a partire da una passsata come parametro insieme all'intervallo, in giorni, entro cui la data deve essere casualmente estrata (esempio 90gg per tre mesi).

Public Function getRandomDate(Start As Date, Intervallo As Integer) As Date

Il nostro amico, quindi, dovrà semplicemente invocare questa funzione passandogli l'ultima data scelta casualmente e l'intervallo di estrazione (cioè l'ampiezza del dominio di estrazione). Per verificare se il giorno è lavorativo basta sviluppare una seconda funzione che svolga proprio questo compito.

public function verificaLavorativo(target as Date) as Boolean. 

Se il risultato è false, si deve ripetere l'estrazione.

Ecco l'implementazione delle due funzioni:

	' Calcola la data casuale a partire dalla data Start all'interno di un intervallo
   ' di Intervallo giorni.
   ' Michele de Nittis
   ' 27/08/2008
   Public Function getRandomDate(start As Date, intervallo As Integer) As Date
   Dim giorno As Integer
   ' calcolo del giorno casuale
   giorno = Rnd() * intervallo
   ' calcolo della nuova data
   getRandomDate = DateAdd("d", giorno, start)
   End Function
 

In pratica ho usato la funzione Rnd() per estrarre un numero casuale compreso tra 0 ed 1 e l'ho moltiplicato per il numero di giorni dell'intervallo (es. 90 se voglio un giorno scelto casualmente entro tre mesi). Ho aggiunto, quindi, il numero intero ottenuto (la conversione ad intero è implicita) alla data di partenza con la funzione DateAdd().

	' Verifica se un giorno è lavorativo
   ' Michele de Nittis
   ' 27/08/2008
   Public Function verificaLavorativo(target As Date) As Boolean
   ' Si deve verificare che non sia un sabato o una domenica
   If Weekday(target) = 1 Or Weekday(target) = 7 Then
   verificaLavorativo = False
   Exit Function
   End If
   ' altre verifiche del caso: esempio controllo che non sia Natale
   If (Month(target) = 12 And Day(target) = 25) Then
   verificaLavorativo = False
   Exit Function
   End If
   ' altre verifiche del caso: esempio controllo che non sia Ferragosto
   If (Month(target) = 8 And Day(target) = 15) Then
   verificaLavorativo = False
   Exit Function
   End If
   verificaLavorativo = True
   End Function
 

In questa funzione ho usato la funzione Weekday() per scoprire se il giorno è lavorativo o meno.

La funzione verificaLavorativo() può essere, quindi, modificata per aggiungere il controllo di altre festività (non sarà facile determinare pasquetta!).

Facile?

Potete divertirvi scaricando il seguente esempio di applicazione che sfrutta le due funzioni suddette.

Inserisci un commento   |   Indietro

  [da 1 a 0 di 0 commenti]     |   Indietro

Inserisci un commento

Nick: e-mail:

web:

Commento: