Collegare origine dati nell'evento open form

di il
3 risposte

Collegare origine dati nell'evento open form

Buongiorno,
ieri ho fatto un piccolo test della mia applicazione nella mia rete in azienda, 5 pc con beckend su un pc che fa da server
i pc che lavorano simultaneamente sono 3, gli altri sono postazioni non sempre utilizzate ed ho notato che le maschere impiegano anche diversi secondi prima di aprirsi. le maschere sono per la maggior parte maschere continue dove ad ogni riga c'è un pulsante per poter aprire in una nuova maschera il record da modificare.
le tabelle interrogate vanno da tabelle con circa 10000 record a tabelle con oltre 160000 record.
nell'origine dati di ogni form è scritta una query che seleziona solo i campi interessati e i record interessati tramite where con massimo 2 clausole. nessun dcount/dlookup ecc.. nelle query. le query restituite hanno max 20 record.

la maschera che impiega piu tempo fa riferimento ad una query che preleva dati da 3 tabelle relazionate.
googlando per cercare velocizzare ho letto di un utente che aveva un problema analogo ed un'altro che chiedeva tra le altre cose se l'origine dati della maschera fosse settato nell'evento open del form...
mi domando, questo aiuta veramente a velocizzare? creare un recordset manualmente ed assegnarlo alla maschera velocizza rispetto a scrivere la query in origine dati nella proprieta della maschera?

3 Risposte

  • Re: Collegare origine dati nell'evento open form

    No, ma ci sono diverse considerazioni che si possono fare.
    Non capisco se il BE è Access(JET) o se è un Server SQL, prima cosa.

    Solitamente per non rallentare si fa attenzione a gestire le maschere in modo che abbiano MENO dati possibili, quindi non si caricano From con TUTTI i Records per poi selezionarne 1...
    Si usano Form Non associate per inserire i criteri e mirare alla selezione specifica.
    Si usano Form per la visualizzazione in modalità ReadOnly, delegando poi all'editing Form specifiche aperte in modalità Scrittura.
    Si Evita di riempire le maschere con Controlli DataBound che ovviamente si popolano all'apertura.
    Ci si assicura che le Tabelle abbiano i campi che vengono usati per i JOIN delle Queries siano correttamente indicizzati.
    Ci si assicura che i Criteri delle queries siano presenti se necessario... non cose tipo
    [Campo1 LIKE * criterio1 * AND Campo2 LIKE * criterio2 * ecc...] queste sono cose che non si possono vedere l'efficienza della query è affossata.
    Si usano le query passando i Parameter se possibile
    Si fanno le risoluzioni ESPLICITE dei criteri e non [Campi 1 Like * Forms!NomeForm!NomeControllo *...]

    Spesso tuttavia, i rallentamenti in rete dipendono dalla mancata conservazione della connessione, ovvero, Access alla chiusura dell'ultima Maschera(Associata) Aperta, fa cadere la connessione, che per essere ripristinata impiega tempo.
    Solitamente quindi che si abbia Access(JET) o un Server SQL, si apre all'avvio e si tiene aperto un RS fittizio che tiene aperta e sempre vigile la connessione, questo velocizza di molto tutte le azioni conseguenti, inclusa l'apertura delle maschere.

    Insomma ci sono tantissime regole di buona programmazione che vanno considerate...
  • Re: Collegare origine dati nell'evento open form

    Ciao, il be è access,
    per tener aperta la connessione mi basta mi basta un
    
    Dim rs As DAO.recordset
    Set rs = DbEngine(0)(0).OpenRecordset("NomeTabella")
    da inserire nella maschera di apertura che poi rimane nascosta ma sempre aperta?
    cosa intendi con
    quindi non si caricano From con TUTTI i Records per poi selezionarne 1...
    scrivendo la query in origine record del form non vengono selezionati solo i record che rispettano i criteri della query?
    spero che non venga caricata comunque tutta la tabella per poi eseguire la selezione...
    comuque in opzioni ho disattivato la correzione automatica del nome e un miglioramento gia c'è stato.
    ora provo ad tenere aperto il recordset per vedere se migliora ancora.
  • Re: Collegare origine dati nell'evento open form

    Calida ha scritto:


    Ciao, il be è access,
    per tener aperta la connessione mi basta mi basta un
    
    Dim rs As DAO.recordset
    Set rs = DbEngine(0)(0).OpenRecordset("NomeTabella")
    Si preferisce avere una Tabella inutile con nessun record, ma si il concetto è quello.

    Calida ha scritto:


    da inserire nella maschera di apertura che poi rimane nascosta ma sempre aperta?
    Se usi una Maschera non serve aprire il RS basta associare la maschera alla tabella...
    Io preferisco su AutoExec aprire un RS dichiarato Public e lasciarlo li... appeso, alla chisura libera tutto.

    Calida ha scritto:


    cosa intendi con
    quindi non si caricano From con TUTTI i Records per poi selezionarne 1...
    scrivendo la query in origine record del form non vengono selezionati solo i record che rispettano i criteri della query?
    spero che non venga caricata comunque tutta la tabella per poi eseguire la selezione...
    Si con Access(JET) si carica tutto anche se con campi Indicizzati applica una ottmizzazione, con un Server SQL no, ma deve essere ben fatto, e non è scontato per chi lavora con access fare le cose che funzionino bene perchè spesso si è abituati a lavorare con oggetti del Client e passarli al Motore del DB, vedi i riferimenti ai controlli delle maschere nelle query.

    Proceduralmente ad esempio Sistemi studiali limitano i dati al massimo sia perchè Elenchi di 10000Records è assurdo visualizzarli, sia perchè significano traffico di rete, quindi lo studio delle maschere diventa importante proprio per ottimizzare l'operatività.

    Calida ha scritto:


    comuque in opzioni ho disattivato la correzione automatica del nome e un miglioramento gia c'è stato.
    ora provo ad tenere aperto il recordset per vedere se migliora ancora.
    Bene.
Devi accedere o registrarti per scrivere nel forum
3 risposte