Newsgroup: it.comp.appl.access
Titolo: Elencare i dati di un campo

Ciao,
ho una tabella che in uno dei campi contiene cognome e nome; in alcuni
record nel suddetto campo appiono più valori, separati da virgola (es.
"Mario Rossi, Carlo Biachi, Giorgio Verdi"). Vorrei fare un'elenco con tutti
i nomi che appaiono in tale campo, messi in ordine alfabetico e senza
duplicati; ma date le mie limitate conoscenze di access non saprei proprio
come fare. Spero in un vostro aiuto.
Grazie

"dastardly" <dast...@NOSPAMMEvirgilio.it> ha scritto nel messaggio 
news:q0JLd.803705$35.31...@news4.tin.it...

prova a vedere se la funzione split può fare al caso tuo.
mettendola in una routine che ti riempie una tabella provvisoria...
se hai problemi fammi sapere  che costruiamo il codice insieme..
ciao
Nick 


Beh, una mano è molto gradita.
Entro un po' più nel dettaglio: ho una maschera di ricerca che, immettendo 
il nome e cognome, presi dal campo della tabella di cui parlavo, mi ricerca 
tutti i record in cui questo compare. La selezione di "cognome nome" gliela 
faccio fare tramite una casella combinata, e vorrei che appunto tale casella 
avesse come origine la lista di tutti i "cognome nome", ed è proprio in 
questo che ho bisogno di una mano.
Il tuo spunto è ottimo, potrei associare una routine all'apertura della 
maschera in questione che mi crei la tabella provvisoria di cui parli e fare 
pescare da questa l'origine della casella combinata. Ho però bisogno del tuo 
aiuto per quanto riguarda il codice.
Confermami anche se è possibile la mia idea: dato che la tabella creata 
dalla routine dovrà, oltre che essere ordinata alfabeticamente, non 
permettere i duplicati, posso impostare proprio il campo 'cognome e nome' 
come chiave primaria; e quindi il valore registrato dalla casella combinata 
sarà effettivamente la relativa stringa, e non il numero ID. E' giusto? 

"dastardly" <dast...@NOSPAMMEvirgilio.it> ha scritto nel messaggio 
news:3oNLd.481354$b5.22...@news3.tin.it...

confermo tutto quello che hai detto :)
allora per iniziare bisogna conoscere i recordset e la funzione split
grossolanamente il codice sarà così:
dim dbs as database, rst as recordset, tabfine as recordset, TmpStr, i 
as long
set dbs =  currentdb
set rst  = dbs.openrecordset ("tabellaconcampi da cercare", 
dbopendynaset)
set tabfine = dbs.openrecordset ("tabellaprovvisoria",dbopendynaset)
do while not rst.eof
     tmpstr = split (rst!campoconnomi)
    for i = 0 to ubound (Tmpstr)
        tabfine.edit
        tabfine!nomecampo = tmpstr(i)
        tabfine.update
    next i
    rst.movenext
loop
questo ti compila la tabella temporanea.
poi per evitare i duplicati o metti gli indici nella tabella temporanea 
e controlli l'errore o usi il raggruppamento...
se hai dubbi sono qua ;)
ciao
Nick 


altro che dubbi :(
premettendo che non ho buone conoscenze ne dei recordset ne di split (mi 
sono documentato un po' sulla guida di VB e in giro su internet), ci sono 
delle cose che mi sono oscure:
. le variabili Long non sono di tipo numerico? perché associ tmpstr 
all'output di split?
. a proposito di split, nell'istruzione che hai scritto non manca il 
separatore? oppure usato con questa sintassi ha un significato che ignoro (e 
che giustificherebbe anche l'uso di variabile Long)?
. la tabella temporanea che conterrebbe la lista dei nomi sarà tabfine 
oppure quella che hai chiamato tabellaprovvisoria? (si nota che non ho 
dimestichezza con i recordset, vero?) e tale tabellaprovvisoria, deve 
esistere già come tabella vuota?
. in ogni caso, provando a compilare il codice che m'hai scritto, avendo 
apportato le (spero) opportune modifiche, si blocca sulla riga
       tabfine.edit
dandomi un errore di run-time: 'Nessun record corrente'. E' un problema 
forse legato alla domanda precedente?
Per ora direi che ne ho messa di carne al fuoco.
Visto che sto abusando abbastanza del tuo aiuto, appurato le mie enooormi 
lacune sulla programmazione in vb, se per caso sai di qualche guida o cose 
simili ben fatte su internet passa il link, così m'istruisco un po' prima di 
farti altre domande stupide.
Grazie 

 Grazie
cerca nei post precedenti ci sono un po' di info... la migliore resta 
cmq 
www.sitocomune.com
 ;)
ciao
Nick 


Ok, ho risolto. Aggiornato il codice come m'hai detto mi dava un errore di 
debug quando trovava un valore già presente nella tabella provvisoria (visto 
che il campo stasso è impostato come chiave primaria); quindi ho aggiunto un 
ciclo che controlla se il dato che sta per aggiungere è già presente prima 
di aggiungerlo; il risultato finale è questo
    Set dbs = CurrentDb
    Set rst = dbs.OpenRecordset("tadella d'origine", dbOpenDynaset)
    Set tabfine = dbs.OpenRecordset("tabellaprovvisoria", dbOpenDynaset)
    Do While Not rst.EOF
        TmpStr = Split(rst!cognomenome, ", ")
        For i = 0 To UBound(TmpStr)
            controllo = False
            tabfine.MoveFirst
            Do While Not tabfine.EOF
                If tabfine!cognomenome = TmpStr(i) Then controllo = True
                tabfine.MoveNext
            Loop
            If controllo = False Then
                tabfine.AddNew
                tabfine!cognomenome = TmpStr(i)
                tabfine.Update
            End If
            Next i
        rst.MoveNext
    Loop
Alla casella combinata ho associato il campo della nuova tabella e tutto 
funge. Il prossimo passo sarà fargli cercare anche parti incomplete del 
nome, cioè se immetto manualmente il cognome Rossi mi trova tutti i campi in 
cui appare (ora se non metto il valore esatto del campo non mi restituisce 
nessun risultato). Ci studierò un po' sopra e vedrò cosa sarò capace di 
fare.
Grazie mille per l'aiuto e per la pazienza.
Ciao