Filtro Maschera con errore EXISTS

di il
4 risposte

Filtro Maschera con errore EXISTS

Buongiorno,
sto portando avanti un database di giochi, a tempo perso e per impratichirmi un poco con Access
Il database è formato da 3 tabelle principali più alcune secondarie
Le 3 principali sono
tblGiochi, nella quale ho un campo chiave IDNomeLocale
tblRelazioniLocali, nella quale ho 3 campi chiave IDNomeLocale, TAGOrigine, IDOrigine
tblOrigini, nella quale ho 2 campi chiave TAGOrigine, IDOrigine

La tblGiochi contiene i titoli dei giochi, con il nome locale che gli attribuisco
questi titoli sono referenziati con le Origini (i siti dai quali recupero i titoli), tramite la relazione di tblRelazioniLocali
Posso avere più origini (cioè siti differenti) relazionate con lo stesso record di tblGiochi

La maschera principale di fatto riprende quelle che sono le relazioni tra le tabelle
Il form principale frmGIOCHI riprende i dati da tblGiochi, poi c'è una sottomaschera frmRelazioniLocali, che contiene una sottomaschera frmOrigini

Fintanto che devo applicare dei filtri ai dati principali (che provengono da tblGiochi), non ho problemi (o utilizzo il pulsante filtro in base a maschera o mi creo dei pulsanti con codice VBA)

Ora però vorrei filtrare tutti i giochi di tblGiochi che hanno un particolare TAGOrigine (passando perciò dalla tblRelazioniLocali)
Di solito mi creo una query e poi copio il codice sql, ma questa volta non funziona ed ottengo l'errore
"È stata scritta una sottoquery che può restituire più campi senza la parola riservata EXISTS nella clausola FROM della query principale. Modificare l'istruzione SELECT della sottoquery per richiedere soltanto un campo."


Questo è il codice che ho ottenuto tramite la creazione della query
SELECT tblGiochi.*
FROM tblGiochi INNER JOIN tblRelazioniLocali ON tblGiochi.IDNomeLocale = tblRelazioniLocali.IDNomeLocale
WHERE (((tblRelazioniLocali.TAGOrigine)="ITCH"));
Ho provato a controllare in internet su come adoperare EXISTS, e fatto poi diversi tentativi, ma nessuno che mi abbia dato il risultato sperato
Tramite ciò che ho letto su https://www.w3schools.com/sql/sql_exists.as
ho riscritto il codice del filtro come segue
((tblGiochi.*)
WHERE EXISTS
    (
    SELECT *
    FROM tblGiochi
    INNER JOIN tblRelazioniLocali ON tblGiochi.IDNomeLocale = tblRelazioniLocali.IDNomeLocale
    WHERE (((tblRelazioniLocali.TAGOrigine)="itch"));
    )
)
Ma in questo modo non ottengo nemmeno un messaggio di errore


Potreste dirmi dove sto sbagliando?

Grazie
Pierpaolo

4 Risposte

  • Re: Filtro Maschera con errore EXISTS

    thetmd ha scritto:


    Il database è formato da 3 tabelle principali più alcune secondarie
    Le 3 principali sono
    tblGiochi, nella quale ho un campo chiave IDNomeLocale
    tblRelazioniLocali, nella quale ho 3 campi chiave IDNomeLocale, TAGOrigine, IDOrigine
    tblOrigini, nella quale ho 2 campi chiave TAGOrigine, IDOrigine
    Trovo scomodo (se non addirittura errato...almeno in questo caso) creare 2 campi chiave primaria...per poi relazionare di conseguenza. Nella tblOrigini crea un unico campo chiave primaria e poi relazioni con tblRelazioniLocali di conseguenza.
  • Re: Filtro Maschera con errore EXISTS

    Ciao Osvaldo,
    grazie per la risposta

    il campo IDOrigine non è un contatore che ho impostato a chiave primaria, ma è l'ID che il sito ha associato al gioco
    Perciò, inizialmente, ipotizzando che più siti potessero adoperare un eventuale stesso numero/codice, considerai di usare 2 chiavi, il TAG (che imposto io, ed è unico per ogni sito) e l'ID recuperato dal sito.
    Utilizzare un campo contatore non mi era sembrato il caso, in quanto non avevo alcuna procedura di aggiornamento dei dati di origine, perciò ogni volta dovevo cancellarli e reinserirli dopo averli recuperato dal sito (tramite un programma di webscraping)...Mi rendo conto che è una cosa assurda, ma il database è nato piano piano, perciò certe scelte iniziali sono dipese da quello che era lo stato del tempo del database e delle utilità che man mano mi creavo.

    Posso comunque utilizzare un unico campo come chiave primaria, impostandolo a quello dell'indirizzo della pagina web del gioco, che tanto sarà sempre differente all'interno del sito stesso e a maggior ragione rispetto agli altri siti. È qualcosa che consideravo di fare già da un po, ma a questo punto penso sia ancora più pratico.

    Ragionando sulla tua risposta poi, m'è venuto in mente che le tabelle tblGiochi e tblOrigini sono collegate, tramite la tabella tblRelazioniLocali, con una relazione 1 a molti. Ma a questo punto penso di poter inserire nella tabella tblOrigini un campo nel quale memorizzare l'IDNomeLocale e sbarazzarmi della tblRelazioniLocali
    Tanto ho escluso, tramite programmazione e i vari form, che una stessa origine non può essere collegata a più nomi locali (è una questione di mia comodità)

    Aggiornerò il database e le maschere, con chiavi primarie singole, ma il form frmGIOCHI dovrà comunque contenere una sottomaschera per mostrare le origini collegate.
    Tornando alla domanda inizialmente posta: in questa nuova configurazione come potrò creare un filtro per visualizzare solo i giochi associati ad uno specifico TAGOrigine?

    Grazie
  • Re: Filtro Maschera con errore EXISTS

    Non è importante che IDOrigine sia per forza "numerazione automatica". È importante che sia UNIVOCO. Da come racconti la cosa sembra proprio di sì. Quindi puoi eleggerlo ugualmente come "chiave primaria".
    Il quadro relazionale con tblRelazioniLocali è "logicamente" corretto. Devi solo relazionare tblOrigini.IDOrigine uno-a-molti tblRelazioniLocali.IDOrigine. E devi eliminare il campo TAGOrigine da tblRelazioniLocali.
  • Re: Filtro Maschera con errore EXISTS

    Rieccomi
    Ho modificato il database in modo da avere una sola chiave primaria nella tabella tblOrigini, e modificato le chiavi primarie nella tblRelazioniLocali, passandole da 3 a 2
    Direi che il database non ha sofferto molto nella modifica. Al momento mantengo la tblRelazioniLocali giusto per non dover cambiare troppo codice (in quanto la gestione delle associazioni tra tblGiochi e tblOrigini è fatta interamente da codice)

    RISOLTO!

    Non ricordo i vari operatori SQL, e di solito uso solo =, ma ho visto che l'operatore IN ha risolto la situazione
    (tblGiochi.IDNomeLocale IN (SELECT tblGiochi.IDNomeLocale
    FROM tblGiochi INNER JOIN (tblOrigini INNER JOIN tblRelazioniLocali ON (tblOrigini.IDOrigine = tblRelazioniLocali.IDOrigine)) ON tblGiochi.IDNomeLocale = tblRelazioniLocali.IDNomeLocale
    WHERE (((tblOrigini.TAGOrigine)="ABS"))
    ORDER BY tblGiochi.NomeLocale;))
    Ora devo solo inserire una combobox per selezionare il TAG per il filtro

    Grazie Osvaldo per il supporto
Devi accedere o registrarti per scrivere nel forum
4 risposte