Newsgroup: it.comp.lang.visual-basic
Titolo: Matrici dinamiche

Ciao,
ho definito una matrice dinamica a livello di modulo:
Dim aryEsito() as String
e la seguente funzione:
Private Sub RiempiArray(strSQL As String)
1  On Error GoTo errore
2  Dim rs As Recordset
 
3  Set rs = db.OpenRecordset(strSQL, dbOpenSnapShot)
4  Do Until rs.EOF = True
5     ReDim Preserve aryEsito(UBound(aryEsito) + 1)
6     aryEsito(UBound(aryEsito)) = rs.Fields(0).Value
7     rs.MoveNext
8  Loop
9  Exit Sub
10 errore:
11 If Err.Number = 9 Then ReDim aryEsito(0)
12 Resume Next
End Sub
la prima volta che richiamo la procedura ho l'errore 9 sulla riga 5 del codice.
L'errore è sulla funzione UBound in quanto dato che aryEsito non contiene ancora
qualche cosa la UBound fallisce.
Per il momento ho risolto il problema intercettando l'errore ma vi chiedo esiste
un metodo migliore?
Grazie,
Corrado Paoletti
ICQ 7044062

Una soluzione migliore consiste nel contare precedentemente i records e
successivamente assegnare il numero di elementi dell'array:
Dim rs As Recordset
..........
CounterSQL="SELECT COUNT(*) AS NumRec FROM Tua_Tab"
set rs=db.openrecordset(CounterSQL,.....)
NumOfRec=rs("NumRec")
rs.close
Set rs = db.OpenRecordset(strSQL, dbOpenSnapShot)
if numofrec>0 then
  redim aryEsito(numOFRec-1)
  for i=0 to numOFRec-1 
    aryesito(i)=rs("TuoCampo") 
    rs.movenext 
  next i
endif
rs.close
-- 
Remove xxx from E-mail.


----------
Ciao!
L'errore č generato dal fatto che la funzione UBound restituisce l'indice
piů alto dell'array che, al primo "giro", č assolutamente vuoto, nel senso
che l'array stesso non č stato ancora dimensionato. Prova a modificare la
routine cosě:
Private Sub RiempiArray(strSQL As String)
    Dim rs As Recordset
    ReDim aryEsito(0)
    Set rs = db.OpenRecordset(strSQL, dbOpenSnapShot)
    Do Until rs.EOF = True
        ReDim Preserve aryEsito(UBound(aryEsito) + 1)
        aryEsito(UBound(aryEsito)) = rs.Fields(0).Value
        rs.MoveNext
    Loop
    Exit Sub
End Sub
Non ho controllato, ma penso che dovrebbe funzionare.
Fammi sapere
Marco Minerva
http://www.geocities.com/SiliconValley/Foothills/7260/
http://www.armaditaggia.com/marco

L'errore è sulla funzione UBound in quanto dato che aryEsito non contiene


NumOfRec=rs("NumRec")
Volevi dire NumOfRec=rs.RecordCount, vero?

Non ho controllato, ma penso che dovrebbe funzionare.
Mmmmhhh...  sarà.... ma... perchè non usare una Collection ?
Semplificherebbe non poco le cose (leggibilità del codice inclusa) !
Visto che ce le hanno date, usiamole perdiana ! ^___^
Zeross

...

No, penso che volesse proprio dire:
NumOfRec=rs("NumRec")
dopotutto, la query che ha scritto ritorna una tabella (di 1 record) il cui
unico campo contiene il conteggio dei records contenuti in Tua_Tab ;-)
--
Roal Zanazzi
z...@iol.it

unico campo contiene il conteggio dei records contenuti in Tua_Tab ;-)
Ah, beh, allora ritiro tutto

Set rs = db.OpenRecordset(strSQL, dbOpenSnapShot)


il puntatore con recordset.movelast ?
Scusami ma non ho capito cosa intendi. 
Ciao Marco


Ora ho capito: uso questo sistema perchè penso che sia più veloce contare i
records eseguendo un istruzione SQL piuttosto che fare un un movelast ed un
recordcount.
Hai provato per caso a valutare le 2 soluzioni su di un numero molto grande
di records? 
Ciao Marco.



Ciao,
grazie per la risposta.
Purtoppo il mio problema č un po' piů complesso. Questa sub č richiamata da
molte altre sub che concorrono tutte a riempire l'array.
Il fatto di mettere Redim aryEsito(0) all'inizio mi fa perdere sempre il
contenuto dell'array. 
Cmq la soluzione di intercettare l'errore per il momento mi va bene.
A presto,
Corrado Paoletti
ICQ 7044062

Zeross
Ciao,
le Collection non ho ancora avuto il piacere di usarle. Sarà questa la volta
buona!


buona!
Se usi VB6 potresti dare un'occhiata anche agli oggetti Dictionary.
Promettono di essere migliori delle Collection, ma non avendo ancora il VB6
non posso dirti molto di più.
Ciao
Zeross