Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

calcolare gg lavorativi nelle queries

534 views
Skip to first unread message

Sandro

unread,
Jan 31, 2005, 5:54:08 PM1/31/05
to
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.

Roberto da casa

unread,
Feb 1, 2005, 10:19:15 AM2/1/05
to

"Sandro" <sandro...@tin.it> 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
----------------------------------------------------


Sandro

unread,
Feb 1, 2005, 3:31:25 PM2/1/05
to
[cut]

>
> 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.

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.

Roberto da casa

unread,
Feb 2, 2005, 6:00:26 AM2/2/05
to

"Sandro" <sandro...@tin.it> 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.

Sandro

unread,
Feb 2, 2005, 6:44:18 AM2/2/05
to
[cut]

> 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.

Roberto da casa

unread,
Feb 2, 2005, 9:36:33 AM2/2/05
to

"Sandro" <sandro...@tin.it> ha scritto nel messaggio
news:m23Md.484920$b5.22...@news3.tin.it...

Certamente non potrai più cavartela con una semplice differenza tra date; io
convertirei la durata in minuti (considerando che una giornata lavorativa
contiene 480 minuti, o ancora meglio una mezza giornata lavorativa è
composta da 240 minuti), quindi anche con l'ausilia delle funzioni DateAdd e
DateDiff metti insieme un algoritmo di calcolo che tenga conto delle pause
di lavorazione all'inizio, in mezzo ed alla fine della giornata.
Comunque sono d'accordo con te che è concettualmente più complesso delle
procedure adottate sino ad ora.

>
> Grazie, ciao.

Sandro

unread,
Feb 2, 2005, 5:12:09 PM2/2/05
to

[cut]

> Certamente non potrai più cavartela con una semplice differenza tra date;
io
> convertirei la durata in minuti (considerando che una giornata lavorativa
> contiene 480 minuti, o ancora meglio una mezza giornata lavorativa è
> composta da 240 minuti), quindi anche con l'ausilia delle funzioni DateAdd
e
> DateDiff metti insieme un algoritmo di calcolo che tenga conto delle pause
> di lavorazione all'inizio, in mezzo ed alla fine della giornata.
> Comunque sono d'accordo con te che è concettualmente più complesso delle
> 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!


Roberto da casa

unread,
Feb 3, 2005, 1:03:52 PM2/3/05
to

"Sandro" <sandro...@tin.it> 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.

Sandro

unread,
Feb 3, 2005, 1:59:48 PM2/3/05
to

"Roberto da casa" <r.masso...@libero.it> 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.


Roberto da casa

unread,
Feb 4, 2005, 2:04:30 PM2/4/05
to

"Sandro" <sandro...@tin.it> 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.

Andrea Pettenon

unread,
Mar 1, 2020, 10:15:31 AM3/1/20
to
Il giorno martedì 1 febbraio 2005 21:31:25 UTC+1, Sandro ha scritto:
> [cut]
> >
> > 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.
>
> Devo dire che non ci sarei arrivato. Grazie.Effettivamente creando
> 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
Message has been deleted
0 new messages