Newsgroup: it.comp.appl.access
Titolo: RecordCount troppo lento

Ciao a tutti,
ho un db residente su server in una lan, prima di importare
da codice alcuni record ho la necessità di conoscerne il numero totale.
Aprendo il recordset su db esterno e usando
RS_ex.MoveLast
RS_ex.MoveFirst
RS_ex.RecordCount
ottengo il numero totale di record. Il problema è che essendo tabelle con
molti record il tempo di attesa è altissimo, sembra che MoveLast costringa
access a scorrere i record prima di restituire il risultato.
Esiste un metoto, utilizzando ADO, che restituisca il conteggio totale di
record senza movelast? (ho provato anche con dcount() ma il risultatoè del
tutto analogo)
Ciao a tutti
Peppe

 ha scritto nel messaggio
news:8nSMd.830606$35.31...@news4.tin.it...

SELECT COUNT(*) AS Conteggio FROM Nometabella
Il recordset restituisce un solo Record nel quale hai il
numero dei Records.
Ciao
-- 
@Alex (Alessandro Baraldi)
---------------------------------------------------------------------------
http://www.sitocomune.com/
http://www.mantuanet.it/alessandro.baraldi/
---------------------------------------------------------------------------

 ha scritto nel messaggio
news:4203f74e$0$6317$5fc...@news.tiscali.it...

Purtroppo è migliorato di poco. In realtà è proprio la query posta al
database che rallenta. La cosa strana è questa: Conoscere il numero dei
record mi serve per impostare il numero massimo di una progress bar. Quando
lancio la funzione che preleva i dati dal BE , dopo l'attesa,  parte il
contatore dei record che si stanno trasferendo e la barra di progressione
comincia ad avanzare.
Ma se si lancia una query di inserimento in locale, il trasferimento dei
dati in tabella è pressochè immediato alla conclusione dell'elaborazione
della query!!
Io non saprei dire il perchè ...
Grazie e scusa per la mail in pvt, volevo rispondere al NG
Ciao

 Ciao
Non c'è problema.
Ciao
-- 
@Alex (Alessandro Baraldi)



Indipendentemente dal parere personale che accetto ma non condivido per la
finalità cui la progressbar è posta. Far conoscere agli utilizzatori, quando
si nasconde la barra di stato, a che punto è la sua richiesta può
alleggerire il tempo d'attesa e non dar adito ad ipotesi di crash o panico
convulso considerata la dimestichezza degli utenti presenti in azienda.
Comunque il codice per la gestione della barra è questo:
Function Init_Barra(NRec As Integer)
   MaxBar = NRec
   DoCmd.OpenForm strForm
   With Forms(strForm)
       ' Inizializza a 0 la barra di avanzamento
       .RetStatus.Width = 0
       .Status.Caption = "0%"
        DoCmd.RepaintObject
   End With
End Function
Function ProgressBar(Valore As Integer)
        'Ciclo di progressione Barra...
   Dim Del As Integer
   Dim nPercento As Single
   Dim nOld As Byte
   If Valore < 2 Then nOld = 0
   With Forms(strForm)
      ' Ciclo Delay
      For Del = 1 To 5000
          DoEvents
      Next
      nPercento = (Valore / MaxBar)
      If Int(nPercento * 100) <> nOld Then
          ' Aggiorna la barra di avanzamento
          .RetStatus.Width = CInt(Forms(strForm).Status.Width * nPercento)
          .Status.Caption = Int(nPercento * 100) & "%"
          DoCmd.RepaintObject
          nOld = Int(nPercento * 100)
      End If
   End With
la parte del trasferimento è:
......
strSQL_ex = "SELECT * FROM A WHERE AND OR etc... "
strSQL_ex_Cnt = "SELECT COUNT(*) AS Conteggio FROM A"
Set RS_ex = db_ex.OpenRecordset(strSQL_ex, dbOpenDynaset)
Init_Barra (Rs_ex_Count("Conteggio"))
x = 1
Do Until RS_ex.EOF
 Rs_In.AddNew
 For fld = 0 To RS_ex.Fields.Count - 1
 Rs_In(fld).Value = RS_ex(fld).Value
  Next
 Rs_In.Update
RS_ex.MoveNext
ProgressBar (x)
x = x + 1
Loop
può essere che tu abbia una soluzione migliore
Ciao
Peppe


La soluzione migliore è rendere il SW affidabile e VELOCE.
Quanto stai facendo oltre che essere inutile, è rischioso
e decisamente ingombrante per il traffico in Rete.
L'Insert di Record in un BE si deve eseguire nel minor
tempo possibile e con la minor probabilità di CRASH.
Questo è indiscutibilmente proporzionato alla minor
quantità di codice da eseguire.
IMPORTANTE LEGGI BENE
La maggior perdita di Tempo nel tuo ciclo è oltretutto dovuta
all'ulteriore Ciclo sull'Insieme Fields.
Se proprio riireni fondamentale dare priorità all'Occhio
dell'utente e non alla sicurezza dati almeno elimina
il ciclo sull'insieme Fields ed inserisci tutto il Record
con una Query unica, significa che lo farai tante volte quanti sono i
records:
 INSERT .....(SELECT * FROM... WHERE ID_PK= RS_ex!ID_PK)
ad esempio.
Giusto per dare un corretto inquadramento alla tua considerazione
iniziale:
1)Non hai inserito una GESTIONE ERRORI
2)Non hai pensato ad usare una TRANSAZIONE per la salvaguardia dei Dati
3)Speriamo che i Record siano meno di 65535(hai usato un INTEGER
   nella Progress Bar)
4)Nella Funzione ProgressBar hai inserito un DELAY di 5000cicli
Sei libero di dare l'importanza alle cose che più ritieni utili "ovviamente"
ma alcune volte ascoltare i consigli validi è buona cosa.
Ciao
-- 
@Alex (Alessandro Baraldi)
