Newsgroup: it.comp.appl.access
Titolo: access molto lento all'avvio dopo soli circa 1000 record nella tabella principale

all'avvio si apre una maschera che contiene circa 1000 record e altre 3 
sottomaschere che contiene dei record selezionati, non mi aspettavo grandi 
rallentamenti dopo soli 1000 record invece all'apertura impiega circa 12 
secondi prima con pochi record era immediato.
 
sicuramente commetto qualche grave errore ma dove ricercarlo?
 
qualcuno ha qualche consiglio? dove cercare le ragioni dei possibili vistosi 
rallentamenti dopo soli 1000 record?
potrei postarvi il codice che eseguo all'avvio delle form
 
grazie a tutti per i consigli. 
 

ho provato a inserirne 3500 di record e ci ha impiegato 50 secondi circa ad 
aprirsi � ovvio che qualcosa non quadra troppi pochi record per un 
rallentamento simile.
 
la form � basata su una query con 2 campi calcolati ma non credo sia quello 
il problema
 
si accettano consigli di tutti i tipi.
 
Grazie.
 
 
 

Stessa lentezza sia su windows xp macchina virtuale che con windows 8
 
l'indagine prosegue...
 
 

l'apertura della query da sola con i campi calcolati � velocissima penso 
quindi possa essere codice vb che eseguo su corrente di ogni record?
 
continuo ad indagare ma!!??
 
 

� possibile scoprire in quale punto l'esecuzione del codice vb faccia 
rallentare vistosamente il db? 
 

commentando pezzi di codice alla ricerca del codice "rallentatore" ho
scoperto essere 2 sub routine che eseguo su evento apertura della form
principale, una mi serve per calcolare il totale in fondo alla form, l'altra
invece imposta dei filtri abbastanza complessi per filtrare dei record
 
riporto qui sotto il codice delle 2 sub routine qualcuno sa dirmi come
potrei modificare il codice per renderlo pi� veloce?
voi che dite sto chiedendo troppo ad access oppure dove sbaglio?
 
 
++++++ SUB ROUTINE 1 +++++++
 
Private Sub CalcolaTotale()
    Me.Refresh
        'totali tessere pagate e non pagate
        If Me.attivi = -1 Or Me.attivi = 0 Then
            Me.tesserepagate = Nz(DCount("[tesserapagata]", "tessereconta",
"tesserapagata=-1"), 0)
            Me.tesserenonpagate = Nz(DCount("[tesserapagata]",
"tessereconta", "tesserapagata=0"), 0)
        ElseIf IsNull(Me.attivi) = True Then
            Me.tesserepagate = Nz(DCount("[tesserapagata]", "tessereconta2",
"tesserapagata=-1"), 0)
            Me.tesserenonpagate = Nz(DCount("[tesserapagata]",
"tessereconta2", "tesserapagata=0"), 0)
        End If
 
    If pop = "" Then
 
        '********************************
        'totali abbonamenti e scaduti e non scaduti
        Me.totale = Nz(DCount("[id]", "abbonamentiCompleti"), 0)
        Me.totaleScaduti = Nz(DCount("[id]", "abbonamentiCompleti",
"scadenza<" & TraData(Date)), 0)
        Me.Totalevalidi = Nz(DCount("[id]", "abbonamentiCompleti",
"scadenza>=" & TraData(Date)), 0)
 
        'totali abbonamenti pagati parzialmente pagati e non pagati
        Me.pagati = Nz(DCount("[id]", "abbonamentiCompleti", "([pagato]>0)
and ([pagato]>=[importo])"), 0)
        Me.parzpagati = Nz(DCount("[id]", "abbonamentiCompleti", "[pagato]>0
and ([pagato]<[importo])"), 0)
        Me.nonpagati = Nz(DCount("[id]", "abbonamentiCompleti", "[pagato] =
0"), 0)
    Else
 
        '********************************
        'totali abbonamenti e scaduti e non scaduti
        Me.totale = Nz(DCount("[id]", "abbonamentiCompleti", pop), 0)
        Me.totaleScaduti = Nz(DCount("[id]", "abbonamentiCompleti", pop & "
and scadenza<" & TraData(Date)), 0)
        Me.Totalevalidi = Nz(DCount("[id]", "abbonamentiCompleti", pop & "
and scadenza>=" & TraData(Date)), 0)
 
        'totali abbonamenti pagati parzialmente pagati e non pagati
        Me.pagati = Nz(DCount("[id]", "abbonamentiCompleti", pop & " and
([pagato]>0) and ([pagato]>=[importo])"), 0)
        Me.parzpagati = Nz(DCount("[id]", "abbonamentiCompleti", pop & " and
[pagato]>0 and ([pagato]<[importo])"), 0)
        Me.nonpagati = Nz(DCount("[id]", "abbonamentiCompleti", pop & " and
[pagato] = 0"), 0)
    End If
End Sub
 
++++++ FINE SUB ROUTINE 1 +++++++
 
++++++ SUB ROUTINE 2 +++++++
 
Function CostruisciFiltro() As String
    CostruisciFiltro = ""
    filtro = ""
    Me.Refresh
    If (Forms![00presenta]![00presentaabbonamenti]![CasellaCombinata218] <>
"") And
(IsNull(Forms![00presenta]![00presentaabbonamenti]![CasellaCombinata218]) =
False) Then
        CostruisciFiltro = "IDALLIEVO =
Forms![00presenta]![00presentaabbonamenti]![CasellaCombinata218]"
        filtro = filtro & " ALLIEVO '" &
Forms![00presenta]![00presentaabbonamenti]![CasellaCombinata218].Column(1) &
"'"
    End If
 
    If (Forms![00presenta]![00presentaabbonamenti]![CasellaCombinata383] <>
"") And
(IsNull(Forms![00presenta]![00presentaabbonamenti]![CasellaCombinata383]) =
False) Then
        If CostruisciFiltro = "" Then
            CostruisciFiltro = CostruisciFiltro & "[IDABBONAMENTO] =
Forms![00presenta]![00presentaabbonamenti]![CasellaCombinata383]"
        Else
            CostruisciFiltro = CostruisciFiltro & " and [IDABBONAMENTO] =
Forms![00presenta]![00presentaabbonamenti]![CasellaCombinata383]"
        End If
        filtro = filtro & " ABBONAMENTO '" &
Forms![00presenta]![00presentaabbonamenti]![CasellaCombinata383].Column(1) &
"'"
    End If
 
    If (Forms![00presenta]![00presentaabbonamenti]![dal] <> "") And
(IsNull(Forms![00presenta]![00presentaabbonamenti]![dal]) = False) Then
        If CostruisciFiltro = "" Then
            CostruisciFiltro = CostruisciFiltro & "[datacreazione] >=
Forms![00presenta]![00presentaabbonamenti]![dal]"
        Else
            CostruisciFiltro = CostruisciFiltro & " and [datacreazione] >=
Forms![00presenta]![00presentaabbonamenti]![dal]"
        End If
        filtro = filtro & " REGISTRATO DAL '" &
Forms![00presenta]![00presentaabbonamenti]![dal] & "'"
    End If
 
    If (Forms![00presenta]![00presentaabbonamenti]![al] <> "") And
(IsNull(Forms![00presenta]![00presentaabbonamenti]![al]) = False) Then
        If CostruisciFiltro = "" Then
            CostruisciFiltro = CostruisciFiltro & "[datacreazione] <=
Forms![00presenta]![00presentaabbonamenti]![al]"
        Else
            CostruisciFiltro = CostruisciFiltro & " and [datacreazione] <=
Forms![00presenta]![00presentaabbonamenti]![al]"
        End If
        filtro = filtro & " AL " &
Forms![00presenta]![00presentaabbonamenti]![al] & "'"
    End If
 
 
    'gestisco filtro abbonamenti pagati o non pagati
    If (Forms![00presenta]![00presentaabbonamenti]![fpagati] = -1) Then
        Me.fpagati.ControlTipText = "Clicca per visualizzare gli abbonamenti
non pagati"
        Me.eti4.Caption = "Abbonamenti pagati"
        Me.eti4.ControlTipText = "Tutti gli abbonamenti pagati"
        If CostruisciFiltro = "" Then
            CostruisciFiltro = CostruisciFiltro & "[pagato]>0 and
[pagato]>=[importo]"
        Else
            CostruisciFiltro = CostruisciFiltro & " and [pagato]>0 and
[pagato]>=[importo]"
        End If
        filtro = filtro & " ABBONAMENTI PAGATI"
    ElseIf (Forms![00presenta]![00presentaabbonamenti]![fpagati] = 0) Then
        Me.eti4.Caption = "Abb. non pagati o parz. pagati"
        Me.eti4.ControlTipText = "Tutti gli abbonamenti non pagati o parz.
pagati"
        Me.fpagati.ControlTipText = "Clicca per visualizzare tutti gli
abbonamenti pagati e non pagati"
        If CostruisciFiltro = "" Then
            CostruisciFiltro = CostruisciFiltro & "([pagato]=0 or
[pagato]<[importo])"
        Else
            CostruisciFiltro = CostruisciFiltro & " and ([pagato]=0 or
[pagato] <[importo])"
        End If
        filtro = filtro & " ABBONAMENTI NON PAGATI O PARZIALMENTE PAGATI"
    Else
        Me.eti4.Caption = "Abb. pagati e non pagati"
        Me.eti4.ControlTipText = "Tutti gli abbonamenti pagati e non pagati"
        Me.fpagati.ControlTipText = "Clicca per visualizzare solo gli
abbonamenti pagati"
        filtro = filtro & " ABBONAMENTI PAGATI E NON PAGATI"
    End If
    'FINE gestisco filtro abbonamenti pagati e non pagati
 
 
    'gestisco filtro tessere attive anno in corso o tessere non attive anni
scorsi
    If (Forms![00presenta]![00presentaabbonamenti]![attivi] = -1) Then
        Me.attivi.ControlTipText = "Clicca per visualizzare gli abbonamenti
non attivi degli anni scorsi"
        Me.ETI2.Caption = "Abbonamenti anno in corso"
        Me.ETI2.ControlTipText = "Tutti gli abbonamenti dell'anno in corso"
        Me.ETI2.ForeColor = RGB(0, 0, 0)
        If CostruisciFiltro = "" Then
            CostruisciFiltro = CostruisciFiltro & "[attivo] = -1"
        Else
            CostruisciFiltro = CostruisciFiltro & " and [attivo] = -1"
        End If
        filtro = filtro & " ABBONAMENTI ATTIVI DELL'ANNO CORRENTE"
    ElseIf (Forms![00presenta]![00presentaabbonamenti]![attivi] = 0) Then
        Me.ETI2.Caption = "Abbonamenti anni scorsi"
        Me.ETI2.ControlTipText = "Tutti gli abbonamenti degli anni scorsi"
        Me.ETI2.ForeColor = RGB(255, 0, 0)
        Me.attivi.ControlTipText = "Clicca per visualizzare tutti gli
abbonamenti attivi dell'anno corrente e non attivi degli anni scorsi"
        If CostruisciFiltro = "" Then
            CostruisciFiltro = CostruisciFiltro & "[attivo] = 0"
        Else
            CostruisciFiltro = CostruisciFiltro & " and [attivo] = 0"
        End If
        filtro = filtro & " ABBONAMENTI NON ATTIVI ANNI SCORSI"
    Else
        Me.ETI2.Caption = "Tutti gli abbonamenti"
        Me.ETI2.ControlTipText = "Tutti gli abbonamenti anno corrente e anni
scorsi"
        Me.ETI2.ForeColor = RGB(255, 0, 0)
        Me.attivi.ControlTipText = "Clicca per visualizzare gli abbonamenti
attivi dell'anno corrente"
        filtro = filtro & " ABBONAMENTI ATTIVI E NON ATTIVI"
    End If
    'FINE gestisco filtro tessere attive anno in corso o tessere non attive
anni scorsi
 
 
 
    'gestisco filtro tutte le tessere o tessere pagate o non pagate
    If (Forms![00presenta]![00presentaabbonamenti]![ftessera] = -1) Then
        Me.ftessera.ControlTipText = "Clicca per visualizzare solo le
tessere non pagate"
        Me.eti3.Caption = "Tessere Pagate"
        Me.eti3.ControlTipText = "Tutte le tessere gi� pagate"
        If CostruisciFiltro = "" Then
            CostruisciFiltro = CostruisciFiltro & "[tesserapagata] = -1"
        Else
            CostruisciFiltro = CostruisciFiltro & " and [tesserapagata]
= -1"
        End If
        filtro = filtro & " TESSERE GIA' PAGATE"
    ElseIf (Forms![00presenta]![00presentaabbonamenti]![ftessera] = 0) Then
        Me.ftessera.ControlTipText = "Clicca per visualizzare tutti gli
abbonamenti sia quelli con le tessere pagate sia le non pagate"
        Me.eti3.Caption = "Tessere Non Pagate"
        Me.eti3.ControlTipText = "Tutte le tessere non pagate"
        If CostruisciFiltro = "" Then
            CostruisciFiltro = CostruisciFiltro & "[tesserapagata] = 0"
        Else
            CostruisciFiltro = CostruisciFiltro & " and [tesserapagata] = 0"
        End If
        filtro = filtro & " TESSERE NON PAGATE"
    Else
        Me.eti3.Caption = "Tutte le tessere"
        Me.eti3.ControlTipText = "Tutte le tessere pagate e non pagate"
        Me.ftessera.ControlTipText = "Clicca per visualizzare solo le
tessere pagate"
        filtro = filtro & " TUTTE LE TESSERE PAGATE E NON PAGATE"
    End If
    'FINE gestisco filtro tutte le tessere o tessere pagate o non pagate
 
    'gestisco filtro tutte le tessere o tessere scadute o non scadute anno
in corso
    If (Forms![00presenta]![00presentaabbonamenti]![visabb] = -1) Then
        Me.visabb.ControlTipText = "Clicca per visualizzare solo gli
abbonamenti scaduti"
        Me.eti.Caption = "Non scaduti"
        Me.eti.ControlTipText = "Tutti gli abbonamenti non scaduti"
        If CostruisciFiltro = "" Then
            CostruisciFiltro = CostruisciFiltro & "[scadenza] >=" &
TraData(Date)
            filtro = filtro & " ABBONAMENTI SCADUTI"
        Else
            CostruisciFiltro = CostruisciFiltro & " and [scadenza] >=" &
TraData(Date)
            filtro = filtro & " ABBONAMENTI SCADUTI"
        End If
    ElseIf (Forms![00presenta]![00presentaabbonamenti]![visabb] = 0) Then
        Me.visabb.ControlTipText = "Clicca per visualizzare tutti gli
abbonamenti"
        Me.eti.Caption = "Scaduti"
        Me.eti.ControlTipText = "Tutti gli abbonamenti scaduti"
        If CostruisciFiltro = "" Then
            CostruisciFiltro = CostruisciFiltro & "[scadenza] <" &
TraData(Date)
            filtro = filtro & " ABBONAMENTI NON SCADUTI"
        Else
            CostruisciFiltro = CostruisciFiltro & " and [scadenza] <" &
TraData(Date)
            filtro = filtro & " ABBONAMENTI NON SCADUTI"
        End If
    Else
        Me.visabb.ControlTipText = "Clicca per visualizzare tutti gli
abbonamenti non scaduti"
        Me.eti.Caption = "Scaduti e Non scaduti"
        Me.eti.ControlTipText = "Tutti gli abbonamenti scaduti e non
scaduti"
        filtro = filtro & " ABBONAMENTI SCADUTI E NON SCADUTI"
    End If
    'FINE gestisco filtro abbonameni tutti scaduti o non scaduti
 
    pop = CostruisciFiltro
    If filtro = "" Then
        filtro = "TUTTI GLI ABBONAMENTI"
    End If
    CalcolaTotale
End Function
 
++++++ FINE SUB ROUTINE 2 +++++++ 
 



Scusate il doppio messaggio uguale � stato un errore!
 

tmtube ha scritto:

Tra le varie istruzioni delle sub metti delle righe che stampino nella 
finestra immediata un progressivo e il timer:
 
..istruzione...
debug.print "01 - " & Timer
..istruzione...
debug.print "02 - " & Timer
..istruzione...
debug.print "03 - " & Timer
..istruzione...
 
Salva, chiudi e riapri il db e alla fine vai nella finestra immediata a 
vedere quali sono i passaggi che portano via pi� tempo. Una volta 
individuate le istruzioni pi� pesanti indagherai perch� sono lente e
potrai 
cercare delle alternative pi� veloci.
Ciao.
-Marco-
 
 
 
-- 
 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it
 
 
 

-Marco-
 
 
Grazie ottimo consiglio, ci provo e vi far� sapere gli sviluppi.
 
 

-Marco-
 
sono tutte istruzioni tipo
Me.totaleScaduti = Nz(DCount("[id]", "abbonamentiCompleti", "scadenza<" & 
TraData(Date)), 0)
i recordset sono pi� veloci di dcount?
 
ecco il risultato pare siano tutte identiche o quasi, ma cosa sono 
millisecondi?
a ste punto come migliorare?
 
00 - 69855,89
01 - 69855,91
02 - 69855,92
03 - 69855,92
04 - 69855,94
05 - 69855,94
06 - 69855,95
07 - 69857,75
08 - 69861,35
 
 
 
 

tmtube ha scritto:

Sono secondi, lo vedi mettendo il cursore su Timer e premendo F1.
Dalla zero alla 6 sono veloci, lasciale stare cos� come sono.
Vai ad esaminare quello che c'� tra la 6 e la 7 che porta via quasi due 
secondi, e tra la 7 e la 8 che ti fa perdere altri 3 secondi e mezzo.
Query e recordset sono molto pi� veloci delle funzioni di aggregazione sui 
domini (dcount, dsum, ecc...), cerca di riscrivere quei due pezzi usando
una 
query o un recordset.


Ho trovato il problema sia quando applico un filtro alla form sia quando 
calcolo i totali nella form quando interpello un campo calcolato di nome 
"pagato" f� rallentare drasticamente l'esecuzione del db
 
a questo punto avendo necessit� di filtrare e di calcolare i totali di quel 
campo forse � meglio memorizzare il valore volta per volta anzich� avere un 
campo calcolato?
 
grazie a tutti.
 
 

tmtube ha scritto:

Per ottimizzare le prestazioni � necessario vedere come � strutturato il 
database, non basta vedere la formula. Intanto cerca di calcolare i valori
con 
le query, evitando l'uso di Dsum() e Dcount(), forse riesci gi� a
velocizzare 
il tutto.


tmtube ha scritto:

Per ottimizzare le prestazioni � necessario vedere come � strutturato il 
database, non basta vedere la formula. Intanto cerca di calcolare i valori
con 
le query, evitando l'uso di Dsum() e Dcount(), forse riesci gi� a
velocizzare 
il tutto.


Pensavo di memorizzare il valore di "pagato" ogni qualvolta un utente esegue 
una modifica sui pagamenti, pensi sia inutile ed errato memorizzare il 
valore visto che le prestazioni in quel caso sono ovviamente migliori?
 
calcolare con le query non mi � molto chiaro cosa intendi, il valore di 
pagato � gi� calcolato all'interno di una query su cui si basa la mia 
maschera e sulla quale poi eseguo le somme
 
grazie.
 

 grazie.
 
Calcolare con le query e non con Dsum o Dcount, ma lo fai già per cui se
la 
query è lenta bisognerebbe ottimizzare in altro modo.


i  totali saranno sbagliati.
 
Si questo l'avevo messo in conto dovrò prevedere ogni possibile strada che 
l'utente può percorrere per modificare il valore e aggiornarlo.
 
Grazie. 
 

 
"tmtube" <

Mah, rimane il fatto che stupiscono prestazioni cos� lente con soli 1000 
records!
Cosa fa sto campo calcolato?
 
Ciao! 
 
 

Ciao!
 
il campo calcolato nulla in particolare � quando lo vado ad interpellare in 
una funzione filtro e una funziona calcola totali
in cui eseguo dei confronti [campocalcolato]>di...... ecc.. in quel caso 
diventa lento
ho optato per un campo con valore memorizzato che aggiorno ogni volta che il 
cliente modifica un importo.