Progress Bar

di il
10 risposte

Progress Bar

Buonasera, nella mia procedura sono presenti alcune funzioni per le cui esecuzioni necessita di qualche secondo/Minuti.
Vorrei presentare all'operatore in attesa della fine del processo, mostrare una barra di avanzamento (Progress Bar) che dia evidenza dell'andamento dell'elaborazione in corso.
Mi sono perso non trovando come e quale metodo utilizzare in Access (VBA).
Grazie

10 Risposte

  • Re: Progress Bar

    Intanto da una occhiata qui.

    http://web.mclink.it/MC5884/

    sezione Forms

    Esempio 3.112 e 3.109.

    Poi nel forum sono presenti gli autori degli esempi e ti sapranno dare altre delucidazioni

  • Re: Progress Bar

    Prima di tutto serve capire se quel “processo di Elaborazione” di cui parli è SINCRONO o ASINCRONO…!

    Nel Primo caso, puoi rappresentare una sensata valorizzazione di uno stato di avanzamento
    Nel Secondo caso sarebbe una finta.

    In ogni caso una Barra di progressione si fa con un Rettangolo colorato e si ridimensiona in percentuale alla Massima Larghezza.

    Quì trovi un esempio, come sempre sono un po complicati… ma da studiare:

    https://1drv.ms/u/s!Are2sGzrs4WChmkmy03kSvfXtR1v?e=fb1vTK

  • Re: Progress Bar

    Grazie per i suggerimenti, ma confesso che non sono alla mia portata, ho costruito una Barra di progressione con un rettangolo colorato con il codice di seguito :

    Option Compare Database
    
    Private Sub Comando2_Click()
        Me.TxtCount = 1
        Me.TimerInterval = 50
        
    End Sub
    
    Private Sub Form_Load()
        Me.TxtCount = 0
    End Sub
    
    Private Sub Form_Timer()
        Me.TxtCount = Me.TxtCount + 1
        Me.Box3.Width = Me.TxtCount * 20
        Me.Testo4 = Me.TxtCount & "%"
        
        If Me.TxtCount = 100 Then
            Me.TimerInterval = 0
        End If
    '
    End Sub

    Ma non so come poi farlo comparire nella sezione di Elaborazione interessata in cui l'operatore è in attesa del messaggio di Fine Lavoro.

    ????

  • Re: Progress Bar

    Quale sarebbe in pratica il processo che l'operatore attende?

    È una query?

    È un ciclo con svariate operazioni?

    È importante per poter inserire il ccoDice della bar

  • Re: Progress Bar

    Quel ciclo non serve a nulla… e èun ciclo di progressione “fasullo” in quanto Asincrono…

    Cosa devi fare di preciso…?

  • Re: Progress Bar

    La mia funzione  (di seguito riportata è all'interno di una mappa di contabilità) esegue un aggiornamento del piano dei Conti partendo dalla registrazione della Prima Nota.
    Questa funziona bene, do un messaggio di conferma per l'inizio di elaborazione comunicando all'operatore di aspettare un prossimo messaggio di Fine Elaborazione.

    Il fatto è che in base al numero delle registrazione impiega un po' di tempo per finire quanto deve, ed è qui che avrei intenzione di far conoscere all'operatore lo stato di avanzamento  dell'Elaborazione.

    Grazie!

    
    Private Sub LeggiBrogliaccio()
    On Error GoTo LeggiBrogliaccio_Err
    '
        Dim db As DAO.Database
        Dim rstContoEconomico As DAO.Recordset
    '
        Set db = CurrentDb
        Set rstContoEconomico = db.OpenRecordset("ContoEconomico", dbOpenTable)
    '
        Do Until rstContoEconomico.EOF
            rstContoEconomico.Edit
            rstContoEconomico!CEco_Dare = 0
            rstContoEconomico!CEco_Avere = 0
            rstContoEconomico.Update
            rstContoEconomico.MoveNext
        Loop
    '
        rstContoEconomico.Close
        Set rstContoEconomico = Nothing
    '
        Dim rstBrogliaccioPN As DAO.Recordset
    '
        Set db = CurrentDb
        Set rstBrogliaccioPN = db.OpenRecordset("BrogliaccioPN", dbOpenTable)
    '
        Do Until rstBrogliaccioPN.EOF
            If rstBrogliaccioPN!PN_Anno = TempVars("TempAnnoEsercizio") Then
                TempVars("TempCauCodice").Value = rstBrogliaccioPN!PN_Causale.Value    ' creo
                TempVars("TempImpEntrate").Value = rstBrogliaccioPN!PN_Entrate.Value + rstBrogliaccioPN!PN_BancaAcc.Value    ' creo
                TempVars("TempImpUscite").Value = rstBrogliaccioPN!PN_Uscite.Value + rstBrogliaccioPN!PN_BancaAdd.Value   ' creo
                LeggiCausale            '  Aggiorna piano dei Conti
                rstBrogliaccioPN.MoveNext
            Else
                rstBrogliaccioPN.MoveNext
            End If
        Loop
    '
        rstBrogliaccioPN.Close
        Set rstBrogliaccioPN = Nothing
    '
    LeggiBrogliaccio_Exit:
        Exit Sub
    '
    LeggiBrogliaccio_Err:
        MsgBox Error$
        Resume LeggiBrogliaccio_Exit
    '
    End Sub
    
  • Re: Progress Bar

    Prima di tutto, qualche chiarimento.

    1) perché la prima parte (primo ciclo) non la sostituisci con una semplice UPDATE sicuramente più veloce?

    2) per la selezione dei record da trattare con il secondo ciclo dovresti usare una SELECT con una WHERE per avere solo i record dell'anno che ti interessa, che sono sicuramente meno di tutti quelli della tabella

    3) come mai usi quella TempVars? Cosa è? Perché la usi al posto di normali variabili?

    Con delle opportune modifiche il tempo impiegato   sicuramente minore

  • Re: Progress Bar

    La funzione riportata è solo una parte ed è solo per un esempio, sicuramente si può fare di meglio, in oltre uso la funzione TempVars per avere la possibilità di utilizzare il contenuto in più funzioni anche non correlate ma necessarie all'intera procedura.
    Capisco che è tutto migliorabile, ma essendo poco pratico di VBA sto facendo passi piccoli e faccio tesoro dei suggerimenti, ma il mio problema rimane quello di mostrare o stato di avanzamento.

  • Re: Progress Bar

    Prima di dedicarsi ai colpi di cipria e rossetto, non sarebbe meglio imparare ad ottimizzare il codice…?

    Entrambi quei 2 cicli per modificare i dati sono sostituibili con 2 queriws di tipo UPDATE come ti ha gia detto Oregon… perchè prima di fare scenografia non fai quello…?

    Se poi nella tua procedura hai altre cose simili magari scopri che con semplici query Update velocizziamo tutto e funziona meglio e con 1/10 del codice…

    Poi vedi la progress bar.

  • Re: Progress Bar

    Se vuoi usare (e non sarebbe necessario) variabili globali lo puoi fare dichiarandole opportunamente nei moduli. Questo velocizza l'esecuzione dato che non è necessario un accesso particolare per ogni variabile.

    Quindi è necessario che tu modifichi e perfezioni il codice come consigliato anche da @Alex prima di fare altro.

    Anche perché i cicli gestiscono un numero non definito a priori di record. In queste condizioni NON PUOI gestire correttamente una barra che inizia e prosegue fino al termine perchè NON SAI quando finirà il ciclo.

    Al massimo potresti far girare la barra avanti e indietro… 

Devi accedere o registrarti per scrivere nel forum
10 risposte