Velocizzare caricamento form

di il
7 risposte

Velocizzare caricamento form

Ciao
Sono consapevole di impiegare una pratica sempre sconsigliata ma per esigenze di produzione e' un male necessario.
Lavoro in un contesto client/server con sqlserver come be e access come fe

Ho un form che ha una decina di combo, nel form sono presenti anche circa una decina di subform in visualizzazione maschere continue ed in ogni record delle maschere continue ci sono 1 o 2 combo. Ogni subform puo' avere circa 3-4 record. Parliamo quindi di 30-50 combo.

Ovviamente il Load del form lavorando da remoto e' molto lento (mentre in locale e' quasi istantaneo).
So che il problema principale e' popolare le combo.
Parzialmente ho risolto settandole e popolandole da codice (invece che da UI con gli strumenti di access) e devo dire che il miglioramento e' percepibile, ma non basta.
Ogni combo ha una query come rowsource, il bound e' con un campo id numerico ma viene visualizzato un campo testo il cui valore viene ricavato appunto dalla query.

Quello che vorrei fare e' che nelle combo, subito dopo il load dei form/subform venga visualizzato solo il valore già settato, mentre la lista dei valori (della combo) dovrebbe essere popolata soltanto al momento in cui sia necessario modificarne il valore.

Non so se ciò possa portare effettivamente ad un miglioramento di prestazioni quindi anche qualche altra alternativa potrebbe essere valida.

Qualcuno ha qualche suggerimento?

7 Risposte

  • Re: Velocizzare caricamento form

    Fossi in te non trarrei conclusioni senza aver fatto opportune considerazioni... ed io non ne ho viste.
    E' vero che la situazione Client-Server tendenzialmente può avere riduzioni di performances in senso relativo, ma non è una considerazione tecnica questa, come è regola di BUONSENSO sviluppare per ridurre al minimo indispensabile il traffico dati, e va da se che tutto quello che hai detto va da tutt'altra parte...

    Chi sviluppa Client-Server senza le adeguate conoscenze commette SEMPRE gravi errori tecnici che vanificano l'esistenza di un RDBMS lato Server... lamentandosi della lentezza...

    Quindi prima di pensare a cose serie, fossi in te, farei un CHECK su queste cose apparentemente banali:
    1) Ovviamente, stiamo parlando di un DB Normalizzato correttamente con la adeguata definizione di CHiavi Primarie e Chiavi Esterne nonchè di Indici...?
    2) Hai realizzato una Connessione stabile con un Recordset sempre Aperto, anche vuoti, affinchè la Connection non continui a cadere...?
    3) La dove hai delle Query con criterio, hai fatto attenzione che nella WHERE no nvi siano Oggetti Locali da risolvere...?
    Es:
    
    SELECT * FROM T1 WHERE Id=Forms!NomeForm!ControlloId
    Query come queste fanno inorridire e fallire l'esistenza del Server SQL, in quanto non essendo capace di risolvere il predicato, lo rimuove e restituisce ad Access tutto il Recordset delegando poi JET ad applicare la WHERE... quindi SQLSERVER Inutile.
    E questo vale per tutti i Riferimenti LOCALI, FUnzioni di Aggregazione sui domini, o Funzioni UDF Locali...
    4) Sapendo che le COmbo sono oggetti ReadOnly, hai valutato di alimentarle con Query PassTrought
    5) Hai usato gli strumenti di Managment per analizzare i piani di esecuzione delle Queries...?
    6) Non hai relazionato le LinkedTable anche in LOCALE...? (spero di no)

    Questi 6 punti, al 99% dei casi sono sempre disattesi... o enormemente sottovalutati per non conoscenza, quindi ci si trova con la Ferrari in prima...
  • Re: Velocizzare caricamento form

    Il problema non e' la struttura client/server (ovviamente) anzi e' una pratica che anche per piccoli progetti e' sempre bene utilizzare. Il problema sono le combo che come e' noto, quando abusate, rallentano il caricamento delle maschere. Ma in questo caso devo per forza usarne molte.
    Per il punto 1 ci siamo
    Per il punto 2 ci siamo
    Per il punto 3 ci siamo
    Per il punto 4 dipendende. Ma per questo specifico caso no, perche' per query "semplici e chiare" se non sbaglio vengono direttamente risolte da SQLServer in modo trasparente.
    Per il punto 5 non ne vedo la necessità in quanto le query sono tutte molto semplici tipo (SELECT idActivity, ActivityName WHERE idJob= " ) & idJob
    Per il punto 6 mi rifiuto anche solo di pensare che qualcuno possa farlo.

    La struttura di massima e' questa (ometto il 99% del restante codice):

    Il form principale ha una decina di sub form i quali sono relazionati al form principale mediante collegamento master/details impostato nelle proprietà dei subform, non da VBA.
    Il form principale e subform sono tutti in binding con le rispettive LinkedTable

    Private Sub subForm_Load() 'subForm a maschere continue
    InitCombos
    EndSub

    Private Sub InitCombos
    With Me.cMyCombo
    .RowSource = Queries.ListActivity
    .BoundColumn = 1
    .ColumnCount = 2
    .ColumnWidths = "0 cm; 3 cm"
    End With
    End Sub

    Queries... e' un modulo in cui ho raggruppato tutte le query più' utilizzate così da non doverle riscrivere ogni volta per ogni form in cui servono. Vengono inizializzate in una funzione apposita al caricamento dell'applicazione.

    Ora mi domando se esiste qualche pattern di implementazione per velocizzare il caricamento del form principale in un contesto simile al mio.
    Ad esempio (ed e' solo un esempio) carico in una collezione tutte le combo prima che vengano caricati i relativi subForm cosi' posso riutilizzarle in tutti i form in cui mi servono senza dover ogni volta ripopolarle inutilmente.
  • Re: Velocizzare caricamento form

    Frisbee ha scritto:


    Il form principale ha una decina di sub form i quali sono relazionati al form principale mediante collegamento master/details impostato nelle proprietà dei subform, non da VBA.
    Il form principale e subform sono tutti in binding con le rispettive LinkedTable
    Prova a togliere il recordsource dalle subform e i campi linkmaster/child a livello di disegno.
    Nel load del form principale imposti il recordsource e i campi linkmaster/child delle varie subform (oppure li imposti dopo che hai deciso che filtri applicare).

    Io utilizzo questo approccio in quanto il mio form principale è un form di ricerca con molti filtri applicabili e ho riscontrato che con mySQL il vantaggio all'apertura è considerevole. Di fatto le subform subiscono dal form principale il recordsource (che è già filtrato con quello che viene richiesto).
  • Re: Velocizzare caricamento form

    Non ho mai capito se e' una buona pratica o meno, in quanto Access carica prima i subform e poi il form principale. Per non "incastrarmi" con valori null passati da un form che non e' ancora caricato ho preferito evitare.
    Pero' visto che mi dici che il gioco vale la candela, faro' sicuramente delle prove.

    Grazie
  • Re: Velocizzare caricamento form

    Di fatto io faccio così :
    - a design time imposto recordsource e link
    - finita la fase di disegno del form/subform elimino recordsource e link dalle proprietà delle form
    - nel main form lancio msg di avviso se i subform hanno il recordsource impostato (serve per ricordare che va eliminato quando tutto lo sviluppo è ok)
    - imposto recordsource e link tramite pulsante applica filtri
  • Re: Velocizzare caricamento form

    Il fatto che prima venga caricata la subform e poi la form dovrebbe essere un rafforzativo non un dubbio...
    La subform carica tutto il recordset, poi quando viene caricata la form che vengono vaorizzati i campi Master, viene caricato nuovamente il recordset nella subform...

    Io, di solito faccio uso dell'evento timer calibrato a 100ms che esegue OneShots l'associazione dei dati...
    
    Private Sub Form_Load()
       ...
       me.TimerInterval=100
    End sub
    
    Private Sub Form_Timer()
       Me.NomwSub1.Recordsource=Xxx
       ' Campi Master/Secondari
       ' ComboBox
       
       me.TimerInterval=0
     End sub
    
  • Re: Velocizzare caricamento form

    OK, grazie per i suggerimenti
Devi accedere o registrarti per scrivere nel forum
7 risposte