Calcoli con campi Ora

di il
8 risposte

Calcoli con campi Ora

Salve a tutti,
Una domanda sui calcoli con i campi formato ora:

Premessa, tutti i campi sono all’interno di una maschera, non ho tabelle sotto o query perché il tutto mi serve solo per fare dei semplici calcoli tra ore, senza dover salvare nessun dato.

Allora ho i seguenti campi nella Form_ORARIO (tutti i campi sono formato Ora breve 24h):

Ora_ingresso:– Nome elemento OraE
Ore di presenza :– Nome elemento Ora6 (Predefinito 06:00:00)
Ora_uscita:– Nome elemento OraU

Quindi ho inserito i campi calcolati in automatico:

Ora uscita autorizzata, cioè da quando entro + 6 ore=([OraE])+([Ora6]) e funziona correttamente;

inserisco Ora uscita (OraU), cioè l’uscita reale, e calcolo in automatico:

Tot_Ore_Giornata=([OraE])-([OraU]) e funziona correttamente.

Ora vorrei aggiungere un campo che mi evidenziasse, una volta inserita Ora uscita (OraU), se ho fatto ora/minuti in più o in meno:

il problema è che access esegue una operazione di calcolo e mi dà una differenza ma io non posso sapere se sono in più o in meno (in pratica non viene -1:30 oppure +1:30 ma solo 1:30)

ho provato con i seguenti codici:

Straordinario/Carenza=DateDiff('h';[Ora6];[Tot_Ore_Giornata])

=([oraU])+([ Tot_Ore_Giornata])

Anche invertendo i campi, mettendo +/- il risultato è sempre e solo in valore assoluto.

Allora ho optato per creare due campi separati (straordinario-Carenza) in modo che, scrivo in codice maccheronico….:

if ([oraU]) > ([OraE])
then ([oraU]) - ([OraE])
else
([oraE]) - ([OraU]
 
Problema: Non so scrivere questo codice… J
Grazie

8 Risposte

  • Re: Calcoli con campi Ora

    marsem ha scritto:


    Salve a tutti...
    Problema: Non so scrivere questo codice… J
    Grazie
    Scusa se ho tagliato praticamente tutto quotando. Alcuni spunti di riflessione ed approfondimento: usa DateAdd anche per sommare ed ottenere l'ora di uscita autorizzata.
    DateAdd("h", OraE, Ora6)
    Stessa cosa, con DateDiff, per calcolare il Tot_Ore_Giornata.
    DateDiff dà anche risultati negativi quindi deve funzionare. La cosa un po' strana, probabilmente dovuta al fatto che usi le operazioni aritmetiche classiche (+ e -) anziché le funzioni specifiche per le date, è il risultato "con i rotti", cioè il fatto che DateDiff("h", data1, data2) restituisca "1:30" quando in realtà dovrebba dare solo ore intere. O forse "1:30" deriva proprio da un'operazione aritmetica con le ore, probabilemente non ho capito.
    In ogni caso, per calcolare la differenza usa sempre DateDiff, ragionando in minuti e poi eventualmente "convertirlo" in ore:minuti.
    Per quest'ultima operazione qui dovresti trovare un buono spunto:
    Morale del post (imparata a mia volta a forza di rimproveri virtuali ricevuti): con date/ore usa DateAdd e DateDiff ed adatta la visualizzazione del risultato, se del caso. Evita le operazioni aritmetiche di somma e/o differenza.

    Rifatto tutto come Access comanda, facci sapere se ci sono ancora problemi.
  • Re: Calcoli con campi Ora

    Salve, non ero a conoscenza di DateAdd..
    Riprovo tutto guardando anche il post indicato e vi faccio sapere.
    Grazie!!
  • Re: Calcoli con campi Ora

    Salve, ho provato ad utilizzate i codici DateAdd e DateDiff in una query e non ottengo nessun risultato logico:

    campi: entrata (ora breve 24h) ; uscita (ora breve 24h)

    ecco quello che ottengo inserendo i valori di entrata e uscita:

    Tabella1 Query
    Entrata 07:00 08:00 09:00
    uscita 14:00 14:00 14:00

    Espr2. 00:00. 00:00 00:00

    Espr1. 07:00. 08:00 09:00

    Espr3 07:00. 06:00. 05:00

    Espr4 01:00. 00:00 01:00
    (Non riesco ad inserire nel corpo del mess tabelle o img)

    Espr2: DateDiff('h';[uscita];[entrata])

    …invertendo entrata/uscita non cambia,

    Espr1: DateAdd('h';[uscita];[entrata])… idem come sopra

    Espr3: ([uscita])-([entrata])

    Espr4: (([uscita])-([entrata]))-([orelavoro6])…con campo orelavoro=06:00:00

    Lo stesso accade se invece che usare una query eseguo i calcoli direttamente nella maschera.

    Quindi funziona solo con i calcoli tra campi e formato orabreve24h, l’unico probelma è che non fa differenza tra segni +  e - , ovvero nella espr4 dovrebbe comparire un +01:00 e un – 01:00 mentre per lui sono solo ore.
    Per questo motivo volevo inserire una condizione IF che calcolasse il valore sotto condizione..
  • Re: Calcoli con campi Ora

    marsem ha scritto:


    Salve, ho provato ad utilizzate i codici DateAdd e DateDiff in una query e non ottengo nessun risultato logico...
    Non si capisce molto, a dire il vero. Ad esempio: qusto cos'è?

    marsem ha scritto:


    Tabella1 Query
    Entrata 07:00 08:00 09:00
    uscita 14:00 14:00 14:00
    Invece di scrivere "Espr1" ecc usa un alias un po' più descrittivo.

    marsem ha scritto:


    Espr2. 00:00. 00:00 00:00
    Espr1. 07:00. 08:00 09:00
    Espr3 07:00. 06:00. 05:00
    Espr4 01:00. 00:00 01:00

    Espr2: DateDiff('h';[uscita];[entrata])

    …invertendo entrata/uscita non cambia,

    Espr1: DateAdd('h';[uscita];[entrata])… idem come sopra
    Espr3: ([uscita])-([entrata])
    Espr4: (([uscita])-([entrata]))-([orelavoro6])…con campo orelavoro=06:00:00
    Per le query posta la sintassi SQL (la ottieni con Visualizzazione SQL, invece di Visualizzazione Foglio Dati o Visualizzazione Struttura) usando ovviamente i tag code.

    Se proprio senti la necessità di pubblicare le immagini, in basso, vicino alla scheda Opzioni dovresti vedere la scheda Invia allegato. Altrimenti usa un sito di hosting delle immagini e trascrivi qui il link.

    marsem ha scritto:


    Quindi funziona solo con i calcoli tra campi e formato orabreve24h, l’unico probelma è che non fa differenza tra segni + e -
    Tranquillo che funziona, indica il segno giusto (positivo o negativo), prima però devi impostare bene i calcoli precedenti.

    marsem ha scritto:


    ovvero nella espr4 dovrebbe comparire un +01:00 e un – 01:00 mentre per lui sono solo ore.
    Per questo aspetto ti avevo detto

    Philcattivocarattere ha scritto:


    In ogni caso, per calcolare la differenza usa sempre DateDiff, ragionando in minuti e poi eventualmente "convertirlo" in ore:minuti.
    Per quest'ultima operazione qui dovresti trovare un buono spunto:
    Si usa DateDiff("n",data1,data2)
    Fattibilissimo ma sistema una cosa alla volta, prima.
  • Re: Calcoli con campi Ora

    Forse non si capiva molto perchè appunto avrei voluto postarlo come tabella, cmnq erano i risultati ottenuti per ogni espressione immettendo i valori 07:00, 08:00, 09:00 per il campi entrata.
    In ogni caso alla fine ho risolto con una espressione condizionale IIf...funziona tutto con semplici operazioni tra i campi fomato orabreve24h
    DateDiff e DateAdd mi danno troppi problemi.
    Grazie!!
  • Re: Calcoli con campi Ora

    Philcattivocarattere ha scritto:


    marsem ha scritto:


    Salve, ho provato ad utilizzate i codici DateAdd e DateDiff in una query e non ottengo nessun risultato logico...
    ...
    Fattibilissimo ma sistema una cosa alla volta, prima.
    TabellaOrari
    Campi OraE OraU
    record1 07:00 14:00
    record2 08:00 14:30
    record3 09:00 13:58
    record4 08:30 15:42
    record5 08:00 14:00

    QueryOrario
    SELECT OraE, OraU, 6 AS Orelavoro, DateAdd("h",[OreLavoro],[OraE]) AS UscitaAutorizzata, DateDiff("h",[UscitaAutorizzata],[OraU]) AS Straord_Carenza, DateDiff("n",[UscitaAutorizzata],[OraU]) AS Straord_Carenza_minuti, MinToHours([Straord_Carenza_minuti]) AS InOraMinuti FROM TabellaOrari;
    Funzione presa da ed adattata per non avere il segno negativo sia davanti ai minuti sia davanti alle ore e per non avere alcun segno se l'orario d'uscita corrisponde a quello autorizzato (+0:00 o -0:00 sono orribili)
    Function MinToHours(ByVal minuti As Date) As String
    Dim absMinuti As Integer
    absMinuti = Abs(minuti)
    Dim segno As String
    If minuti > 0 Then
        segno = "+"
        ElseIf minuti < 0 Then
        segno = "-"
        Else
        segno = vbNullString
    End If
    Dim Ore_Minuti As String
    Ore_Minuti = segno & absMinuti \ 60 & Format(absMinuti Mod 60, "\:00")
    MinToHours = Ore_Minuti
    End Function
    Come evidenziato nel sito della funzione, il risultato è una stringa di testo e non si presta ad operazioni di calcolo (che si possono comunque fare sul campo [Straord_carenza_minuti])
    Risultato (ho ristretto le colonne ma la sequenza nei campi della query si vede da SQL)
    Allegati:
    14797_eebd2d6c86c65a331b6eaa632f3666ac.jpg
    14797_eebd2d6c86c65a331b6eaa632f3666ac.jpg
  • Re: Calcoli con campi Ora

    Riproverò per esercizio e ti faccio sapere.
    Grazie
  • Re: Calcoli con campi Ora

    marsem ha scritto:


    Riproverò per esercizio e ti faccio sapere.
    Grazie
    Un ulteriore aspetto da approfondire: DateAdd(interval, number, date)
    che nel caso specifico diventa DateAdd("h", numero, ora)
    Attenzione a come imposti [Ora6] e di conseguenza a come calcoli l'ora autorizzata d'uscita. Se, come sembra dall'inizio del thread, [Ora6] è "06:00:00" che sembra tanto un valore data/ora, DateAdd va in tilt perché stai cercando di sommare due orari e non un intervallo di tempo espresso in numero ad un valore data/ora (cerchi di sommare le 6 della mattina con le 8 della mattina: operazione che non si può fare perché non ha alcun significato). Se non dà errore è perché il programma cerca di ottenere un numero dal dato "06:00:00" e non è detto che lo interpreti come 6.
Devi accedere o registrarti per scrivere nel forum
8 risposte