Newsgroup: it.comp.appl.access
Titolo: calcolare gg lavorativi nelle queries

Lo so che l'argomento ultimamente è stato trattato più volte.
Il demo di Enrico Virginio intitolata "Sommare giorni lavorativi ad una 
data funziona eccome se funziona in una maschera.
io sto provando a farla funzionare in una query e non ci riesco :
datainiziale	giorni	datafinale	dovrei ottenere
12/01/2005	5	16/01/2005	18/01/2005
13/01/2005	4	16/01/2005	18/01/2005
26/01/2005	2	29/01/2005	27/01/2005		
15/01/2005	3	17/01/2005	19/01/2005
flaggando true il check del considera I° giorno
questo è quello che ottengo applicando la funzione in questo modo :
datafinale: 
[datainiziale]+contalavorativi([datainiziale];([datainiziale]+[giorni]);Vero)
l'sql è codesto :
SELECT Tabella1.datainiziale, Tabella1.giorni, 
[datainiziale]+contalavorativi([datainiziale],([datainiziale]+[giorni]),True) 
AS datafinale
FROM Tabella1;
Secondo me funziona bene nelle maschere in quanto sull'evento click c'è 
questo :
Do Until 1 = 2
     If ContaLavorativi(DataInizio, DataFine, True) = Giorni_ver Then
         Exit Do
     End If
     DataFine = DataFine + 1
Loop
perche si "looppa" finchè contalavorativi non è uguale a giorni_ver, 
conteggio che non viene effettuato in caso di festivo con la variabile 
conto.
Non capisco come scrivere queste istruzioni nella function quando si 
necessita di utilizzarla nelle queries e non nelle maschere.
Sperando di non avere preso un abbaglio, e di ottenere un aiuto, saluto 
tutti e ringrazio per l'attenzione.

 ha scritto nel messaggio
news:kGyLd.801851$35.31...@news4.tin.it...

La tua diagnosi è giusta: senza ciclo Do ... Loop non tirerai fuori un ragno
dal buco.
Quindi devi scriverti una funzione che contenga tale ciclo, memorizzare tale
funzione in un modulo del tuo database ed infine richiamare tale funzione
dalla tua query: naturalmente dovrai memorizzare in un modulo del tuo
database anche al altre funzioni così come è stato fatto per l'esempio
pubblicato nel  SitoComune.
Vedrai che così avrai il risultato corretto.
-- 
Roberto
-----------------------------------------------------
il Sito Comune di it.comp.appl.access
http://www.sitocomune.com
----------------------------------------------------

 Vedrai che così avrai il risultato corretto.
Devo dire che non ci sarei arrivato. Grazie.Effettivamente creando 
un'altra function il problema si risolve.
Adesso Roby ti sottopongo un'altra domanda.
ho una tabella T_ciclo_lavoro che è la tabella di raccordo tra 
T_articoli e T_fasi_lavoro (relazione molti a molti).
Nella T_ciclo_lavoro sono presenti oltre alla due chiavi esterne della 
due tabelle anche un campo tempo che è il tempo per effettuare la fase 
di lavoro e il macchinario.
componendo una query ottengo mettendo insieme anche altre tabelle la 
data di inizio lavorazione e la data di fine lavorazione (con la 
function che mi hai suggerito di creare), per ogni ordine.
il problema è che nell'esplosione della query la data di inizio è la 
data di inizio di tutte le fasi di lavorazione, uguale per tutte le 
fasi, io vorrei che fosse considerata come data di inizio della fase 
successiva, la data finale della fase precedente. vorrei ottenere questo :
es.	data inizio	data fine		
fase 1	12/01/2005	17/01/2005	
fase 2	17/01/2005	19/01/2005		
fase 3	19/01/2005	25/01/2005			
fase 4	25/01/2005	26/01/2005
...
fase n	26/01/2005
invece ottengo questo :
es.	data inizio	data fine		
fase 1	12/01/2005	17/01/2005	
fase 2	12/01/2005	19/01/2005		
fase 3	12/01/2005	25/01/2005			
fase 4	12/01/2005	26/01/2005
...
fase n	12/01/2005
in pratica la data di fine lavorazione per ogni fase per ora la calcolo 
solo tenendo conto del tempo necessario per effettuare quella fase dalla 
data iniziale vorrei invece tenere conto della data finale della 
lavorazione precedente.
Aspetto speranzoso. Ci ho messo una vita ad arrivare fino qua !
Ciao, grazie.

 ha scritto nel messaggio
news:xGRLd.808121$35.31...@news4.tin.it...

Se non ho capito male tu vuoi, in una query, definire un campo calcoato
basandosi sul valore di un campo dl record precedente.
Se le cose stanno così trovi la soluzione a questo link:
http://support.microsoft.com/kb/q101081/
Delle soluzioni che ti vengono proposte in quell'articolo ti consiglio di
usare quelle realizzate con delle funzioni VBA e non quelle basate sulla
funzione DLookup.


 Roberto
Ciao Roby, l'esigenza è proprio questa e cercherò di adattare una delle
function proposte.
Ancora un'altra cosa:
se il tempo lo calcolo in gioni di lavoro è ok, ma pensandoci bene, potrebbe
non essere sufficiente, perchè mi sevirebbe gestire anche l'ora di inzio e
di fine lavorazione e la relativa data.
Se in un giorno lavorativo l'orario di lavoro è 08.00-12.00 e 13.30-17.30
e il tempo per effettuare una lavorazione è ad es. 8 ore e 20 minuti, è
possibile ottenere che se la data di inizio lavorazione è il 02/02/2005 alle
ore 8, la data di fine lavoro è il 03/02/2005 alle ore 8.20 ??
Questo deve valere anche se la data di inizo lavoro è 17.00 del 02/02/2005 e
il tempo lavoro è 3 ore la data di fine lavorazione è 03/02/2005 alle ore
10.30.
mmmm, la vedo dura !!
Grazie, ciao.

 Grazie, ciao.


 procedure adottate sino ad ora.
Roby, ciao.
Mi hai dato un'altra dritta strepitosa perchè pur sapendo dell'estistenza
delle due sopra citate funzioni ignoravo il fatto che si potessero sommare
ore e minuti a una variabile data/ora, anche se, se ci penso bene è anche
ovvio.
Soprattutto per pensare di sfruttare i minuti ...
Così con la funzione creta grazie al suggerimento di ieri, quella creata con
il suggerimento di oggi, interagendo con le funzioni contalavorativi e
Pasqua ho ottenuto un risultato insperato : quello di ottenere oltre che
alla data effettiva lavorativa della fine produzione di una lavorazione
anche l'ora e i minuti.!!!
Per questo è un risultato eccezionale per l'utilità che mi dà.
Magari te la mando al SC come aggiornamento del demo che già c'è !!
No, sto scherazando, ai più non aggiungerebbe nulla di estremamente
significativo, il demo è a posto così come lo avete presentato.
Ti ringrazio, a presto, CIAO!

 ha scritto nel messaggio
news:ZecMd.488146$b5.23...@news3.tin.it...

Scusa Sandro, ma io riterrei abbastanza interessante pubblicare una nuova
FAQ contenente quanto hai realizzato: penso che sarebbe utile a molti.
Se ti decidi di inviare una demo al Sito Comune, ti sarei grato se lo
facessi anche con un databse in formato Access 97.


 ha scritto nel messaggio
news:cItMd.14543$QG6.2...@twister2.libero.it...

Ciao Roberto,
ok, la mando insieme ad altre due utility che ho realizzato molto semplici
ma efficaci in vers. A97,A00,A03, alla faccia di quel simpatico
frequentatore che lamentava la non presenza di demo nelle ultime versioni
...
Prima però ti richiedo ancora un'ultima consulenza che è tutto il giorno che
invanamente mi sforzo a risolvere.
Ho visto il tuo demo che crea una somma progressiva in una query utilizzando
un function personalizzata in VBA.
Non so se sia corretto applicarla nel caso in cui sono io, oppure se come
già mi hai consigliato il link della Ms di ieri o l'altro ieri.
In pratica mi trovo ad ottenere con la function la data finale e ora finale
di una lavorazione partendo dalla data di inizio lavorazione.
Ciò non capisco è come posso ottenere una query con data in progressione
"sui generis" di quella che hai presentato nel demo.
in pratica se con una macchinario mi trovo in questa situazione :
        data inizio     tempo impiegato(minuti)        data e ora finale
        19/05/04          500                                    20/05/2004
ore 08.20.00
alle 08.20.00 del 20.05.2004 potrei incominciare un'altra lavorazione
(teoricamente)  e quindi ottenre
        20/05/04 ore08.20.00         500                   22/05/2004 ore
08.20.00
e cosi via ....
in pratica la data e ora della lavorazione precedente deve essere la data e
ora di inzio della lavorazione successiva a cui sommare il tempo della
lavorazione attuale.
Altro bel dilemma mi sa! (Spero di essere stato chiaro.)
Dovrei, con una function del record corrente che sto calcolando, risalire
alla data e ora finale del record precedente farla diventare la data
iniziale, e poi da qui sommare il tempo della lavorazione che sto facendo.
E' la strada da fare ? Se no come posso risolvere ?
Ciao, grazie ancora.

 ha scritto nel messaggio
news:EwuMd.492318$b5.23...@news3.tin.it...

Quello che ti ho consigliato serve sicuramente a far riferimento in una
query al valore di un campo del record precedente o seguente.
Resta il fatto che potresti anche affrontare e risolvere il problema senza
una query ma registrando i risultati in una tabella temporanea aprendo un
recordset sulla tabella che contiene i dati e scorrendo in sequenza tutti
record del recordset (quindi della tabella) e per ogni record determinare
sia la data e l'ora di inizio (risultato del calcolo del record precedente
che avrai memorizzato in una variabile) e sia la data e l'ora di fine,
memorizzando il tutto in una tabella temporanea, al limite con una query di
accodamento.
Ti resta solo da stabilire come determinerai la data e l'ora del primo
record del recordset, visto che per lui non esiste il record precedente.


 un'altra function il problema si risolve.
 
Come hai scritto questa function?
Come hai scritto nella query la chiamata a questa function per ottenere la data finale da query?
 
Grazie se riesci a recuperare quello che avevi fatto per la tua problematica, che si adatta perfettamente alla mia.
 
Andrea