Newsgroup: it.comp.appl.access
Titolo: calcolo data in Access 2003

Buongiorno a tutti sono un nuovo membro del gruppo, e vi chiedo subito
una cosa (per me quasi impossibile!)
Dunque ho una tabella T1 con 3 campi: nome | data_inizio_attivita |
durata_in_anni
es: FABIO | 01/05/1983 | 5
creo quindi una query Q1 per calcolare la data_fine_attivita; per cui
uso la funzione
"dateadd("aaaa";durata_in_anni;data_inizio_attivita)" e tutto funziona
per il meglio, infatti come risultato mi dà 01/05/1988.
siccome dal 05/1988 si rinnova per altri 5 anni e così via
all'infinito (05/1993 - 05/1999 - 05/2003- 05/2008) vorrei sapere se è
possibile creare una formula che mi dia la prima data_fine_attivita
dopo la data odierna, quindi solo 05/2008. (supponendo che oggi sia il
05/05/2008 il risultato dovrà essere 01/05/2013)
dato che in tabella T1 ci sono 140 righe con date tutte diverse tra
loro, è impossibile riuscire a farlo a mano, e mi evitereste un lavoro
disumano
un GRAZIE immenso a tutti
Fabio B.

[omissis]
Visto che devi fare delle iterazioni per poter capire quando fermarti
nell'aggiungere anni alla data di partenza, l'unico modo è passare per il
VBA: con una query non puoi ottenere quello che cerchi.
Ti consiglio di utilizzare un recordset disconnesso, con una struttura
identica a quella della tabella di partenza, ma con l'aggiunta di un campo
che andrà a contenere la data di fine attività.
Prima di tutto recuperi i dati dalla tabella di partenza e popoli il
recordset.
Poi scorri il recordset appena popolato e, record per record, ti calcoli la
data di fine attività (secondo i criteri che tu stesso hai evidenziato) e
fai un update del record corrente.
Alla fine ti basta cercare il record che ha il valore data fine attività
minimo.
-- 
PBsoft di Gabriele Bertolucci
www.pbsoft.it
skype:pbsoftsolution

Ciao grazie della risposta ma non sono molto ferrato in programmazione
VBA
riesci a darmi qualche informazione più dettagliata?
grazie

 ha scritto nel messaggio 
news:1f01b9ff-44c2-456f...@m34g2000hsb.googlegroups.com...
Ciao grazie della risposta ma non sono molto ferrato in programmazione
VBA
riesci a darmi qualche informazione piů dettagliata?
grazie
Mi pare di aver capito che la data di fine incarico diventa la data di 
inizio di un nuovo incarico dopo che sono trascorsi 5 anni.
Se cosě č, nella tabella devi avere i campi, chiamiamoli [inizio], [fine] e 
[durata]
nella maschera riporti questi campi in rispettivi controlli.
Nell'evento "Su attivato..." del controllo [fine] vai a inserire il codice 
VBA che tu stesso hai indicato e cioč:
me.fine=dateadd("aaaa",[durata],[inizio])
a questo punto puoi impostare una formattazione condizionata sul controllo 
[fine] in modo che se la data di fine č > della data odierna il colore di 
primo piano diventi rosso. Quando scorri i record e ti accorgi di uno che ha 
il controllo [fine] rosso non devi fare altro che digitare la nuova data di 
inizio e verrŕ ricalcolata la nuova data di fine.
Vedi se questa soluzione ti č sufficiente.
Ciao
NSAntini
 

 inizio di un nuovo incarico dopo che sono trascorsi 5 anni.
No, la data che lui cerca è più difficile da reperire.
Non è possibile ottenerla con una query perché lui deve fare un calcolo
modulare.
Per ogni record lui deve calcolare tutte le date successive a quella di
inizio, per intervalli di anni pari al numero della durata.
Il calcolo deve fermarsi quando raggiunge una data che sia maggiore di
quella odierna.
Una volta ottenuta questa informazione per ogni record, deve fare una query
sul recordset ottenuto, andando a scegliere il record con il valore minimo
per il campo "data fine attivita".


Ciao Gabriele hai centrato il problema.
hai tempo per postare le righe di comando?
grazie lo stesso
Fabio B.

 hai tempo per postare le righe di comando?
Ciao Fabio.
Devo dire che non solo solito postare del codice, almeno non come primo
impatto nella ricerca di soluzione ad un problema.
Sarebbe meglio (per te) cominciare ad affrontare la programmazione in VBA
ed il comandi SQL.
Posso darti velocemente suggerimenti su cosa affrontare:
- un modello ad oggetti (ADO o DAO, scegli tu) per utilizzare il recordset
disconnesso;
- il ciclo Do While....Loop, per il quale trovi informazioni a sufficienza
nell'help del VBA;
- l'oggetto recordset del modello ad oggetti scelto precedentemente, per
capire come definire un recordset, i suoi campi, come popolarlo e come
utilizzarlo.
Ti consiglio poi di definire una funzione esterna per il calcolo della data
di fine attività, in modo da non complicare troppo il ciclo che andrai ad
utilizzare per popolare il relativo campo del recordset.
Prova a cominciare, poi vediamo se e dove ti fermi e cerchiamo di risolvere
insieme.


Gabriele ho seguito il tuo consiglio di usare la funzione loop e
prendendo spunto dalla guida di VBA ho creato questo codice, associato
a una casella di testo della maschera che contiene data_inizio e
intervallo.
Private Sub Testo3_GotFocus()
    counter = Me![intervallo]
    mynum = Me![data_inizio]
    Do
        mynum = mynum + counter
    Loop Until mynum >= Now()
    MsgBox "tutto OK", vbExclamation
End Sub
sembra che il codice funzioni ma nella casella di testo non mi dà
nessun risultato visibile...

 nessun risultato visibile...
La risposta banale sarebbe dire che non hai assegnato alla casella di testo
il valore calcolato.
La risposta corretta è dire che il problema sta molto più a monte.
Poiché tu vuoi visualizzare in una form tutti i dati, compresa quella data
di fine attività che tanto ci sta facendo penare, ed in considerazione del
fatto che tale data deve essere ricavata da codice VBA e non può essere
ottenuta con una semplice query, per visualizzare tutte queste informazioni
devi necessariamente appoggiarti ad una struttura dati ad hoc.
In questo caso ti ho consigliato di utilizzare un recordset disconnesso.
Creati la tua form come ti piace, poi, all'interno del suo modulo di
codice, vai a dichiarare un recordset ADO (a me piace ADO), gli aggiungi
tutti i campi desiderati, compreso quello che conterrà la data di fine
attività.
A questo punto, ti apri un secondo recordset che pesca i dati dalla tabella
originale.
Ore, con un loop su questo secondo recordset, ti sfogli tutti i record e li
aggiungi al recordset finale.
Ovviamente devi anche prevedere una tua funzione che, presa la data di
inizio attività ed il "periodo", ti calcoli la minore data maggiore o
uguale a quella corrente.
Ottenuto quindi il recordset desiderato, devi impostarlo come RecordSource
della form che ti sei creato all'inizio.
Prova.
