PDA

View Full Version : [ACCESS] Ricerca all'interno di tabelle correlate


marco1474
13-04-2006, 10:38
Ciao, buonasera.
Sto sbattendo la testa su questo archivio ormai da 1 mese e purtroppo non conosco bene access....Cerco aiuto. :muro:
Sto realizzando un archivio per dei brani musicali. Questo archivio ha una tabella principale chiamata COSTANTI dove sono memorizzati i vari record (titoli e altre informazioni dei brani). C'è anche una cartella VARIABILI dove ci sono i titoli secondari dei brani che si trovano in COSTANTI.
Praticamente, ogni [Titolo principale] che si trova in COSTANTI può avere + di un [Titolo] che si trova in VARIABILI.
A legare queste 2 tabelle ci sono i campi [ID]in COSTANTI e [Riferimento ID]in VARIABILI.
Ho realizzato una maschera legata ad una query di selezione per effetuare la ricefca tramite [Titolo principale]. Ovviamente la ricerca dovrà essere eseguita anche su [Titolo]. Il problema è che, se io faccio una ricerca su tutti i brani che iniziano per "A", lui nella maschera mi ripete i [Titolo principale] tutte le volte che trova nel corrispettivo [Titolo] un brano che inizia per "A".
Praticamente, se io ho questo record:

[Titolo principale]=Brocco [ID]=1
[Titolo]=Allready [Riferimento ID]=1
[Titolo]=Assie [Riferimento ID]=1
[Titolo]=Amelia [Riferimento ID]=1

...lui mi mostra 3 volte la stessa maschera anche se tutti e 3 i titoli appartengono allo stesso [ID]=1


Come posso correggere questa cosa? :stordita:

PS se qualcuno vuole posso passargli il file. :)

marco1474
13-04-2006, 18:15
Nessuno può aiutarmi?

Viperfish
18-04-2006, 13:22
cioè il problema è che ti tira fuori solo i titoli secondari che iniziano per A, mentre tu vorresti titolo che inizia per A seguito da titoli secondari a prescindere dall'iniziale?

potresti postare la query che hai utilizzato?

marco1474
19-04-2006, 09:46
cioè il problema è che ti tira fuori solo i titoli secondari che iniziano per A, mentre tu vorresti titolo che inizia per A seguito da titoli secondari a prescindere dall'iniziale?

potresti postare la query che hai utilizzato?


Ciao, e grazie tantissimo per la risposta. :)

Non prorpio.

Se nella query inserisco solo la tabella COSTANTI, inserendo "A" lui mi tira fuori tutti i record che iniziano per "A". Ho realizzato una maschera per cui, ogni volta che mostra un record proveniente dalla query, lui associa i corrispettivi "titoli secondari" a quel "titolo primario" (grazie al campo ID e RIFERIMENTO ID). Fin qui tutto bene, la maschera funziona a meraviglia e anche la query:

SELECT Costanti.ID, Costanti.[Titolo Primario], Costanti.Genere, Costanti.Durata, Costanti.Autori, Costanti.Descrizione, Costanti.SIAE
FROM Costanti
WHERE (((Costanti.[Titolo Primario]) Like [Inserisci il titolo]+"*"))
ORDER BY Costanti.[Titolo Primario];

Il problema è che vorrei effettuare la ricerca in questione anche sui titoli secondari. Quindi creo una relazione tra le 2 tabelle nella query tramite il record ID---->RIFERIMENTO ID.
A questo punto inserisco lo stesso criterio di ricerca anche in VARIABILI sotto la voce [TITOLO] (titoli secondari).
Inserendo "A" mi trovo come risuulatato la maschera con il record principale [titolo primario] BUIACCA poiche nei titoli secondari [titolo] c'è un ALMA. Fin qui tutto perfetto.
Il problema subentra quando ho + di un titolo secondario. Lui mi mostra tante maschere uguali quanti sono i titoli secondari perche lui li vede come tante schede separate.
La query in questione è questa:

SELECT Costanti.ID, Costanti.[Titolo Primario], Costanti.Genere, Costanti.Durata, Costanti.Autori, Costanti.Descrizione, Costanti.SIAE, Variabili.Titolo
FROM Costanti LEFT JOIN Variabili ON Costanti.ID = Variabili.[Riferimento ID]
WHERE (((Costanti.[Titolo Primario]) Like [Inserisci il titolo]+"*")) OR (((Variabili.Titolo) Like [Inserisci il titolo]+"*"))
ORDER BY Costanti.[Titolo Primario];


Se trovassi il modo nella maschera di non mostrare i record con lo stesso [ID], avrei risolto il problema.
Oppure modificare la query....ma non so come.

Puoi aiutarmi? Se vuoi posso passarti l'archivio tramite email o MSN..
Il mio indirizzo è Marco1474@inwind.it

Grazie ancora :)

marco1474
19-04-2006, 10:00
Per farti capire meglio ti posto l'immagine della maschera:



http://img92.imageshack.us/img92/1250/maschera5ws.jpg

Questa maschera in particolare, facendo la query con la lettera "B", esce fuori la maschera di ASTRA poiche nel titolo secondario c'è BOBO. ed è OK poiche la lettera "B" c'è solo nei titoli secondari. Se ci fossero stati + titoli secondari con la "B" lui mi avrebbe fatto vedere questa identica maschera per X volte quante sono i titoli con la "B".



Quest'altra invece si comporta addirittura differentemente:

http://img82.imageshack.us/img82/8823/maschera26ll.jpg

Questa mi viene mostrata 3 volte poiche il tilolo con la "B" è in [titolo primario] e mi viene mostrata per 3 volte poiche i titoli secondari sono 3 e lui li interpreta come 3 singoli risultati anche se hanno lo stesso [ID].

ViolaX
19-04-2006, 13:12
Questo archivio ha una tabella principale chiamata COSTANTI dove sono memorizzati i vari record (titoli e altre informazioni dei brani). C'è anche una cartella VARIABILI dove ci sono i titoli secondari dei brani che si trovano in COSTANTI.
Praticamente, ogni [Titolo principale] che si trova in COSTANTI può avere + di un [Titolo] che si trova in VARIABILI.
A legare queste 2 tabelle ci sono i campi [ID]in COSTANTI e [Riferimento ID]in VARIABILI.
Ho realizzato una maschera legata ad una query di selezione per effetuare la ricefca tramite [Titolo principale]. Ovviamente la ricerca dovrà essere eseguita anche su [Titolo]. Il problema è che, se io faccio una ricerca su tutti i brani che iniziano per "A", lui nella maschera mi ripete i [Titolo principale] tutte le volte che trova nel corrispettivo [Titolo] un brano che inizia per "A".
Praticamente, se io ho questo record:

Ciao, credo che il problema derivi dal Left Join, che reca sempre anche la tabella principale.
Non potresti mettere anche il "Titolo principale" nella cartella "VARIABILI" ?
In questo caso la query sarà solo su "VARIABILI" e dovrai leggere una sola volta tramite ID la tabella "COSTANTI", prima di iniziare il ciclo di composizione della griglia.

La mia spiegazione è un pò caotica, ciao !!!

marco1474
19-04-2006, 13:59
Ciao, credo che il problema derivi dal Left Join, che reca sempre anche la tabella principale.
Non potresti mettere anche il "Titolo principale" nella cartella "VARIABILI" ?
In questo caso la query sarà solo su "VARIABILI" e dovrai leggere una sola volta tramite ID la tabella "COSTANTI", prima di iniziare il ciclo di composizione della griglia.

La mia spiegazione è un pò caotica, ciao !!!


Capito......più tardi provo a fare come dici e poi ti dico se funziona. :)

Grazie 1000 per il sugerimento :)

marco1474
19-04-2006, 16:09
Ciao, credo che il problema derivi dal Left Join, che reca sempre anche la tabella principale.
Non potresti mettere anche il "Titolo principale" nella cartella "VARIABILI" ?
In questo caso la query sarà solo su "VARIABILI" e dovrai leggere una sola volta tramite ID la tabella "COSTANTI", prima di iniziare il ciclo di composizione della griglia.

La mia spiegazione è un pò caotica, ciao !!!


Purtroppo non funziona a livello logico. Potrei inserire una voce [titolo principale] in VARIABILI, ma il risultato non cambierebbe poiche leggerebbe in COSTANTI ogni volta che trova un titolo anche se nella stessa scheda.
Oppure inserire il titolo principale sotto [titolo] in VARIABILI ma a questo punto perderei il titolo principale poiche verrebbe visto come un titolo normale e quindi ripetuto in ogni scheda.
Ci vorrebbe un filtro nella maschera che tenga solo il primo riferimento ID e cancelli i successivi se sono uguali. :muro:

marco1474
19-04-2006, 16:29
Un'idea:

Guardate questa immagine:

http://img82.imageshack.us/img82/8823/maschera26ll.jpg

Cliccando sulla freccetta a destra , lui va al record successivo trovato dalla query. Si può aggiungere a questo comando un istruzione del genere:
[B]SE [ID] UGUALE A [ID DEL PRECEDENTE RECORD] ALLORA VAI AL RECORD SUCCESSIVO.

E' possibile?

ViolaX
19-04-2006, 16:45
Purtroppo non funziona a livello logico. Potrei inserire una voce [titolo principale] in VARIABILI, ma il risultato non cambierebbe poiche leggerebbe in COSTANTI ogni volta che trova un titolo anche se nella stessa scheda.
Oppure inserire il titolo principale sotto [titolo] in VARIABILI ma a questo punto perderei il titolo principale poiche verrebbe visto come un titolo normale e quindi ripetuto in ogni scheda.
Ci vorrebbe un filtro nella maschera che tenga solo il primo riferimento ID e cancelli i successivi se sono uguali. :muro:

Ciao, sapevo di non essermi spiegata; non intendevo "inserire una voce", ma aggiungere un record in VARIABILI che contiene il titolo principale, trattandolo quindi come se fosse secondario.

Comunque, se vuoi un filtro, basta mettere nella query GROUP BY ID, ecc.

Credo che ti stia complicando la vita... se vuoi, invia il sorgente via mail, in qualsiasi momento

marco1474
19-04-2006, 16:59
Ciao, sapevo di non essermi spiegata; non intendevo "inserire una voce", ma aggiungere un record in VARIABILI che contiene il titolo principale, trattandolo quindi come se fosse secondario.

Comunque, se vuoi un filtro, basta mettere nella query GROUP BY ID, ecc.

Credo che ti stia complicando la vita... se vuoi, invia il sorgente via mail, in qualsiasi momento


Te ne sarei immensamente grato.....


Mi dai l'email in PVT? :stordita:

Grazie ancora. :)

PS: Comunque avevo capito.....infatti avevo scritto: "Oppure inserire il titolo principale sotto [titolo] in VARIABILI ma a questo punto perderei il titolo principale poiche verrebbe visto come un titolo normale e quindi ripetuto in ogni scheda. " :D

marco1474
19-04-2006, 18:05
http://img82.imageshack.us/img82/8823/maschera26ll.jpg

Il codice SQL del tasto [RECORD SUCCESSIVO] è il seguente:

Private Sub RecordSuccessivo_Click()
On Error GoTo Err_RecordSuccessivo_Click


DoCmd.GoToRecord , , acNext

Exit_RecordSuccessivo_Click:
Exit Sub

Err_RecordSuccessivo_Click:
MsgBox Err.Description
Resume Exit_RecordSuccessivo_Click

End Sub


Come faccio ad inserirgli il comando:
SE [ID] UGUALE A [ID DEL PRECEDENTE RECORD] ALLORA VAI AL RECORD SUCCESSIVO?

:)

marco1474
20-04-2006, 10:14
Ho risolto il problema grazie a ViolaX che è stata gentilissima.

La query è stata così modificata:


PRIMA:
SELECT Costanti.ID, Costanti.[Titolo Primario], Costanti.Genere, Costanti.Durata, Costanti.Autori, Costanti.Descrizione, Costanti.SIAE, Variabili.Titolo
FROM Costanti LEFT JOIN Variabili ON Costanti.ID = Variabili.[Riferimento ID]
WHERE (((Costanti.[Titolo Primario]) Like [Inserisci il titolo]+"*")) OR (((Variabili.Titolo) Like [Inserisci il titolo]+"*"))
ORDER BY Costanti.[Titolo Primario];

DOPO:
SELECT Costanti.ID, Min(Costanti.[Titolo Primario]) AS [MinDiTitolo Primario], Min(Costanti.Genere) AS MinDiGenere, Min(Costanti.Durata) AS MinDiDurata, Min(Costanti.Autori) AS MinDiAutori, Min(Costanti.Descrizione) AS MinDiDescrizione, Min(Costanti.SIAE) AS MinDiSIAE, Min(Variabili.Titolo) AS MinDiTitolo
FROM Costanti LEFT JOIN Variabili ON Costanti.ID = Variabili.[Riferimento ID]
WHERE (((Costanti.[Titolo Primario]) Like [Inserisci il titolo]+"*")) OR (((Variabili.Titolo) Like [Inserisci il titolo]+"*"))
GROUP BY Costanti.ID
ORDER BY Min(Costanti.[Titolo Primario]);

Ora funziona tutto a perfezione.



Grazie ancora a Viola :)

simobert
27-07-2006, 11:51
Ciao a tutti,
sono Simona, domani ho un esame su visual basic e sql e non ho trovato un argomento che devo sapere: USO DELLE VARIABILI NEL JOIN. Qualcuno può spiegarmelo?
Mandate la risposta a simobert@yahoo.com
aiutatemi!!!