Newsgroup: it.comp.appl.access
Titolo: Collections ... KO!


 
Il codice dovrebbe essere corretto ma non fa quello che dovrebbe: 
Categories.Item(strCategories) da errore.
E' come se la Collection facesse riferimento al Recordset precedentemente 
aperto, invece che andare per la sua strada.
Per la cronaca, ho appena verificato che il codice funziona perfettamente 
con il preistorico Access 97!
 
Saluti e buon anno a tutti.
 
 
 

 aperto, invece che andare per la sua strada.
 
 
E, infatti, se ricorro a una variabile di comodo prima dell'assegnazione 
alla Collection, poi non ci sono problemi:
 
While Rst.EOF = False
 
         TempVar = Rst!Description
 
         Categories.Add TempVar, Rst!CategoryName
 
         Rst.MoveNext
 
Wend
 
 
Mah.
 
Saluti da Simone 
 
 

Simone Calligaris explained :

Io ho sempre usato un For... Naxt:
 
Dim Categories As New Collection, RS as Recordset, i
Set RS = ...
For Each i in RS
   Categories.Add i.Item, i.Key
Next
 
Bruno

Non ho ben capito perchè la Collection salva il riferimento dinamico all'oggetto aperto invece che il valore ma pazienza...
Quello che non comprendo è perchè devi salvare un RS in una Collection...?
 
Hai un motivo particolare...?
 
Io uso spesso Collection di Classi, diciamo che la programmazione OOP si basa su questo... ad esempio la Collection CONTROLS è una collection di Oggetti...
 
Mi sfugge il senso di quanto hai testato, salvo non sia solo sperimentale.
Sai che le Collction sono più lente in certi casi di un Array... ma sono INDICIZZABILI per una KEY che è anche una stringa... o Nome dell'oggetto ad esempio.
 
Qualche cosa mi sfugge...
 
@Alex


 
In effetti quello era un semplice esperimento, posto che il bug esiste ed è 
incomprensibile.
L'utilizzo che m'interessa per le Collection è, appunto, come equivalenti 
degli Arrays "associativi" di PHP e altri linguaggi (accedere per chiave 
univoca alfanumerica invece che solo per Indice, come negli arrays 
tradizionali).
 
Saluti da Simone. 
 
 

 incomprensibile.
[...]
 
Win8.1/Access2013/64bit funziona regolarmente.
 
==========================
Private Sub Command76_Click()
Dim cColl As New Collection, RS As Recordset
 
Set RS = CurrentDb.OpenRecordset("SELECT Assenze.* FROM Assenze;")
 
While RS.EOF = False
    cColl.Add RS![ID], RS![CIP]
    RS.MoveNext
Wend
MsgBox cColl.Count
 
End Sub
===========================
 
Bruno


Bruno riprova il tuo esempio distruggento l'oggetto RS come ha esposto Simone nel suo primo Post... che poi era l'oggetto della stranezza...
 
Tipo:
 
  Rs.Close
  Set Rs = Nothing
 
  MsgBox cColl.Count 
 
@Alex


Quelle due righe le uso solo quando debbo riutilizzare
RS per un altro Set RS..., sempre nell'ambito
drella stessa procedura.
Diversamente a che serve chiudere RS? quando esci
dalla routine si chiude da solo (salvo naturalmente
sia stato definito statico).
Fa tanto programmazione alla MS... cioè una serie
di istruzioni ridondanti che non servono un c...
 
Comunque questa da me funziona regolarmente:
===========================================
Private Sub Command76_Click()
Dim cColl As New Collection, RS As Recordset
 
Set RS = CurrentDb.OpenRecordset("SELECT Assenze.* FROM Assenze;")
 
While RS.EOF = False
    cColl.Add RS![ID], RS![CIP]
    RS.MoveNext
Wend
 
RS.Close
Set RS = Nothing
MsgBox cColl.Count
 
End Sub
====================================
 
Ben risentito per l'anno nuovo e 1/0 auguri!
(chissà che non me la copino i trogloditi degli SMS...)
 
Bruno

 Comunque questa da me funziona regolarmente:
 
(cut)
 
Il codice che ho postato (trasferimento da Recordset a collection e accesso 
per key univoca) non funziona con le versioni di Access > 97, compresa la 
2010.
Comunque si può aggirare il problema, come dicevo, passando per una 
variabile di comodo.
 
Saluti. 
 
 

 aperto, invece che andare per la sua strada.
 
Si, perche' con rst!eccetera gli passi in realta' un riferimento al 
campo del recordset, non il suo valore. 
 
Se invece scrivi : 
 
Categories.Add Rst.Fields("Description").Value, _ Rst.Fields("CategoryName").Value
 
ti funziona che e' una bellezza e senza variabili intermedie.
 
 


 
 
Effettivamente l'inghippo si risolve senza sotterfugi: bravo!
 
Saluti da Simone 
 
 

Simone Calligaris has brought this to us :

Ok, repetita iuvant.
 
Bruno

 Saluti da Simone
 
Ti saluto anch' io
 


 
A proposito, non prendertela per l'altro Thread: mi hai beccato in un 
momento tragico (la nuova IVA per la P.A. inventata dai soliti perdigiorno 
bivaccati a Roma).
 
Saluti.
 
 

 inventata dai soliti perdigiorno bivaccati a Roma).
 
Gia'. Oramai se ne sono accorti tutti che razza di feccia sia.
Tutta. Senza distinzione.