Newsgroup: it.comp.appl.access
Titolo: relazione molti a molti

ciao
ho una tabella Fornitori(idForniore,nomeFornitore) e una
Articoli(idARTICOLO,nomeArticolo),nonche' una tabella intermedia
(idFornitore,idArticolo)che rappresenta gli acquisti che vengono fatti.
ovviamente e' una relazione molti a molti tra forniori e articoli.
voglio fare una query che mi visualizzi la lista di tutti gli articoli
acquistati... con a fianco la casella combinata che raccolga tutti i
fornitori da cui ho acqustato quell'articolo.
se nell'origine record di una maschera ci metto una semplice query fatta
con la innerjoin, mi visualizza tutti gli acquisti effettuati, e quindi mi
ritrovo lo stesso articolo ripetuto su piu record.
ciao grazie
Marta
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 -- 
Se la tabella intermedia si chiama appunto Intermedia.
Per creare una query che visualizzi tutti i nomi degli articoli venduti e
per ogni articolo contenga in un campo calcolato l'elenco dei nomi dei
fornitori dai quali quell'articolo è stato acquistato, prova a fare quanto
indicato qui di seguito.
Creati una query chiamata Query1 che abbia il seguente codice SQL:
SELECT Articoli.nomeArticolo, Fornitori.nomeFornitore
FROM Fornitori INNER JOIN (Articoli INNER JOIN Intermedia ON
Articoli.idARTICOLO = Intermedia.idArticolo) ON Fornitori.idFornitore =
Intermedia.idFornitore
GROUP BY Articoli.nomeArticolo, Fornitori.nomeFornitore;
In un modulo del tuo database memorizza la seguente funzione pubblica:
Public Function Fornitori(Articolo As Variant) As String
Fornitori = ""
Dim rst As DAO.Recordset
Set rst = CurrentDb().OpenRecordset("Query1")
rst.MoveFirst
Do Until rst.EOF
    If rst!nomeArticolo = Articolo Then
        Fornitori = Fornitori & rst!nomeFornitore & ", "
    End If
    rst.MoveNext
Loop
Fornitori = Left(Fornitori, Len(Fornitori) - 2)
Set rst = Nothing
A questo punto creati la query che dovrebbe darti il risultato cercato e che
deve avere il seguente codice SQL:
SELECT Query1.nomeArticolo, Fornitori([nomeArticolo]) AS nomiForn
FROM Query1
GROUP BY Query1.nomeArticolo;
La funzione di cui sopra fa riferimento alla libreria Microsoft DAO quindi,
se usi una versione di Access successiva ad Access 97 devi aggiungere al tuo
database i riferimenti a tale libreria.
-- 
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

 GROUP BY Query1.nomeArticolo;
funiona, pero' in questo modo nella casella combinata DEI FORNITOri mi
compare una stringa del tipo "fornitore1;fornitore2", mentre vorrei che i
2 fornitori fossero visualizzati in 2 righe diverse della casella
combinata.


 -- 
Forse è bene che tu spieghi meglio cosa ti serve.
Nel tuo primo messaggio dici che vuoi "fare una query che mi visualizzi la
lista di tutti gli articoli acquistati... con a fianco la casella combinata
che..."; c'è però un particolare e neppure tanto piccolo: le query non
possono contenere caselle combinate, che possono esistere solamente nelle
maschere e nei report; nella mia soluzione ho allora sostituito la tua
"casella combinata" con un campo calcolato che contiene le ragioni sociali
dei fornitori scandite da una virgola; ma a quanto pare così non ti sta bene
ed io, non essendo un indovino, non ho voglia di mettermi ad ipotizzare cosa
ti serva.
Devi poi spiegarci in cosa consiste quella che tu chiami "la lista di tutti
gli articoli acquistati": è una maschera?
Se si, che tipo di visualizzazione ha?
Se sarai più precisa eviterai di procurare a tutti inutili perdite di tempo,
e forse qualcuno riuscirà a dare una soluzione al tuo problema.


 wrote in message
news:lZ4Xb.5326$FJ6.1...@twister1.libero.it...

Azzz.....
Tempo fa (ai tempi di LBO), su questo ns la gente era un po' più gentile di
così......
Comunque..
Potresti fare una query che joini la tabella intermedia a quella articoli e
q quella fornitori (per trascodificare i nomi).
Ricordati di fare una group by cod. fornitore/cod.articolo se nella tabella
ogni coppia articolo/fornitore compare più di una volta come presumo.
Poi potresti provare a mettere nel source della casella combinata un dlookup
del tipo:
dlookup("Nome fornitore";"Vista";"WHERE [Codice articolo]=' " & [codice
articolo] & " ' ")
Ricordati gli apici singoli se il campo è alfanumerico.
Non sarà il massimo della performance, ma dovrebbe funzionare.
Indicizza (se non lo sono già) i campi cod.articolo e codice fornitore nella
intermedia e fammi sapere.
Ciao

 Comunque..
Penso che comunque volevi proporre la tua soluzione a Marta< e non a me,
quindi č lei che dovevi rispondere.
