Cronometrare l'utilizzo di un database access

di il
6 risposte

Cronometrare l'utilizzo di un database access

Ho fatto un database in Access 2016 di time tracking di supporto al controllo di gestione, decisamente funzionale per le esigenze aziendali, solo che una obiezione che mi è stata rivolta è che sarebbe troppo oneroso inserire la sequenza di attività mano mano che si fanno, e quindi che non varrebbe la pena adoperarlo su larga scala.
Io ho la sensazione che non sia così affatto, ma per dimostrarlo voglio computare al secondo il tempo in cui sto sull'applicazione durante la giornata (per me soggettivamente non più di un 7-8 minuti, ma voglio dimostrarlo), e per applicazione intendo il database con l'uso di tutti i suoi oggetti, query, tabelle, non solo della maschera dove avviene l'inserimento delle attività (anche se è l'oggetto access usato di più). In altre parole voglio monitorare il tempo "perso" per l'uso dell'ambiente di time tracking che ho creato.
Non si possono usare eventi maschera vari perchè se sono su una query questi eventi non sono significativi. Non ha senso rilevare l'ora di apertura e chiusura dell'applicativo, perchè è sempre aperto e si passa ad esso da altre applicazioni con alt tab o con il mouse.
Credo che l'evento giusto sia da ricercare a livello di sistema operativo, ovvero al momento in cui l'applicazione access prende il focus, ovvero diventa la finestra attiva. Devo intercettare quell'evento lì. E lo devo fare comunque all'interno di access. Ad ogni focus ricevuto registro in un campo di una tabella il valore della funzione time() idem quanto l'applicazione perde lo stato attivo a favore di un'altra applicazione windows, in altre parole registro le entrate e le uscite dall'applicazione e poi da lì facilmente calcolo i minuti che ho perso nell'uso dell'applicativo.
Ma come intercetto questi eventi? Mi potete aiutare?

Grazie.

6 Risposte

  • Re: Cronometrare l'utilizzo di un database access

    Io non ho capito di preciso a quali EVENTI ti riferisci.

    Ma...ad esempio all'apertura di Access, sfruttando la macro Autoexec potresti far apparire un
    FinestraMessaggio
    "Il time di apertura di Access è " & Now()

    Qualcosa di simile quando CHIUDI Access...solo che non so come si chiama questo "evento".
    P.S.: ho letto vari altri thread simili e pare non esista una cosa similare a Autoexec in chiusura. Molti utenti suggeriscono una maschera "inutile" (possibilmente nascosta) che "alla chiusura" deve far corrispondere il
    MsgBox "Il time di chiusura di Access è " & Now()
  • Re: Cronometrare l'utilizzo di un database access

    @osvaldo ... non hai letto bene perché quello che proponi, lui lo esclude proprio!

    L'unica soluzione al problema (inconsueto per la verità) è usare un timer che, ogni x millisecondi, chiami la API getforegroundwindow per capire se la window attuale è quella di primo piano, e quindi accumuli le informazioni richieste.
  • Re: Cronometrare l'utilizzo di un database access

    Grazie oregon, mi hai indicato la strada giusta credo. Potrei, nella maschera di inserimento delle attività, che è sempre aperta, nell'evento timer, mettere la routine per richiamare l'api che hai detto te, e poi tutto il codice che serve per memorizzare i vari stati in una tabella. E l'intervallo del timer settarlo ad un secondo, che come precisione è già molto buona.
    Se ti è facile, mi puoi indicare il codice per interrogare da vba quell'api? Saresti gentilissimo.
  • Re: Cronometrare l'utilizzo di un database access

    Trovato il codice che mi serve. E' questo:

    Option Compare Database

    Public Declare PtrSafe Function GetForegroundWindow Lib "user32" () As LongLong
    Public Declare PtrSafe Function GetWindowText Lib "user32" _
    Alias "GetWindowTextA" (ByVal HWnd As LongPtr, _
    ByVal lpString As String, ByVal cch As LongLong) As LongLong


    Sub AAA()
    Dim WinText As String
    Dim HWnd As LongLong
    Dim L As LongLong
    HWnd = GetForegroundWindow()
    WinText = String(255, vbNullChar)
    L = GetWindowText(HWnd, WinText, 255)
    WinText = Left(WinText, InStr(1, WinText, vbNullChar) - 1)
    Debug.Print L, WinText
    End Sub

    Da qui in poi mi arrangio. Grazie ancora ad oregon perchè senza il suo aiuto non sarei riuscito.
  • Re: Cronometrare l'utilizzo di un database access

    Metti quel codice in una Form separata aperta in modalità Hidden.
    Tieni presente che questa cosa si potrebbe realizzare anche senza API.
    Se usi l'applicativo si da per scontato sia necessario interagire... questo inoine che il controllo ATTIVO cambi in continuazione.
    Se non cambia per più di tot tempo significa che non vien e usato.

    Tieni anche presente che il semplice verificate lo stato della Main Windows non è indice di utilizzo.... te lo dico perché se mi addormento con l'applicativo in primo piano o vado a bere il caffè non significa usarlo...

    Prova a leggere questo:
    https://msdn.microsoft.com/en-us/vba/access-vba/articles/detect-user-idle-time-or-inactivity
  • Re: Cronometrare l'utilizzo di un database access

    Grazie terrò conto anche di questo consiglio.
Devi accedere o registrarti per scrivere nel forum
6 risposte