Newsgroup: it.comp.appl.access
Titolo: hash table, possibile?

sto invano cercando nell'help di access vba...
e su google...
e' possibile creare hash table in vba?
o meglio conosciuti come array associativi?
roba del tipo:
Dim ar() as String
ar("indice1") = "pippo"
ar("indice2") = "pluto"
ecc.. ??
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ecc.. ??
L'unico oggetto nativo e diretto è il Recordset.
Puoi accedervi sia con DAO che con ADO, il Metodo Move permette di
spostare
il Bookmark all'indice che serve...!
A questo punto il tuo esempio è da comprendere, sai bene che un
Recordset nella tua
visione dell'array sarebbe meglio vederlo come Array Bidimensionale,
quindi
ar(x,y) dove x=Indice ri riga e Y indice di colonna.
L'indice di colonna è quello da passare alla Collection Fields, membro
dell'oggetto Recordset.
Quindi :
Dim rs as DAO.Recordset
Set rs=CurrentDb.OpenRecordset("SELECT * FROM T1")
rs.Move 100
Msgbox rs.fields(2)
ti mostrerà il campo ad indice 2 del 100° Record(se esiste)
Saluti
@Alex

 Quindi :


ehmmm Alessandro ti ringrazio ma io intendo proprio 
creare una struttura dati come l'array ma con gli indici non numerici..
in modo che posso accedere ai dati contenuti nell'array non tramite
array(0) ma tramite array("pippo") ...
i dati vengono si da una query ma ho bisogno (per evitare altre mille
operazioni) di formare un array di quel tipo.. 
in molti linguaggi si puo' ... (java,php per citare quelli che conosco
bene)
in vba si puote?
o forse ho frainteso il tuo suggerimento... :S


 o forse ho frainteso il tuo suggerimento... :S
Per tè "Pippo" cos'è...?
Il nome del Campo o un valore...?
Nel 2° Caso cosa mai restituirebbe un Array al quale passi il
Valore...???
Non sò se hai capito male quanto detto, ma vorrei capire io meglio la
tua esigenza...!
Ritornando alla collection Fields.... se fai Fields("NomeCampo")
restituisce il valore....!!!
@Alex

"acMad" <ac...@acMad.it> ha scritto nel messaggio 
news:egftnl$jk6$1...@news.newsland.it...

Forse acMad intende una struttura dati astratta che può usare qualsiasi tipo 
di dato come indice. Se è così, gli serve per una ricerca non basata su 
confronti di chiavi, ma per accedere direttamente ai dati trasformando 
aritmeticamente le chiavi in indirizzi della tabella.
Non ho assolutamente idea se con access si possa fare. Puoi provare GetRows 
(ADO) che prende i dati del recordset e li trasferisce in una matrice 
bidimensionale. Ma sempre con indici numerici avrai a che fare.
Ciao.
eSQueL

 o meglio conosciuti come array associativi?
Collezioni (Collection)
--
ac

 bidimensionale. Ma sempre con indici numerici avrai a che fare.
intende questo
clsConfig
--
Option Compare Database
Option Explicit
Private Items As New Collection
Private Sub class_Initialize()
Dim rs As Variant
Set rs = CurrentDb.OpenRecordset("Config")
Do Until rs.EOF
     Items.Add Item:=rs!Valore.value, Key:=rs!Chiave
     rs.MoveNext
Loop
End Sub
Function getItem(pParm As String)
On Error Resume Next
     Set getItem = Items(pParm)
     If Err.Number <> 0 Then
         Err.Clear
         getItem = Items(pParm)
     End If
     If Err.Number <> 0 Then getItem = "<undefined>"
End Function
Sub setItem(pParm As String, pValue As Variant)
On Error Resume Next
     Items.Remove (pParm)
     Items.Add pValue, pParm
End Sub
Genera un array associativo con indice=Chiave
per una tabella (Config) con due attributi.
Usa l'atributo "Chiave" come indice e l'attributo "valore" come valore 
associato a quell'indice
Questo e' un esempio semplice (quello che uso normalmente fa un po' di 
cose in piu')
--
ac

Alessandro Cara ha scritto:





GRANDEEEE!!!
esattamente questo!
grazie...!!


 ha scritto nel messaggio 
news:acNWg.22391$pp1....@tornado.fastwebnet.it...

Me la farò bastare :)
Ciao e grazie
eSQueL

 esattamente questo!
"Impiccione".  Infilarsi in un ramo di 3d di non competenza ;<)
A te avevo risposto solo : Collezioni
--
ac

 Me la farò bastare :)
Non sai cosa perdi! ;<)
--
ac

Alessandro Cara ha scritto:

Fammi capire l'utilità di questo...!
La Key è contenuta nel Recordset e la usi come Key della Collection
che popoli
ciclando l'intero Recordset.
Bene il Metodo Find o FindFirst applicato all'oggetto Recordset invece
cosa
farebbe di così diverso... su un Recordset:
Dim rs as DAO.Recordset
set rs=CurrentDb.OpenRecordset("SELECT Valore,Chiave From
T1",dbreadOnly)
Function GetItem(rs as Dao.Recordset,Key as string)
    rs.findFirst "Key='" & key & "'"
    if rs.nomatch then
        GetItem=""
    Else
        GetItem=rs!Valore
    End If
End Function
Vorrei capire meglio, ho la certezza di perdermi un pezzo, visto che
vedo solo un enorme rallentamento... e conoscendoti sò che non faresti
una cosa inutile...!
@Alex

 una cosa inutile...!
come puoi vedere la classe contiene due metodi ,almeno questa, quella 
che uso di solito e' in grado di gestirmi un po' di altre cose  e la 
eventuale "Load" della Config,o altra tabella a scelta, e' demandata ad 
un metodo apposito.
Il metodo "setitem" mi consente di aggiungere in qualsiasi momento una 
variabile in tipo chiave=valore in cui valore puo' anche essere un 
oggetto complesso (un'altra clsConfig, tanto per intenderci) e 
"gerarchizzare/reticolare" il sistema e soprattutto mi evita di passare 
noiose stringhe fra una funzione e l'altra. In genere passo sempre 
l'oggetto clsConfig oppure ne faccio la set su una variabile locale 
quando mi occorre, come dire, passar montagne nella cruna di un ago.
Ti assicuro che per quanto riguarda le velocita' di esecuzione non posso 
lamentarmi anzi certe volte ho notato dei miglioramenti notevoli 
soprattutto nel caso debba "discutere" con array classici o chiamate 
ripetute a funzioni. Anche rispetto ai metodi findxxx, non ho fatto dei 
confronti, ma ho seri dubbi che siano piu' veloci.
Ha una grossa controindicazione. Nel caso il programma vada in errore mi 
distrugge l'istanza (e' di tipo Public) e sono costretto a ripassare per 
la sua creazione.
Rispetto al rallentamento. Il problema piu' grosso che ho trovato e' che 
ci mette un sacco di tempo a fare la distruzione degli oggetti (set 
nothing) e che se non si sta attenti nella gestione si rischia di avere 
dei "memory leak". Questi problemi affiorano  su oggetti discretamente 
complessi e voluminosi e con interconnessione di puntatori  (i.e. stesso 
oggetto puntato da piu' lati ).
Comunque il tutto e' nato osservando la struttura di "Me" che mi fa 
vedere il debug ed ho avuto un pensiero umile "lo ha fatto la Microsoft? 
posso farlo anch'io!". Ovviamente non  con il semplice esempio che ho 
postato.
Se ci fosse qualche lettore, curioso, in vena di "marcare la panca" 
potrebbe provare con cicli successivi in fattore 10 a rilevare i tempi 
di risposta per find "chiave1" e poi "chiavelast" e .getitem "chiave1" e 
poi "chiavelast" magari anche questo per volumi di record con incrementi 
successivi in fattore 10
A logica penso che in una situazione 100cicli*100items la classe sia 
piu' veloce (forse anche con numeri minori)
Non farmi ripensare ai "tubi" che mi ritorna lo sconforto.
Mi hai fatto scrivere una cifra, schiavista!, la prossima volta uso un 
recordset!  ;<)
Vabbe' se mi fate fare una "lecture" al prossimo CISA faccio vedere 
qualche "strutturina". Magari proprio i "tubi" anche se sono VB + ASP + 
XML + OCX
--
ac

Alessandro Cara ha scritto:
[CUT]

Il senso della cosa mi è chiara, ma lo era anche prima.... io stesso
uso una
classe per le proprietà e metodi Public dell'applicativo, solo che non
uso una collection.
Il motivo...?
Scelta forse..., ed anche il fatto che in qualsiasi modo se implementi
una proprietà
devi sempre mettere mano al codice per leggerla.... quindi
sostanzialmente cambia
poco, nonostante questo convengo che è un sistema elegante e
funzionale.
Sul piano di velocità io non baderei alle 100*100 iterazioni data la
premessa dell'utilizzo
non avverrà mai una cosa simile sull'obiettivo di cui parliamo ma alla
popolazione iniziale
gli accessi in lettura poi sono a SPOT....
E' noto invece che le collection possono agevolare le ricerche, tant'è
che l'uso degli Array
non sempre è una buona soluzione perchè ti obbligano a scorrerli
sempre...
Riposa la mano stanca che non vorrei mi incolpassi della tendinite o
del gomito del tennista...
@Alex