Access & C.

Ancora su query e report con somme di orari
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

Inserisci un commento   |   Indietro

[1] Nick Name: Leobs2000     Data: 11/02/2016 11:42:29   
Buongiorno, non riesco a trovare il file che ha detto che pubblicherà mascherando i dati personali del sig. Luigi o sono le tre slide all'inizio? Saluti e grazie   

  [da 1 a 1 di 1 commenti]     |   Indietro

Inserisci un commento

Nick: e-mail:

web:

Commento: