Newsgroup: it.comp.appl.access
Titolo: come controllare se esiste un item in una Collection?

eccomi di nuovo con le Collection...
stanno funzionando alla grande.. ma su un controllo del genere
if not isNull(idO.Item("PIPPO")) then
 msgbox "Esiste",vbOkOnly
else
 msgbox "Non Esiste",vbOkOnly
end if
se l'elemento PIPPO esiste, bene funzia...
se invece non esiste mi si pianta con un errore
"Invalid procedure call or argument"
possibile? come potrei fare questo controllo?
grazie.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 grazie.
Io faccio così:
    On Error Resume Next
    Dim intValue As Integer
    intValue = mc.Item(intKey).Index
    Exists = (Err.Number = 0)
    Err.Clear
In questo caso io ho passato l'Indice, ma se passi la stringa deve
corrispondere alla KEY...!
@Alex

 corrispondere alla KEY...!
se passi un numerico, a meno che tu non lo faccia per chiarezza, il 
.Index non serve (e neanche.Item)
i.e.
x= mc(3)
ti restituisce il terzo Item
x= m("3") restiuisce la chiave="3"
Se sono stato ovvio ai beg iu padon
--
ac

Alessandro Cara ha scritto:

Non hai visto l'utilità della cosa, ti è sfuggito la visione
globale...!!!
Nella Classe che gectisce una Collection di Classi hai una Property:
Public Property Get Exists(intKey As Integer) As Boolean
    Dim intValue As Integer
    On Error Resume Next
    intValue = mc.Item(intKey).Index
    Exists = (Err.Number = 0)
    Err.Clear
End Property
E' comodo perchè interrogato restituisce un BOOLEAN senza tanti
fronzoli...!
@Alex

     Err.Clear
quindi in pratica Exists sara' 0 se il valore non esiste
altrimenti sara' 1 (se lo preimposto ad 1 prima del controllo)
io avrei voluto risolvere con l'uso dei Dictionary al posto
delle Collection, visto che i primi hanno il metodo Exists che fa proprio
questo genere di controlli.. solo che, pur aggiungendo Microsoft Scripting
Runtime come referenza.. quell'oggetto li non esiste :(
provo e fo sapere.
grazie dell'idea.


 grazie dell'idea.
@Alex

 Ho il sospetto che tu non ti sia spiegato bene...!
mc.Item(intKey) 
e' una Collection di dati che ho creato io... niente di nativo
(hash table, ne ho chiesto qualche messaggio fa)
cmq niente.. ora sembra funzionare.. non e' pulitissimo come codice
ma fa nulla..
grazie lo stesso


 Runtime come referenza.. quell'oggetto li non esiste :(
Il dictionary, per come io uso le collezioni, ha una grossa 
controindicazione. Non esplode l'Item se e' un oggetto (Fa vedere solo 
la chiave)
--
ac

 fronzoli...!
Certo, ma devi gestire la collezione all'interno di una classe.
Se usi la collezione nativa non si puo' (cfr tua property)
al contrario, appunto, del Dictionary che implementa la proprieta' in 
modo nativo
i.e.  mc.Exists(key)     (applicandolo al tuo esempio)
--
ac

 ac
@Alex

 Direi che sbagli ...!
Direi di no.
Dim x as New collection
? x.Exists(key)
non si puo' fare.
Quello che si puo fare e' quello che hai fatto tu.
Non a caso per impostare Exists testi l'Err.number ritornato dalla 
chiamata alla chiave.
Che poi per farlo usi funzione, proprieta', metodo es un'altra historia.
E' questo quello che intendevo
--
ac

 ac
Alcune volte non ti capisco benissimo.....
La proprietà Exist può far parte di una Classe oppure può essere una
proprietà Public/Private:
Nella Classe è evidente l'uso come proprietà di classe...!
Se la Collection non è nella Classe ma è Private in una Form(che
sostanzialmente è la stessa cosa essendo una Classe):
Private mc as New Collection
Private Property Get Exists(intKey As Integer) As Boolean
    On Error Resume Next
    Dim intValue As Integer
    intValue = mc.Item(intKey).Index
    Exists = (Err.Number = 0)
    Err.Clear
End Property
Dove mc è la Collection
Nella mia Form posso fare:
If Me.Exist(mioIndex)=True Then....!
Potrebbe essere una collection dichiarata Public a livello di
Modulo...!
Allora diverrebbe:
Public mc as New Collection
Public Property Get Exists(intKey As Integer) As Boolean
    On Error Resume Next
    Dim intValue As Integer
    intValue = mc.Item(intKey).Index
    Exists = (Err.Number = 0)
    Err.Clear
End Property
L'interrogazione sarebbe:
If Exist(mioINdex)=True then
Saluti
@Alex


Non sei il solo.
Ma parafrasando un poeta "......quale grande si e' mai scelto la strada 
piu' facile e breve...."

Va bene. E' giusto!
If Exist(mioINdex)=True then
questa dice che il "me" (o "this" in altri sistemi, istanza di classe) 
attuale ha una prorietà/metodo che si chiama Exist.
Chi e' il "me" attuale? E' la collezione? No.
e' diverso dire
If Exist(mioINdex)then
da
If mc.Exist(mioINdex)then
dove nel secondo caso "mc" e' una istanza di classe "Collection" che non 
possiede la proprieta' Exist a meno che non la derivi o la estendi 
implementandoci sopra la proprietà/metodo suddetto
Per farla complicata
Hai una istanza di Classe "Scatola".
La "Scatola" non possiede la proprieta' "Nastro".
Fai una classe che estende "Scatola" ci aggiungi la  proprietà "Nastro" 
e la chiami "ScatolaNastrata".
Una istanza di classe "ScatolaNastrata" possiede la proprietà/metodo 
"Nastro" la "Scatola" no.
Tu hai implementato la Property "Exist" su una istanza di classe "Form". 
Se questa la salvi come classe FormConExist possiedera' la "Exist" che 
guarda caso e' in grado di dirti se su una ben specifica "Collection" 
attraverso la proprietà Exist (di Form e non di Collection) una chiave 
esiste o meno.
s.e. & o.
--
ac

 ac
@Alex

 incapsulamento è più consono da usare....!
--
ac