ArticoloSuDateOreETC
Ancora su date ed orari
In questo articolo approfondisco il problema illustrato nel mio
precedente articolo del 30/08/2007 (sono già passati tre anni, sigh!): la somma
di orari con l'operatore SUM() in una query SQL di access.
Luigi (nome cambiato per questioni di privacy) mi scrive che non
riesce ad applicare la mia soluzione ad un suo report. In pratica Luigi ha
una tabella con un attributo che indica il numero, le ore ed i minuti di straordinario di un dato dipendente in un turno di
lavoro. Il report deve indicare il "monte ore" di straordinari accumulato dal
dipendente.
Luigi non riusciva ad applicare la soluzione suggerita nel precedente
articolo perchè non è stato attento: per scrivere 1 ora e 40 minuti ha immesso
nel campo della sua tabella il numero 1,40. Ma l'operatore SUM() esegue una
somma tra decimali, quindi Access interpreta 1,40 in decimale non in
sessantesimi. Dunque avrebbe dovuto scrivere 80 per esprimere il tempo in
minuti, oppure 1,66 per esprimere il tempo in ore, oppure, cosa che gli ho suggerito, di cambiare il tipo di dato in Data/Ora.
In questo caso SUM() opera ancora sui decimali ma Access esegue
correttamente ed adeguatamente la conversione del tipo Data/ora nell'equivalente
numerico.
Solo con questo accorgimento si può applicare la formula in modo
corretto, utilizzando nel report dei campi nascosti (in verde) contenenti i
valori decimali che, trasformati in stringa,vengono inseriti nei campi visibili.
Questo è il risultato:
Bene.
Segue lo scambio epistolare tra me e Luigi.
Ciao.
Domanda 1
Salve, da qualche mese uso
Access per creare dei piccoli database, che servono per il mio lavoro. Sto
combattendo da qualche settimana a sommare in report ore minuti, con
scarsi risulati. Cercando in rete ho notato il tuo sito, ho applicato
quello che hai scritto sul mio programmino, però non c'è stato nulla da fare. Le
formule da me scritte non funzionano.
Se cortesemente
possiamo metterci in contatto per risolvere quello che per me è un problema
irrisolvibile.
Saluti
Risposta 1
Carissimo Sig. Luigi,
gli esempi sul mio blog fanno riferimento a problemi reali risolti
positivamente: le formule, di questo sono certo, funzionano.
Il problema, quindi, è come "adattare" una soluzione valida per un
dato problema ad un altro.
Se vogliamo risolvere anche il Suo problema, deve spiegarmelo come
meglio può. Le premetto che tutti i problemi
riguardanti operazioni
su date e orari sono piuttosto spinosi.
Come ulteriore doverosa precisazione devo avvisarLa che io questo
servizio GRATUITO di consulenza lo svolgo nel tempo libero, che è poco: le
mie risposte potrebbero non essere veloci. Oltre a ciò, come avrà già
compreso, il "pegno" da pagare è quello della pubblicazione di un articolo
sul mio blog riguardante il Suo problema, che è interessante e piuttosto
ricorrente. Stia tranquillo, io mantengo SEMPRE l'anonimato di chi mi
contatta.
Ciò detto, se accetta, attendo Sue notizie.
Domanda 2
Le invio il data base da me costruito con il
report incriminato. La somma delle ore risulta errata, infatti 1,40 + 1,40 non
dovrebbe dare 2,80 bensì 3,20 idem per 1,30 + 1,30 =
3,00.
Ho inserito la formula:
=Fix(([SommaDin ore])*24) &
"." & Fix((([SommaDin ore]*24)-Fix([SommaDin ore]*24))*60), ma il risultato
non è quello sperato.
Infine non ho nessun problema per
la pubblicazione per l'articolo sul blog.
Risposta 2
Carissimo Sig. Luigi,
la mia query vale solo nel caso in cui le colonne da sommare con
l'operatore SUM() di SQL siano di tipo Data, le sue invece sono di tipo Numerico
(vedi il tipo del campo n_ore). In questi casi SUM restituisce la somma decimale
pura e semplice e quindi 1,30 + 1,30 = 2,60.
In decimale 1,30 non significa un'ora e mezza, significa un'ora e 3
decimi di ora ovvero un'ora e 18 minuti.
Attenzione, quindi, quando lavoriamo con le date e le ore.
Distinti Saluti.
Domanda 3
Ho sostituito il formato delle colonne da
quello numerico a quello Data/ora - Ora breve 24h, ma il risultato non cambia.
Dove continuo a sbagliare?
Saluti
Risposta 3
Carissimo Sig. Luigi.
A me il report funziona.
Allora:
1) Non influenza il calcolo: oltre a convertire il tipo del dato n_ore
ho convertito anche il formato delle caselle di testo delle maschere e dei
report (formato ora estesa);
2) Come ho detto da qualche parte nel mio articolo, SI PUO'
OTTENERE UNA VISUALIZZAZIONE HHH:MM (cioe' oltre le 24 ore) RINUNCIANDO AD UN
RISULTATO DI TIPO DATA/ORARIO PER UNO DI TIPO STRINGA. Di conseguenza non si
possono più effettuare i calcoli con questi dati trasformati. Conviene, quindi,
mantenere nei report doppi dati: quelli in formato HHH:MM per la
rappresentazione, e quelli in formato DECIMALE per i calcoli.
Quindi prima faccio i calcoli sul decimale (es. Somma(n_ore)) e poi
eseguo le trasformazioni in stringa per la rappresentazione che usano Cstr(),
Fix() e Round() (es. Cstr(Fix(Somma(n_ore) * 24)). ).
Ovviamente nei report e nelle maschere possiamo omettere la
funzione di conversione Cstr() perchè tale conversione viene fatta
automaticamente.
3) Attenzione: la sua query di aggregazione è scorretta perchè non
aggrega. Lei non se ne è accorto (e l'applicazione funziona ugualmente) perchè
le aggregazioni le fa comunque il report: sebbene i risultati siano corretti,
con molti dati le prestazioni potrebbero degradare.
In allegato Le invio il file con le correzioni. Nel report (è lì che si
gioca la partita) ho mantenuto i doppi dati: le caselle di testo con gli orari
in formato decimale sono di colore verde quando il report è in
struttura ma non sono visibili quando il report è in visualizzazione. Ho
anche stressato gli orari in modo che la somma delle ore superi 24.
Prima di salutarLa La informo che scriverò un articolo sul suo caso
(perchè importante ed interessante). Pubblicherò anche il file che ho
modificato, ovviamente mascherando i dati "personali" e quelli più
importanti. Se ha qualcosa in contrario me lo dica esplicitamente.
Distinti Saluti
Domanda 4
La ringrazio infinitamente, non ho nulla in
contrario per la pubblicazione del suo articolo, anzi, tutto quello che sono
riuscito a fare fino ad adesso è grazie ai forum e a quello che riesco a trovare
su internet. (Oltre a qualche libro).
Nel ringraziarla nuovamente le chiedo se può
rispedirmi nuovamente il file non con estensione rar, non riesco ad
aprirlo.
This Web Page Created by Michele de Nittis (C) with PageBreeze Free HTML
Editor