Chiusura maschera in base all'orario

di il
15 risposte

Chiusura maschera in base all'orario

Buona giornata a tutti, volevo chiedere un consiglio su una sub che dovrebbe servire a chiudere una maschera ed aprire un'altra ad orari stabiliti ma solo se è stato scelto SI da un Msgbox.
Spiego meglio il mio problema. Ho provato a codificare questa sub in questo modo sull'evento Timer:
Private Sub Form_Timer()
    Dim i As String, ora As Variant
    ora = Time
        If ora = #7:00:00 AM# Then
            If ora = #2:00:00 PM# Then
                If ora = #10:00:00 PM# Then
        
        i = MsgBox("L'OPERATORE " & etiOP.Caption & " E' ATTUALMENTE COLLEGATO." & vbCrLf & "SI DESIDERA EFFETTUARE IL LOGOUT?", vbYesNo, "CONTROLLO ACCESSO")
            If i = vbYes Then
            DoCmd.Close acForm, Me.name
            DoCmd.OpenForm "m_operatore"
        Else
        Exit Sub
        End If
        End If
End Sub
Su Intervallo Timer ho messo 1000. Adesso i problemi sono 2.

1° problema) Così com'è codificato non può funzionare perché dato che l'Intervallo Timer effettua un controllo ad ogni secondo e alla variabile "ora" ho scelto che l'orario di confronto con la funzione "Time" deve essere UGUALE a quella scelta da me, chiaramente appena sono le ore 07:00:00 del mattino la sub non si avvia perché trascorre quel secondo. Invece se la modifico inserendo accanto all'uguale il simbolo di maggiore (">"):
 .......................................
 	If ora >= #7:00:00 AM# Then
            If ora >= #2:00:00 PM# Then
                If ora >= #10:00:00 PM# Then
 ..............................................
la sub funziona ma non in modo corretto, perché chiaramente in questo caso tutti gli orari maggiori o uguali alle 07:00, alle 14:00 e alle 22:00 sono validi, invece io devo fare in modo che il confronto lo deve avere solo se gli orari sono UGUALI a quelli prestabiliti.

2° problema) Come spero si capisca, questa sub fa in modo che agli orari prestabiliti compare un Msgbox che mi da due scelte. Adesso, se scegliessi SI una maschera si chiude e un'altra si apre (così com'è indicato). Ma se scegliessi NO, avendo messo 1000 all'Intervallo Timer, ad ogni secondo mi viene riproposto il messaggio. Io invece vorrei che se scegliessi NO allora il messaggio scompaia e al successivo orario prestabilito compaia nuovamente e così via all'infinito.

Spero di essermi spiegato bene e che qualcuno mi possa aiutare.
Grazie.

15 Risposte

  • Re: Chiusura maschera in base all'orario

    Perdonatemi se mi rispondo da solo, ma in questo modo colgo l'occasione sia per chiedere la vostra opinione e sia per dare informazioni utili a chi è interessato a questa discussione.
    Ho provato a modificare il codice in questo modo e sembra funzionare. Chiaramente vanno fatte tutte le prove del caso con una simulazione reale degli orari:
    Private Sub Form_Timer()
        Dim i As String, ora As Variant
        ora = Time
            If ora <> #9:11:00 AM# And ora <> #9:12:00 AM# And ora <> #9:13:00 AM# Then
            Exit Sub
            Else
            i = MsgBox("L'OPERATORE " & etiOP.Caption & " E' ATTUALMENTE COLLEGATO." & vbCrLf & "SI DESIDERA EFFETTUARE IL LOGOUT?", vbYesNo, "CONTROLLO ACCESSO")
                If i = vbYes Then
                    DoCmd.Close acForm, Me.name
                    DoCmd.OpenForm "m_operatore"
                End If
            End If
    End Sub
    Ringrazio comunque coloro che mostrano attenzione alla discussione.
  • Re: Chiusura maschera in base all'orario

    Perchè leggendo il tuo quesito io non ho capito a che ora devi aprire queste Form...?
    Quanti sono gli ORARI da controllare e quali...?
    E se l'hai già aperta nella stessa Ora che devi fare riaprirla...?

    Puoi spiegare con 3 parole cosa devi fare...? e non darci la tua soluzione dicendo che non funziona... questo lo intuiamo...!
  • Re: Chiusura maschera in base all'orario

    L'esempio portato nel secondo post è indicativo. Cioè era una prova che ho fatto a quell'ora. Gli orari reali devono essere 07:00, 14:00 e 22:00.
    Questa maschera si apre dopo che è stato effettuato un accesso con credenziali proprie (username e password). Verso quegli orari avviene il cambio del personale in ufficio e chi smonta dovrebbe effettuare il LogOut ma purtroppo non avviene quasi mai. Allora ho pensato di inserire questa sub per far in modo che all'operatore comparisse il messaggio di effettuare il LogOut qualora non sia lui attualmente quello connesso. In pratica deve essere un messaggio di ricordo.
    Se l'operatore è lui allora sceglie NO e non chiude la maschera, dunque continua a lavorare. Invece se si accorge di non essere lui allora cliccherà su SI e chiuderà la maschera attuale per andare nella maschera dove sceglierà le sue credenziali per poter loggarsi col suo nome.
  • Re: Chiusura maschera in base all'orario

    Ti ricordo che se effettui il cint(Format(Time,"h")) ottieni il numero...!

    Quindi una cosa così non ti piace:
    
    Option Compare Database
    Option Explicit
    
    Private iTurno  As Integer
    
    Private Sub Form_Timer()
        Select Case Hour(Time)
            
            Case Is < 7     ' Alle 7 entri in questo caso
                If iTurno <> 1 Then
                    ' Domanda di LOGOUT
                    iTurno = 1
                End If
            Case Is < 14    ' alle 14 entri in questo
                If iTurno <> 2 Then
                    ' Domanda di LOGOUT
                    iTurno = 2
                End If
            Case Is < 22    ' alle 22 entri in questo
                If iTurno <> 3 Then
                    ' Domanda di LOGOUT
                    iTurno = 3
                End If
        End Select
    
    End Sub
    Attenzione a non invertire l'ordine dei CASE... sono in sequenza giusta...!
  • Re: Chiusura maschera in base all'orario

    Scusa ma non è che ci sono degli errori nel codice che mi hai postato? Cosa serva "Private iTurno As Integer" in alto? Ma poi non vedo "End Select".
    Cosa vuol dire "Ti ricordo che se effettui il cint(Format(Time,"h")) ottieni il numero...!"?

    Ma come ho fatto io non va bene secondo te?
     Dim i As String, ora As Variant
        ora = Time
            If ora <> #7:00:00 AM# And ora <> #2:00:00 PM# And ora <> #10:00 PM# Then
            Exit Sub
            Else
            i = MsgBox("L'OPERATORE " & etiOP.Caption & " E' ATTUALMENTE COLLEGATO." & vbCrLf & "SI DESIDERA EFFETTUARE IL LOGOUT?", vbYesNo, "CONTROLLO ACCESSO")
                If i = vbYes Then
                    DoCmd.Close acForm, Me.name
                    DoCmd.OpenForm "m_operatore"
                End If
            End If
    End Sub
    Ricordo il mio problema:
    a qualsiasi ora del giorno si può effettuare l'accesso a questa maschera. L'accesso è garantito attraverso delle credenziali (username e password). Alle ore 7:00, 14:00 e 22:00 avvengono i cambi dei colleghi che purtroppo a volte dimenticano di eseguire il logout. Dunque in quelle ore specifiche ho bisogno che compaia un messaggio di ricordo. Il messaggio però deve comparire solo in quelle ore esatte e non se l'ora attuale è inferiore o superiore a quella prestabilita.
  • Re: Chiusura maschera in base all'orario

    L'end select era scritto "end sub" era veramente banale vederlo non credi...?
    La variabile dichiarata sopra serve... proprio lì in alto.... e conviene tu ne comprenda anche il motivo oltre che alla particolarità rispetto a dichiararlo nelle sub.

    Se la tua funziona vedi tu..., secondo me no... ricorda che non avrai codice finito e funzionante, quello che ti ho proposto forse è già troppo...
  • Re: Chiusura maschera in base all'orario

    Io ti ringrazio per la tua pazienza ma devi capire che le mie capacità già sono limitate per comprendere come modificare il mio codice, poi capire come adattare quello di un altro è quasi impossibile per me.
    Ho provato ad inserire il tuo, ma mi da sempre il Msgbox qualsiasi sia l'orario e anche se clicco su NO continua ad uscire il messaggio.
    Cioè a questo punto non riesco a capire o sono io che non capisco come adattarlo al mio problema o non sono riuscito a spiegare bene il mio problema. Ma per caso a quel "Private iTurno As Integer" devo aggiungere poi qualcos'altro o deve rimanere lì com'è da solo? Perdonami lo so che non è possibile avere il codice già bello pronto e che quello che mi hai postato è fin troppo, ma arrivato a questo punto non riesco ad andare avanti.

    Non so magari potresti almeno descrivere letteralmente come funziona il tuo codice passo dopo passo, così vedo se è quello che sto cercando?
  • Re: Chiusura maschera in base all'orario

    Perdonami forse ci sono. Se ho fatto giusto dovrebbe funzionare. Ho solo bisogno di un piccolo aiuto. Se ho decifrato bene il codice, viene effettuato un controllo in base al caso. Cioè al caso prima delle ore sette, prima delle ore 14 e prima delle ore 22, allora deve apparire il messaggio altrimenti niente. Adesso il problema è che all'apertura della maschera mi compare subito il messaggio in quanto (sempre se ho capito bene) quasi sempre NON sono le ore né 07, né le ore 14, né le ore 22.
    Volendo effettuare delle prove su orari tipo 15:50, 15:53 e 15:58 come devo modificare il codice? Ci sto provando ma non riesco.
  • Re: Chiusura maschera in base all'orario

    Lavori in corso......
    Credo che ci sono in modo definitivo. Mi dai solo un tuo parere al riguardo? Come ti dicevo, c'era il problema che ogni qual volta viene aperta la maschera, compare il messaggio di LogOut perché tutte le volte che questa maschera viene aperta sono sempre prima delle 7, prima delle 14 e prima delle 22. Ho provato in questo modo e per il momento funziona. Chiaramente bisognerebbe testarlo per 24 ore.
    Private iTurno as integer
    
    Private Sub Form_Timer()
    
    Select Case Hour(Time)
    	Case 1 To 6, 8 To 13, 15 To 21, 23, 24
    		Exit Sub
    	Case 7, 14, 22
    	If iTurno <> 1
    		' mio messaggio di logout
    	iTurno = 1
    	End If            
    End Select
    
    End Sub
    Cosa ne pensi? Ho fatto una simulazione portando indietro l'orologio di 2 minuti rispetto alle 14 (quindi alle 13:58). All'apertura della maschera (quindi alle 13:58) non e apparso niente mentre alle 14:00 è comparto il mio messaggio di LogOut.
    Mi puoi per piacere spiegare a cosa serve iTurno? E perché si mette "If iTurno <> 1" e "iTurno = 1"?

    Grazie
  • Re: Chiusura maschera in base all'orario

    Non funzionerà mai così... come lo avevo scritto io funzionava, così, una volta uscito il messaggio alle 7 poi non uscirà più se non resetti nel caso di Ora diversa dai 3(7-14-22)...

    Provo a venirti incontro con la modifica del tuo...!
    Il codice precedente discriminava il Turno, se non ti serve, lo eliminiamo e semplifichiamo così:
    
    Private blLetto as Boolean
    
    Private Sub Form_Timer()
    
    	Select Case Hour(Time)
    		Case 7, 14, 22
    			If blLetto = False
    				' mio messaggio di logout
    				blLetto = true
    			End If           
    	
    		Case else
    			blLetto=false
    	End Select
    
    End Sub
  • Re: Chiusura maschera in base all'orario

    Non posso fare altro che ringraziarti. Non sarei mai riuscito da solo. Purtroppo cerco di avvicinarmi solo adesso al VBA ma per me risulta ancora troppo complicato. Solo facendo richieste, prove e modifiche posso pian pianino capirci qualcosa. Scusa se sembro insistente ma tutte queste modifiche servono per il database che ho ufficio. Cmq se ho capito bene la variabile blLetto serve a resettare. Peccato che non si possono inserire orari diversi da quelli netti. Nel senso che non si possono inserire orari tipo 7:20, 14:35; 22:45....

    Va be' grazie ancora, ti auguro una buona serata....
  • Re: Chiusura maschera in base all'orario

    Si può fare tutto... intanto cerca di consolidare e fare qualche passo da solo...

    Buon lavoro.
  • Re: Chiusura maschera in base all'orario

    Scusa di nuovo il disturbo, ma non funziona proprio bene....muble muble....Cioè se per esempio arrivano le ore 22:00 e al messaggio di Log Out accetto di uscire dalla maschera, poi quando rientro dopo poco con un altro operatore si ripresenta nuovamente il messaggio. Ovvio perché il controllo lo effettua per tutto l'arco delle ore 22:00. Per questo motivo ritenevo che il controllo venga effettuato solo su orari prestabiliti, in questo caso alle 07:00, alle 14:00 e alle 22:00. Superato quell'istante non ci deve essere più il controllo.
    Mi puoi aiutare per favore?
  • Re: Chiusura maschera in base all'orario

    Allora....ci ho perso tutta la sera. Spero che sia giusto così:
    Private Sub Form_Timer()
       Select Case Time
          Case #7:05:00 AM# To #7:05:03 AM#, #2:05:00 PM# To #2:05:03 PM#, #10:05:00 PM# To #10:05:03 PM#
             If blLetto = False Then
                DoCmd.OpenForm "m_messaggio_logout"
                blLetto = True
             End If
       
          Case Else
             blLetto = False
       End Select
    
    End Sub
    Ho ipotizzato che il collega smontate non abbia effettuato il Log Out della maschera e che 5 minuti dopo viene proposto il messaggio (che ho sostituito con una form più ricca rispetto al semplice Msgbox) al collega montante che provvederà ad effettuare l'eventuale Log Out. Se invece il collega smontante ha effettuato il Log Out prima o all'orario esatto di smonto, il messaggio verrà sempre proposto al collega montante che in questo caso sceglierà di non effettuare il Log Out.
    Ho fatto dei test e tutto va come deve andare. Mi dici per piacere se credi che ci siano cmq degli errori?

    Buona notte....
Devi accedere o registrarti per scrivere nel forum
15 risposte