Una famiglia di sistemi di gestione per database relazionali di Microsoft progettati per semplificare l'uso.
Basta questo:
Me.Filter = Mid(wFiltro, 6)
Me.FilterOn = True
Questo browser non è più supportato.
Esegui l'aggiornamento a Microsoft Edge per sfruttare i vantaggi di funzionalità più recenti, aggiornamenti della sicurezza e supporto tecnico.
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
Una famiglia di sistemi di gestione per database relazionali di Microsoft progettati per semplificare l'uso.
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.
Basta questo:
Me.Filter = Mid(wFiltro, 6)
Me.FilterOn = True
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
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.
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 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
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
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
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
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
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