Access Calcolo differenza orario con ritenuta di 30 min.

Anonimo
2023-03-02T12:12:03+00:00

Buongiorno: Per coloro che mi aiutano Allego il link del db che condivido.

https://www.dropbox.com/s/ergaya5zk7u53vq/Orari2.3.accdb?dl=0

Al Db ho aggiunto un campo "Saldo" Tipo ora 24, nella tbl_Timbrature.

Quello che ho cercato di fare senza riuscirci è stato di creare una funzione IIf.

Mi spiego: se nel campo "giustificativo, o "giustificativo1, o giustificativo2 si trova la scritta "Men" (sta per Mensa) allora il Risultato del campo è il valore del campo Totale meno 30 minuti. Questa è la funzione da me scritta

IIf([giustificativo] or [giustificativo1] or [giustificativo2]="Men";[Totale]-00:30. Ovviamente non funziona. Il risultato può essere anche negativo.

Mi sarebbe gradito se si aggiungesse un campo a pie Maschera che mi dia la somma positiva o negativa della colonna Saldo.

Grazie

Ciao Paolo

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2023-03-23T07:22:33+00:00

Basta questo:

Me.Filter = Mid(wFiltro, 6)

Me.FilterOn = True

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
domenico laurenza 9,900 Punti di reputazione Moderatore volontario
2023-03-22T17:06:22+00:00

Ciao,

nell'evento su caricamento hai il codice

Private Sub Form_Load()

Applica\_Filtri 

End Sub

che quindi esegue subito la Sub Applica_Filtri.

If Len(Me.cboAnagrafica & "") > 0 Then 

   wFiltro = wFiltro & " And Anagrafica\_Id = " & Me.cboAnagrafica 

Else 

   wFiltro = " And 1 = 2" 

End If 

La sub Applica_Filtri per ciascuno dei tre controlli si chiede se è pieno o vuoto utilizzando la funzione Len (lunghezza) concatenando un "" (campo vuoto) per ovviare al fatto che potrebbe essere nullo. Se ha un valore allora imposta la condizione altrimenti imposta una condizione fittizia che non sarà mai soddisfatta (1 non sarà mai uguale a 2). Così facendo per tutti i controlli, anche se solo uno è vuoto il filtro totale non sarà mai soddisfatto quindi l'elenco della form sarà vuoto. Solo se tutti e tre i controlli sono stati digitati allora avrai una condizione valida che potrebbe dare dei risultati.

Utilizzo la variabile wFiltro per cumulare le varie condizioni e alla fine imposto il filtro reale della maschera con

Me.Filter = Mid(wFiltro, 6, Len(wFiltro)) 

Me.FilterOn = True 

dove, con la funzione Mid , vado ad eliminare la parte iniziale della variabile wFiltro che contiene " And ......

Ciao Mimmo

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2023-03-17T23:00:41+00:00

Qui puoi vedere un esempio senza dover usare le funzioni nel Modulo, anche se la gestione dei Giustificativi non si effettua nel modo che hai scelto tu in quanto non è dinamica.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
domenico laurenza 9,900 Punti di reputazione Moderatore volontario
2023-03-17T11:53:22+00:00

Ciao,

in realtà il risultato deve essere -05:46 .

Cambia nel gruppo di istruzioni quella in grassetto (segno meno prima di (wOre * 60) )

 If Left(wTotOreExtra, 1) = "-" Then 

   wOre = Mid(wTotOreExtra, 2, InStr(wTotOreExtra, ":") - 2) 

   wMinuti = Mid(wTotOreExtra, InStr(wTotOreExtra, ":") + 1, 2) 

   **wMinTot = -(wOre \* 60) - wMinuti - (wMensa \* wNumMensa)** 

   wOre = Int(Abs(wMinTot) / 60) 

   wMinuti = wMinTot + wOre \* 60 

Else 

  wOre = Mid(wTotOreExtra, 1, InStr(wTotOreExtra, ":") - 1) 

  wMinuti = Mid(wTotOreExtra, InStr(wTotOreExtra, ":") + 1, 2) 

  wMinTot = (wOre \* 60) + wMinuti - (wMensa \* wNumMensa) 

  wOre = Int(Abs(wMinTot) / 60) 

  wMinuti = wMinTot + wOre \* 60 

End If 

Mimmo

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
domenico laurenza 9,900 Punti di reputazione Moderatore volontario
2023-03-10T11:04:32+00:00

La tua

If [GS] = "Sab" Or [GS] = "Dom" Then [GS] = "#00:00:00#" Else [GS] = #7:12:00 AM#

per avere una sintassi corretta dovrebbe essere del tipo ( resta da studiare il valore da assegnare)

If [GS] = "Sab" Or _

[GS] = "Dom" Then

[OreDovute] = "#00:00:00#"

Else

[OreDovute] = #7:12:00 AM#

Endif

ma non perderci tempo perchè penso sia del tutto superata dalla seguente versione ( da testare )

Questo il Link

Una volta inseriti i tre campi filtri, se la lista è vuota viene abilitata la funzione di creazione delle righe del mese.

Per il controllo GS, ho inserito una "Formattazione condizionale" che evidenzia in rosso se il valore del campo è Sab oppure Dom.

Su una maschera continua non puoi assegnare un attributo ad un controllo perchè varrebbe per tutta la lista, quindi si utilizza la formattazione condizionale.

Ti chiedevo se è opportuno inserire anche le righe dei festivi (Sab e Dom) se non verranno mai impostate, ti risparmieresti in tabella dei records inutili.

Facci sapere

Mimmo

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
domenico laurenza 9,900 Punti di reputazione Moderatore volontario
2023-03-06T10:42:18+00:00

Ciao,

Quando si verifica un errore, entra nel codice per il debug per vedere su quale istruzione si verifica l'errore e fammi sapere quale istruzione ti viene evidenziata. Inoltre puoi vedere il contenuto delle variabili interessate posizionando il mouse sulla singola variabile e forse riesci a capire il problema.

Sono fuori appena rientro parliamo dei filtri.

Mimmo

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
domenico laurenza 9,900 Punti di reputazione Moderatore volontario
2023-03-04T08:12:04+00:00

Ciao Paolo,

Penso che nella tua maschera dovrai aggiungere il filtro dell'anno e del mese per selezionare le timbrature e di conseguenza ne dovrai tener conto anche nelle funzioni.

Mimmo

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
domenico laurenza 9,900 Punti di reputazione Moderatore volontario
2023-03-03T21:09:43+00:00

Ciao Paolo,

aggiungi la seguente funzione nel modulo mod_Calcolo_Ore

Function fTotaleSaldo()

Dim wMensa       As Integer 

Dim wTotOreExtra As String 

Dim wNumMensa    As Integer 

Dim wOre         As Integer 

Dim wMinuti      As Integer 

Dim wMinTot      As Integer 

wMensa = 30 

wTotOreExtra = fTotOreExtra() 

fTotaleSaldo = "" 

' Calcola il numero di records con uno dei giustificativi = "Men" per l'anagrafica selezionata in maschera

wNumMensa = DCount("\*", "tbl\_Timbrature", "Anagrafica\_Id = " & Forms.frm\_Timbrature.Id\_Anagrafica & \_ 

                      " And (Giustificativo = 'Men' Or Giustificativo1 = 'Men' Or Giustificativo2 = 'Men') ") 

If Left(wTotOreExtra, 1) = "-" Then 

   wOre = Mid(wTotOreExtra, 2, 2) 

   wMinuti = Mid(wTotOreExtra, 5, 2) 

Else 

   wOre = Mid(wTotOreExtra, 1, 2) 

   wMinuti = Mid(wTotOreExtra, 4, 2) 

End If 

wMinTot = wOre \* 60 + wMinuti - (wMensa \* wNumMensa) 

wOre = Int(Abs(wMinTot) / 60) 

wMinuti = wMinTot - wOre \* 60 

fTotaleSaldo = IIf(wOre < 0 Or wMinuti < 0, "-", "") & Format(Abs(wOre), "00") & ":" & Format(Abs(wMinuti), "00") 

End Function

Nella maschera dovrai aggiungere la chiamata alla nuova funzione in tutte le routine come di seguito

Option Compare Database

Option Explicit

Private Sub Form_AfterDelConfirm(Status As Integer)

Me.TotOreDovute = fTotOreDovute 

Me.TotOreRese = fTotOreRese 

Me.TotOreExtra = fTotOreExtra 

Me.TotSaldo = fTotaleSaldo() 

End Sub

Private Sub Form_AfterUpdate()

Me.TotOreDovute = fTotOreDovute 

Me.TotOreRese = fTotOreRese 

Me.TotOreExtra = fTotOreExtra 

Me.TotSaldo = fTotaleSaldo() 

End Sub

Private Sub Form_Current()

Me.TotOreDovute = fTotOreDovute 

Me.TotOreRese = fTotOreRese 

Me.TotOreExtra = fTotOreExtra 

Me.TotSaldo = fTotaleSaldo() 

End Sub

Cerca di studiare e capire cosa abbiamo realizzato. Ho cercato di rendere tutto il più comprensibile possibile a costo di essere "prolisso".

Se puoi evita di usare le macro e sforzati di utilizzare il codice Vba ( ne troverai grandi vantaggi in futuro ).

Facci sapere

Ciao Mimmo

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento
Risposta accettata dall'autore della domanda
domenico laurenza 9,900 Punti di reputazione Moderatore volontario
2023-03-03T11:11:34+00:00

Ciao Paolo,

nel controllo Saldo della maschera devi impostare:

=IIf([Giustificativo]="Men" Or [Giustificativo1]="Men" Or [Giustificativo2]="Men";fCalcolaSaldo([Totale]);[ToTale])

In presenza di Men in almeno uno dei tre Giustificativi richiami la seguente funzione fCalcolaSaldo che devi aggiungere nel modulo mod_Calcolo_Ore

Function fCalcolaSaldo(Totale)

Dim wOre     As Integer 

Dim wMinuti  As Integer 

Dim wSaldo   As Integer 

Dim wMensa   As Integer 

wMensa = 30 

fCalcolaSaldo = "" 

If Len(Totale & "") = 0 Then Exit Function 

If Left(Totale, 1) = "-" Then 

   wOre = Mid(Totale, 2, 2) 

   wMinuti = Mid(Totale, 5, 2) 

Else 

   wOre = Mid(Totale, 1, 2) 

   wMinuti = Mid(Totale, 4, 2) 

End If 

wSaldo = wOre \* 60 + wMinuti - wMensa 

wOre = Int(Abs(wSaldo) / 60) 

wMinuti = wSaldo - wOre \* 60 

fCalcolaSaldo = IIf(wOre < 0 Or wMinuti < 0, "-", "") & Format(Abs(wOre), "00") & ":" & Format(Abs(wMinuti), "00") 

End Function

Facci sapere

Mimmo

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

39 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2023-03-03T12:50:27+00:00

    Ciao Mimmo

    Funziona tutto benissimo Grazie

    Solo che nella colonna saldo ho aggiunto un controllo TotSaldo

    che mi deve dare il risultato in positivo o negativo del totale del saldo.

    Penso che bisogni aggiungere qualcosa nel modulo.

    Ciao Paolo

    La risposta è stata utile?

    0 commenti Nessun commento