Newsgroup: it.comp.appl.access
Titolo: Vacanza estiva maledetta......

Ciao a tutti. Questa volta ho un problema grosso, almeno per me spero
possiate aiutarmi. Allora partendo da una data1 attraverso una serie di
condizioni arrivo ad una data2 che rappresnta rispetto alla prima diciamo
una scadenza.. Il problema e' questo : se nello spazio di tempo che
intercorre tra le due date c'e il periodo dal 1 agosto al 15 settembre
 vacanza estiva ) la seconda data va spostata in avanti partendo dal 16
settembre di tanti giorni quanti ne sono capitati nell'intervallo della
vacanza estiva. In pratica lo spazio di tempo tra le due date deve saltare
il periodo 1 agosto 15 settembre. Ho cercato di farlo con le mie conoscenze
(limitate)ma ci riesco con una serie esagerata di  iif che alla fine temo di
lanciare la query quando forse ci saranno migliaia di records . Non so se
esiste gia' una funzione scritta da qualcuno, visto che questa cosa della
"vacanza estiva" maledetta e' ricorrente in materia tributaria ma sarei
molto grato a chiunque mi postasse un po' di codice per aiutarmi . Ciao alla
prossima

 wrote in message
Zavf8.45739$fa5.1...@twister2.libero.it...

L'ho fatto ieri!!!!!!!!!!!!!!!!!!!!!!!!!!
E non riguarda solo l'ambiente tributario ma legale in genere (penale,
civile).
Ho il codice in ufficio, se riesco domani te lo posto ma ti spiego la
"ratio".
1. INIZIO = data di inizio
2. FINE = la data finale che nel mio caso è +4 o +6 mesi rispetto ad INIZIO
(basta un if)
3. calcolo DIFFERENZA, la differenza in giorni tra FINE ed INIZIO
4. Eseguo un ciclo while/wend finchè X che parte da 0 raggiunge DIFFERENZA
5. nel ciclo esamino giorno per giorno ad partire da INIZIO e se il giorno
considerato NON cade nell'intervallo 1/8-15/9 allora incremento X,
altrimenti SE CADE, non lo faccio; comunque incremento di 1 il giorno da
controllare.
Così mi ritrovo alla fine la data di scadenza giusta rispetto ai termini
previsti dalla legge.
Volendo il +4 o +6 lo posso prendere da una tabella in base ad un campo appo
sitamente impostato per ciascun record - nel mio caso per ciascun fascicolo.
Spero di esserti stato utile.
Ciao,                      Luigi.
P.S.: Mi raccomando la sicurezza del DB!

 grazie.
A domani per il codice...          Luigi.


Questa funzione l'ho messa in un modulo e la richiamo sull'evento modifica e
aggiorna del controllo "DATA_ISCRIZIONE" che sta sulla maschera sulla quale
sto lavorando. Se hai dei problemi ad utilizzare i moduli usa l'help in
linea, non è malvagio ed esamina i DB di esempio, li hanno fatti (help ed
esempi) spendendoci un pò di tempo ed allora usiamoli! (Lo ridico anche a
me...)
Sull'evento aggiorna e modifica del controllo "DATA_ISCRIZIONE" imposto il
valore del controllo
Me![SCADENZA_FINALE] = CalcolaScadenza(Me![DATA_ISCRIZIONE])
Public Function CalcolaScadenza(Inizio As Date) As Date
Dim Fine As Date
Dim diff As Variant
Dim giorno As Variant
Dim cont As Integer, x As Integer
' CALCOLO LA SCADENZA IN BASE AL TIPO DI REGISTRO
' Reg è una variabile che contiene il valore del controllo Me![REGISTRO]
presente sulla maschera, tale controllo dovrà già
' contenere un valore che mi permette di distinguere poi di quanti mesi
incrementare la data iniziale
If  Reg = "GdP" Then
     Fine = DateAdd("m", 4, Inizio)  ' +4 mesi
Else
     Fine = DateAdd("m", 6, Inizio) ' +6 mesi
End If
'CALCOLO I GIORNI INTERCORRENTI TRA INIZIO E FINE
diff = Fine - Inizio
giorno = Inizio
While x <> diff
     If (Month(giorno) = 8) Or (Month(giorno) = 9 And Day(giorno) <= 15)
Then
          ' non faccio niente...
     Else
          x = x + 1
     End If
     giorno = giorno + 1
Wend
Fine = giorno
CalcolaScadenza = Fine
End Function
Spero di essere stato abbastanza chiaro, eventualmente vedi esempi di
utilizzo di moduli da maschere sul sito comune
www.sitocomune.com
 è un pozzo di conoscenza  e bisogna sempre ringraziare
gli ottimi programmatori che lo conducono ed alimentano.
Bye bye, Luigi.
P.S.: Attendo critiche dai veri professionisti.

"Ciao Luigi ti disturbo di nuovo per chiederti qualche
consiglio perche' non sono riuscito ad adattare al
mio caso la tua funzione.
Nella mia maschera ho questa situazione :
Datadepo  =data del deposito
Notmano = notificato a mano
datanotifica   =   data della notifica
innanzitutto se nessuno di questi tre campi e'
presente non devo
calcolare la data di scadenza,
se e' presente la datadepo : la data di scadenza
e' 365 giorni dopo ( piu' la vacanza) ,
se e' flaggato il campo
notificato a mano la data di scadenza e' :
data notifica + 60 giorni (piu' vacanza)
Potresti per piacere mostrarmi come modificare la funzione ?
Spero di poter in qualche modo ricambiare la tua cortesia .
Ciao e grazie>

 wrote in message
zlSf8.52195$fa5.1...@twister2.libero.it...

Dammi un pò di tempo...
Per ricambiare, se mai ci si vedrà, un caffè basterà. (con tanto di rima...)
Bye, Luigi.

 Ciao e grazie>
Faccio con i giorni, visto che hai detto giorni (facilmente modificabile).
Vediamo quanto ci metto... ...divertimento della domenica mattina.
Ciao, Luigi.

Allora eccomi, ci ho messo molto meno del previsto.
Il campo Notmano è ovvio che è un campo booleano anche in struttura tabella!
Altrimenti cambiare il tipo di dato.
!!!!! Nella maschera nella quale inserisci/modifichi i dati sull' evento
"Dopo aggiornamento" dovrai inserire questo codice:
Private Sub DATADEPO_AfterUpdate()
If Not IsNull(Me![DATADEPO]) Or Not IsEmpty(Me![DATADEPO]) Then
    Me![DATASCADENZA] = CalcolaScadenza(Me![DATADEPO], Me![Notmano])
else
    Me![DATASCADENZA] = Null
endif
End Sub
!!!!! Poi crei una routine Function pubblica che chiami CalcolaScadenza che
funziona così:
Public Function CalcolaScadenza(Inizio As Date, Notifica As Boolean) As Date
Dim Fine As Date
Dim diff As Variant
Dim giorno As Variant
Dim cont As Integer, x As Integer
' CALCOLO LA SCADENZA IN BASE AL TIPO DI NOTIFICA
If Notifica Then
     diff = 60
     ***** SE VOGLIO AGGIUNGERE DUE MESI UTILIZZO QUESTA ISTRUZIONE ANZICHE'
QUELLA PRECEDENTE
     'Fine = DateAdd("m", 2, Inizio)
Else
     diff = 365
     ***** SE VOGLIO AGGIUNGERE UN ANNO UTILIZZO QUESTA ISTRUZIONE ANZICHE'
QUELLA
     'Fine = DateAdd("a", 1, Inizio)  PRECEDENTE
End If
'CALCOLO I GIORNI INTERCORRENTI TRA INIZIO E FINE ***** SOLO SE USO LE
ISTRUZIONI "ASTERISCATE"
'diff = Fine - Inizio
'ORA INIZIA L'ELABORAZIONE VERA E PROPRIA
giorno = Inizio
While x <> diff
     If (Month(giorno) = 8) Or (Month(giorno) = 9 And Day(giorno) <= 15)
Then
          '
     Else
          x = x + 1
     End If
     giorno = giorno + 1
Wend
Fine = giorno
CalcolaScadenza = Fine
End Function
Spero di essere stato chiaro, in caso ci sentiamo lunedi, se vuoi
privatamente per non tediare il NG con un thread vecchio.
linux....@tiscalinet.it
Buona Domenica (senza alcun riferimento politico - ci hanno fregato pure i
modi di dire porcazozza!).
Luigi.