Newsgroup: it.comp.appl.access
Titolo: come calcolare le ore lavorate con inizio il lunedi e fine il martedi ?

salve ragazzi ho bisogno di aiuto...(come sempre ) :-)
sto creando un database per la gestione dei volontari di croce rossa ed ho 
la necessita di calcolare quante ore effettua ogni volontario
Il database e gia a buon punto ( almeno una bozza) la mia domanda e questa :
ho i eguenti campi:
NOME
ORA INIZIO
ORA FINE
TOTALE ORE
vorrei sapere come calcolare le ore effettuate perche con tutte le prove che 
ho fatto io non mi esce il risultato da me voluto
Il problema principale e che L'inio avviene la sera alle 19 e la fine del 
turno avviene il giorno successivo alle ore 06 del mattino
per esempio
INIZIO 1/1/07 ALLE ORE 19.00
FINE     2/1/07 ALLE ORE 06.00
spero di essere stato chiaro
grazie a tutti
ciao
p.s. posso anche aggiungere campi tipo data se servono

 turno avviene il giorno successivo alle ore 06 del mattino
Utilizza dei campi data/ora per la memorizzazione delle ore.
Formatta i controlli relativi come "ora breve 24 ore".
Utilizza la funzione DateDiff che può restituire il risultato espresso in 
ore.
--
PBsoft di Gabriele Bertolucci
www.pbsoft.it
skype:pbsoftsolution


ok fin qui ci sono avevo formatatto il campo ora inizio ed ora fine in 
(orabreve 24 ore) pero non so come impostare la funzione DateDiff
grazie

 Utilizza la funzione DateDiff che può restituire il risultato espresso in
non credo sarà sufficiente. Nei campi così formattati è necessario input_are 
la da e l'ora completi ed è una noia.
io ho risolto creando un  campo data a parte che mi indichi solo il giorno 
del turno e poi un campo entrata e uno uscita (formato numerico con 2 
decimali) e fatto ricorso a VBA per i calcoli che riassumo brevemente:
1 separare le ore dai minuti
2 trasformare le ore in minuti
3 aggiungere i minuti del punto 2 ai minuti del punto 1
4 fare lo stesso per le ore in uscita
5 effettuare una verifica se ora uscita minore di ora entrata allora 
aggiungere 1440 minuti
6. effettuare la differenza fra i minuti di uscita e quelli di entrata
7 riconvertire i minuti ottenuti in ore minuti
Buon lavoro
NSAntini 

 ha scritto nel messaggio 
news:fbbov1$unm$1...@registered.motzarella.org...

e come faccio tutti i passaggi dal puno 1 al punto 7 ?

 ha scritto nel
messaggio news:aWcCi.100388$%k.24...@twister2.libero.it...

A mio avviso c'è un errore di fondo nella struttura tabellare...!
Per lo stesso giorno e per lo stesso Dipendente normalmente si prevedono
almeno 2 Ingressi e 2 Uscite
INGRESSO 8:00     USCITA 12:00    INGRESSO 13:00    USCITA 17:00
Questa è la normalità in questo modo in base alla tipologia di contratto ed
alla categoria del dipendente si
fissano gli orari elastici piuttosto che flessibili e si verifica se quel
determinato dipendente deve recuperare
o giustificare eventuali spostamenti di orario...!
Cosa un pò più complessa sono i lavoratori in Turno per i quali viene
definito l'orario continuato che ricade a cavallo di 2gg in caso del turno
di notte....!
Come hai strutturato tu non sarai mai capace di fare un lavoro fatto in modo
pulito....
-- 
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.sitocomune.com/
http://www.alessandrobaraldi.it
---------------------------------------------------------------------------

 (orabreve 24 ore) pero non so come impostare la funzione DateDiff
Per capire come utilizzare la funzione DateDiff basta guardare la guida del 
VBA.
Qualcosa non ti è chiaro?


 Buon lavoro
Concordo soprattuto sul "buon lavoro", vista la complessità della tua soluzione.


 ha scritto nel messaggio 
news:fbc5ak$h58$2...@aioe.org...

Ti ringrazio per le spiegazioni pero il mio database serve per i turni dei 
VOLONTARI e non per i lavoratori e principalmente i turni sono di notte con 
inizio alle 19.30 e termine alle ore 06.00 del giorno successivo quindi non 
ci sono pause pranzo o cose simili e neanche ore di recupero o ferie da 
gestire o spostamenti di orari.
Il database deve solo registrare le ore di turno che effettua ogni 
volontario  ( un volontario puo ricoprire qualsiasi turno sia diurno che 
notturno o festivo ma sempre con unico inizio ed unica fine
spero di essere stato chiaro , comunque accetto volentieri  consigli o 
opinioni diverse


 a me da errore forse sbaglio qualcosa....
ho il campo ORA INIZIO ed il campo ORA FINE nel campo TOTALE ORE  dovrfebbe 
apparirmi le ore lavorate giusto ?
Nell'origine controllo del campo TOTALE ORE scrivo questa formula
=DateDiff("n";[ora inizio];[ora fine])/60
pero e inserisco l'inizio e la fine nello stesso giono tutto funzioan bene 
se inserisco l'inizi alle ore 19.00 e la fine alle ore 06.00 ( sarebbe la 
mattina dopo ) mi da come risultato -13 lo stesso se inserisco l'inizio alle 
ore 23.00 e la fine alle ore 02.00 ( quindo dopo la mezzanotte) mi da - 21
campo ORA INIZIO formattato come ora breve 24
campo ORA FINE    formattato come ora breve 24
campo TOTALE ORE formattato come numerico intero
prova e fammi sapere gentilmente se preferisci inviarmi qualche bozza di 
esempio te ne sarei grato
cia
o e grazie

Scusate se provo a dare un idea, ma da pivellino di access forse tendo
a vedere le cose nella maniera da pivello appunto (vedi troppo
semplificate) e quindi forse dico una fesseria.
premesso questo prova a formattare i campi orainizio e orafine della
tabella in ora generica e inserisci i dati in questa maniera:
28/08/07 21:00
29/08/07 06:00
dopodichè nella query crei il campo calcolato seguente:
OreLavorate:(orafine-orainizio)
formattato come ora breve 24h.
funziona?
sarà il male di inserire i dati aggiungendo la data prima dell'ora, ma
ti eviti fnzioni un po più complesse.
ciao.

 ha scritto nel 
messaggio news:FRdCi.102737$U01.8...@twister1.libero.it...

Da VBA a fronte dell'evento "Su uscita" dal controllo dhe contiene l'ora di 
uscita. In pratica dopo aver inserito l'ora di uscita e premuto invio o tab 
si genera l'evento "Su uscita" che va ad eseguire il codice che andrai a 
mettere nella sub nomecontrollo_lostfocus.
Oppure un'altra soluzione che ti tolga dall'impiccio di eseguire tutti i 
calcoli di conversione è quello di usa l'ora con un solo decimale. Mi spiego
Poiché Access non è in grado di sommare 3,40+ 4,33 perché ti dà 7,73 anziché 
8,13 potresti ridurre l'ora in decimi cioè un decimo di ora = 6 minuti 
quindi 3,23  diventerebbe 3,4  (cioè 4/10 di ora quindi 6minuti x 4 = 24 
minuti). Non è preciso al minuto ma almeno eviti mille passaggi e comunque 
vedrai che alla fine tra quando arrotondi con qualche minutio in più e tra 
quando con un minuto in meno i conti alla fine tornano.
NSantini

 ha scritto nel 
messaggio news:aWcCi.100388$%k.24...@twister2.libero.it...

Io comincerei con normalizzare il database e per prima cosa rispetterei una 
delle regole fondamentali dei database relazionali come Access che dice di 
evitare di memorizzare nelle tabelle i campi calcolati e quindi eliminerei 
dalla tabella il campo TOTALE ORE il cui valore lo determinerai in "tempo 
reale" in queries, maschere o report tutte le volte che ti serve 
visualizzare la durata di un turno di servizio.
Ritengo poi necessario inserire un campo che rappresenti la chiave primaria 
visto che non hai altrimenti la possibilità di rendere i record univoci in 
quanto, mancando un campo che porti la data è possibile che per lo stesso 
volontario esistano in tabella più record con lo stesso orario di inizio e 
fine turno.
Credo che sia anche necessario inserire un campo che contenga la data di 
inzio turno, in caso contrario non saresti mai in grado di sapere a quale 
giorno un record si riferisce.
La normalizzazione del database vorrebbe poi che tu creassi una tabella dei 
volontari e che nella tabella dei turni prestati inserissi la chiave 
primaria di tale tabella e non il nome e cognome del volontario.
Ti sconsiglio poi caldamente di assegnare NOME come nome di un campo (susa 
il bisticcio di parole), in caso contrario potresti avere qualche brutta 
sorpresa con il generatore di espressioni che nella versione italiana di 
Access potrebbe considerare NOME come parola riservata.
Infine evita di usare nomi composti da più di una parola così da 
semplificarti la vita sia nello scrivere codice VBA che codice SQL.
Ciò premesso a mio parere, se i turni di servizio NON superano MAI le 24 
ore, le strutture delle due tabelle di cui sopra dovrebbero essere le 
seguenti:
TblVolontari
------------------
IdVolontario            Contatore e chiave primaria
CognomeNome     Testo
ecc. ecc.
TblTurniPrestati
---------------------
IdTurnoPrestato        Contatore e chiave primaria
IdVolontario               Numerico
DataInizio                   Data/ora
OraInizio                     Data/ora
OraFine                      Data/ora
Se invece i turni di servizio possono superare le 24 ore sarà necessario 
inserire, oltre la data di inizio, anche un campo con la data di fine turno, 
oppure eliminare il campo DataInizio e nel campo OraInizio digitare sia la 
data che l'ora di inizio turno e nel campo di OraFine digitare sia la data 
che l'orario di fine turno. Comunque nel proseguo del mio ragionamento 
considererò che il turno non possa superare MAI le 24 ore e quindi 
considererò che TblTurniPrestati abbia la struttura di cui sopra: ne 
consegue che se OraFine è minore di OraInizio significa che il turno ha 
avuto fine il giorno successico alla data in cui è iniziato.
A questo punto per risolvere il problema di turni a cavallo di due date è 
bene ricordare che in Access i campi di tipo Data/ora non sono altro che 
campi numerici per i quali la parte intera rappresenta la data e la parte 
decimale reppresenta l'orario: per i campi che contengono solo orario la 
parte intera (quindi la data) ha valore 0 (zero); fermo restando che la 
durata del turno prestato verrà comunque calcolata sottraendo OraInizio a 
OraFine, prima di fare la differenza occorre sommare 1 a OraFine nel caso 
che il suo valore risulti minore di quello di OraInizio, così che Access 
capisce che quell'orario è relativo al giorno successivo a quello di 
OraInizio.
Dopo tutte queste mie chiacchiere, che mi auguro siano state almeno chiare, 
qui di seguito ti indico il codice SQL di una query basata su 
TblTurniPrestati nella quale ho inserito anche il campo calcolato chiamato 
TitaleOre dove verranno visualizzati le ore ed i minuti della durata del 
turno:
SELECT TblTurniPrestati.*, 
CDate(IIf([OraFine]<[OraInizio],([OraFine]+1)-[Orainizio],[OraFine]-[OraInizio])) 
AS TotaleOre
FROM TblTurniPrestati;
Non ho usato per la differenza la funzione DateDiff in quanto il presupposto 
era quello che il risultato fosse espresso in ore e minuti e non solo in ore 
o solo in minuti.
Naturalmente la struttura del calcolo di TotaleOre non cambia se dovevi 
realizzarlo nell'origine controllo di una casella di testo calcolata in una 
maschera o in un report.
Un po' lunga ma spero che serva a risolverti il problema.
-- 
Roberto
-----------------------------------------------
il Sito Comune di it.comp.appl.access
http://www.sitocomune.com
-----------------------------------------------

 ha scritto nel 
messaggio news:DajCi.100669$%k.24...@twister2.libero.it...

http://www.donkarl.com/it/FAQ/FAQ2Generale.htm#2.10
-- 
Ciao
Access 

grazie
la struttura del database era gia impostata con il campo ID e la 
memorizzazione del totale ore non avveniva in tabella ma solo calcolato in 
una query
per semplificare le cose e capire solo il passaggio da fare avevo sctitto 
l'essenziale  :-)
per ora ho risolto cosi:
TABELLA ORARI:
IDservizio
IDvolontario    ( Campo in relazione con la tabella Volontari )
inizio turno       ( Campo formattato come data generica )
fine turno         ( Campo formattato come data generica )
tot ore             ( mi serve solo per vedere se il calcolo è esatto )
Nella maschera di inserimento scrivo la data e l'ora di inizio e fine turno 
e poi calcolo il campo TOT ORE con il seguente controllo
=DateDiff("n";[inizio turno];[fine turno])/60
Sembra che tutto funzioni quindi credo che usero questo metodo anche se un 
po complicato da inseire.
P.S: non riesco a fare una maschera di imput sul campo INIZIO TURNO  e FINE 
TURNO mi fa inserire solo la data o solo l'ora c'e una soluzione per 
inserire entrambi ?Vorrei una maschera tipo 00/00/0000 00.00  e cioe 
(01/01/2007 19.30)
Grazie

 Grazie
Prego


 semplicemente richiamando una funzione intrinseca di Access.
Non so come scrivere la funzione e poi come richiamarla


 dopo la mezzanotte) mi da - 21
Il problema ti nasce dal fatto che un campo formattato come "ora breve 24h", 
come parte data di default, prende "sabato 30 dicembre 1899", quindi è normale 
che la differenza di ore, nel tuo caso, sia negativa.
Devi, in qualche modo, utilizzare anche una componente di data nella differenza.


> 
http://www.donkarl.com/it/FAQ/FAQ2Generale.htm#2.10
La faq č sempre interessante, ma il problema che era stato evidenziato, piů 
che la differenza di ore maggiore a 24, riguarda lo scavallamento di data.
Il problema non č stato gestito in quanto viene sempre utilizzata la componente 
data di default: sabato 30 dicembre 1899.


 ti eviti fnzioni un po piy complesse.
In effetti la soluzione deve passare necessariamente per la considerazione 
di una componente di data.


 Non so come scrivere la funzione e poi come richiamarla
Devi sriverla pari-pari come hai fatto qui sopra nella maschera nell'origine 
di controllo della casella di testo non associata in cui vuoi visualizzare 
il risultato della differenza: d'altra parte mi sembra di capire che il 
campo TotaleOre in tabella non deve esserci.
Se poi insisti nel volere registrare il risultato in un campo della tabella 
chiamato TotaleOre (ma te lo sconsiglio nel modo più assoluto) a fronte 
dell'evento "Prima di aggiornare" della maschera genera la seguente riga di 
codice VBA:
Me!TotaleOre = DateDiff("n", [inizio turno], [fine turno])/60
Con questa soluzione naturalmente il campo TotaleOre deve essere numerico in 
doppia precisione e conterrà la differenza espressa in ore e centesimi di 
ore; Se poi vuoi la differenza espressa in ore e minuti il campo dovrà 
essere di tipo Data/Ora e dovrai sviluppare la formula che ti ho indicato 
io.
[CUT]


 ha scritto nel messaggio 
news:u_WCi.104251$U01.8...@twister1.libero.it...

grazie