Grazie, e pensate ai poveri camionisti.
Eugenio Gotti
hehehe, caro eugenio,
ti sei impelagato in un problema (mi riferisco alla gestione degli orari)
che ti creera' non pochi grattacapi.
Ad ogni modo, in questo momento non ho il tempo di dedicarmi a darti una
risposta completa, ma sicuramente non puoi gestire questi calcoli in una
query. Devi aggiungere dei campi dove inserire i risultati dei calcoli che
farai da codice.
Sib
Ipotizziamo che che nella tua tabella (chiamata Tabella1) ci sia un campo
Data/ora che contenga sia la data che l'orario di inizio del trasporto (
ovvero con formato gg/mm/aaa hh:mm) che si chiama Inizio.
Ipotizziamo che che nella tua tabella ci sia un campo Data/ora che contenga
sia la data che l'orario di fine del trasporto ( ovvero con formato
gg/mm/aaa hh:mm) che si chiama Fine.
Diamo per scontato che tu ti sia già calcolato le ore complessive di lavoro.
La query che ti restituisce in un campo chiamato OreNotturne le sole ore da
retribuire con la maggiorazione notturna nella forma ore e centesimi di ora
(ovvero 10 ore e mezza = 10,5), ha il seguente codice SQL:
SELECT Tabella1.*,
IIf(([Inizio]-Int([Inizio]))>=7/24,0,IIf([Fine]<(Int([Inizio])+7/24),[Fine]-
[Inizio],(Int([Inizio])+7/24)-[Inizio])) AS MP,
IIf(Int([Inizio])=Int([Fine]),IIf(([Fine]-Int([Fine]))<21/24,0,([Fine]-Int([
Fine]))-21/24),IIf(([Inizio]-Int([Inizio]))<21/24,3/24,1-([Inizio]-Int([Iniz
io])))) AS SP,
IIf(Int([Inizio])=Int([Fine]),0,IIf(([Fine]-Int([Fine]))>7/24,7/24,[Fine]-In
t([Fine]))) AS MA,
IIf(Int([Inizio])=Int([Fine]),0,IIf(([Fine]-Int([Fine]))<21/24,0,([Fine]-Int
([Fine]))-21/24)) AS SA,
([MP]+[SP]+[MA]+[SA]+IIf((Int([Fine])-Int([Inizio]))<=1,0,((Int([Fine])-Int(
[Inizio]))-1)*(10/24)))*24 AS OreNotturne
FROM Tabella1;
Il calcolo prevede che il viaggio possa durare più di 24 ore.
Se funziona non lo dire a Gauss. ;-)
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------
Si puņ, si puņ. Con una query si puņ!! ;-))
Ciao, Roberto.
Sì, devo dire che se posso cerco di evitare tali problemi, ma non è il primo
e purtroppo non sarà l'ultimo caso...
Grazie comunque per l'incoraggiamento.
Eugenio
Non ho detto che non si puo', ma non si puo' chiedere a un responsabile del
personale di aspettare da 30 a 60 minuti le totalizzazioni ogni volta che
vuole visualizzare le ore lavorate dai dipendenti.
Tempo fa ho installato un sistema di rilevazione presenze in una azienda di
Palermo con 2 sedi (a Palermo) con 270 dipendenti con orari impossibili.
Ti posso assicurare che proporgli una query li avrebbe resi molto nervosi.
Ciao, Sib
--
----------------------------------------------------
la mia home:
http://digilander.iol.it/syb
----------------------------------------------------
il sito comune di it.comp.database.access:
http://www.sitocomune.com
----------------------------------------------------
4000 anni fa', il saggio egizio Ptahhotep scrisse:
"... perche' non esistono saggi per nascita."
------------------------------------------------------
Saturiamo ECHELON:
bomba saddam attentato medio oriente
Sei sicuro che un computo fatto solamente con le 4 operazioni matematiche
(+ - * /) sia meno performante in una query anzichè in un codice VBA; si
insomma, che a+b scritto con codice SQL sia meno veloce di a+b scritto con
codice VBA?
Io ho i miei dubbi. ;-)
Ho aperto la query che ho consigliato ad Eugenio su una tabella che
conteneva 9000 record (che sono l'equivalente delle timbrature per un mese
di 346 dipendenti), ed Access ha impiegato una frazione di secondo e non 60
minuti. Provare per credere. ;-)
Non conosco la complessità della query cui hai dovuto rinunciare, ma per
quella di cui stiamo discutendo sono strasicuro che i tempi di calcolo sono
trascurabilissimi, quindi il problema non sussiste.
Ciao, Roberto
Premesso che e' sempre piacevole "battagliare" con te, ;-)
Prima di tutto non intendevo dire che da codice si fa prima, intendevo dire
che il calcolo va fatto una volta e memorizzato in una tabella. Che poi si
possa studiare il modo di farlo con una query di accodamento e' un altro
discorso, ma ho i miei dubbi che possa venire piu' facile fare questa query
che non gestire le condizioni via codice.
Inoltre, come dicevi tu, dipende molto dai calcoli che devi fare.
Infatti un ufficio del personale, per prima cosa, totalizza ogni mese, il
che moltiplica almeno per 20 il numero dei calcoli da fare. Poi bisogna
confrontare l'orario effettivamente svolto con quello che il dipendente
avrebbe dovuto svolgere calcolando:
Ritardi
Straordinari diurni cin le varie percentuali
Straordinari notturni
Straordinari festivi
Permessi
Malattie
ecc, ecc...
Il tutto suddiviso, causale per causale, giorno per giorno.
Non sono convinto che sia sufficiente una frazione di sencondo. Fermo
restando che la query faccia tutti questy calcoli suddivisi causale per
causale.
Ancora non abbiamo parlato della gestione dei turni che iniziano un giorno e
finiscono il successivo, ma questo e' un altro discorso.
Ciao, Sib
Anche per me č molto stimolante confrontarmi con te. ;-)
Devo ammettere che quella query l'ho fatta quasi come una piccola "sfida",
quando mi sembrava di aver capito che tu dicessi che con una query non si
potesse fare.
> Prima di tutto non intendevo dire che da codice si fa prima, intendevo
dire
> che il calcolo va fatto una volta e memorizzato in una tabella. Che poi si
> possa studiare il modo di farlo con una query di accodamento e' un altro
> discorso, ma ho i miei dubbi che possa venire piu' facile fare questa
query
> che non gestire le condizioni via codice.
Ammetto che sarebbe stato molto piů facile scrivere del codice VBA; ma un pň
la richiesta di Eugenio e un pň che ormai era diventato un punto di
impegno....
> Inoltre, come dicevi tu, dipende molto dai calcoli che devi fare.
Certo che si.
> Infatti un ufficio del personale, per prima cosa, totalizza ogni mese, il
> che moltiplica almeno per 20 il numero dei calcoli da fare. Poi bisogna
> confrontare l'orario effettivamente svolto con quello che il dipendente
> avrebbe dovuto svolgere calcolando:
> Ritardi
> Straordinari diurni cin le varie percentuali
> Straordinari notturni
> Straordinari festivi
> Permessi
> Malattie
> ecc, ecc...
> Il tutto suddiviso, causale per causale, giorno per giorno.
Certo una procedura di paghe e stipendi non si esaurisce con la
determinazione delle ore lavorate e delle ore lavorate in un determinato
turno. Inoltre le rilevazioni statistiche postcedolino consigliano la
memorizione di calcoli intermedi. Certo le decisioni di come organizzare il
processo possono scaturire solo da una valutazione complessiva di tutte le
informazioni che devono essere fornite dalla procedura nel suo insieme.
> Non sono convinto che sia sufficiente una frazione di sencondo.
Le mie affermazioni riguardano solo i tempi di esecuzione di quella quella
query,
> Fermo
> restando che la query faccia tutti questy calcoli suddivisi causale per
> causale.
> Ancora non abbiamo parlato della gestione dei turni che iniziano un giorno
e
> finiscono il successivo, ma questo e' un altro discorso.
>
Onestamente il computo della mia query tiene conto di questo aspetto: il
turno notturno puň cominciare alle 21:00 di un giorno e finire alle 7:00 del
giorno successivo. Nel mondo dei quotidiani, questa č una norma; molti degli
addetti ai centri stampa ed alle tipografie iniziano a lavorare un giorno e
finiscono di lavorare il giorno successivo; quanto alla coloritura del turno
ordinario, le variabili sono molte e complesse, specie se c'č anche del
lavoro straordinario che puň essere effettuato in testa, in coda o staccato
dall'orario ordinario.
> Ciao, Sib
>
Ciao ed alla prossima interessante discussione.
Roberto
E' evidente che questo e' un argomento su cui entrambi ci siamo scornati ;-)
Ciao, Sib
PS (Nel senso che ce ne siamo occupati con un certo impegno)