Maschera su filtri multipli e campi nascosti

di il
25 risposte

Maschera su filtri multipli e campi nascosti

Salve a tutti, sono nuovo nel forum e piuttosto nuovo nell'utilizzo di Access quindi scusate se sbaglio termini o sono poco chiaro. cerco di esporre il mio problema.

Questo è lo schema ER:



e vorrei creare una maschera tipo la successiva immagine che mi applichi i diversi filtri:



Cerco di spiegare meglio:

nel TrackHeader inserisco id, titolo e data della canzone. Ogni canzone può avere uno o più generi, uno o piu mood, uno o più autori.
Vorrei poter fare delle ricerche in TrackHeader applicando uno o piu filtri ma non ho capito bene come fare, visto che i filtri si basano su altre tabelle, o subform. sapreste darmi qualche dritta o consigliarmi qualche guida? ho provato a cercare in giro ma non sono riuscito a tirarci fuori niente.

supponiamo che simone abbia fatto tutte le canzoni, ma canzone1 e canzone2 con luigi. scrivendo "simone" nel campo name1 e "luigi" nel campo name2, ed applicando il filtro, vorrei visualizzare solo le canzoni fatte da entrambi, cioè canzone1 e canzone2

riesco a cercare quello che mi interessa usando una query sql facendo una join delle tabelle coinvolte ma non so come adattarla alla mia maschera con i campi che cambiano.
Questa è la mia idea di query per selezionare titolo ed id delle canzoni prodotte da simone e luigi:
SELECT DISTINCT H.TrackID, H.Title
FROM ((trackHeader AS H INNER JOIN trackGenre AS G ON H.TrackID=G.trackID) INNER JOIN trackMood AS M ON H.TrackID=M.TrackID) INNER JOIN TrackContribute AS C ON H.TrackID=C.TrackID
WHERE (((H.TrackID) In 
(SELECT DISTINCT H.TrackID FROM ((trackHeader AS H INNER JOIN trackGenre AS G ON H.TrackID=G.trackID) INNER JOIN trackMood AS M ON H.TrackID=M.TrackID) INNER JOIN TrackContribute AS C ON H.TrackID=C.TrackID GROUP BY H.TrackID,C.nome, G.genre, M.mood having c.nome like "simone")  
And (H.TrackID) In  
(SELECT DISTINCT H.TrackID FROM ((trackHeader AS H INNER JOIN trackGenre AS G ON H.TrackID=G.trackID) INNER JOIN trackMood AS M ON H.TrackID=M.TrackID) INNER JOIN TrackContribute AS C ON H.TrackID=C.TrackID GROUP BY H.TrackID,C.nome, G.genre, M.mood having c.nome like "luigi")));
Qualche consiglio?? grazie in anticipo e spero di essere stato chiaro

25 Risposte

  • Re: Maschera su filtri multipli e campi nascosti

    Ragioniamo per piccoli passi. Innanzitutto le tabelle da coinvolgere in un plurimo gioco di query saranno TrackHeader, TrackContribute, People.
    1) Query1: coinvolgi le 3 tabelle e applichi un filtro Simone OR Luigi. Ti accorgerai che la query mostrerà canzone1 e canzone2, 2 volte. Mentre tutte le altre non di entrambi compariranno una volta sola
    2) Query2: fai una "query di ricerca duplicati" su Query1 che restituirà solo canzone1 e canzone2.
  • Re: Maschera su filtri multipli e campi nascosti

    Ciao Osvaldo, scusa ma non ho capito bene cosa intendi.
    Vorrei innanzitutto ringraziare per la tempestività dirti che per semplicità ho il campo "nome" è già composto da nome e cognome assieme (che è chiave primaria in persone e foreign key in trackcontribute), quindi non occorre coinvolgere la tabella persone.

    ora con il punto 1 intendi che mi creo una query con inner join tra trackheader e track contribute on trackid?
    tipo:
    SELECT H.TrackID, h.title
    FROM trackHeader AS H INNER JOIN TrackContribute AS C ON H.TrackID=C.TrackID
    where c.nome like "simone" or c.nome like "luigi";
    non ho capito che intendi per applicare il filtro simone or luigi... è proprio quello che non ho capito, perchè io so come applicare un filtro da una casella di testo solo se il campo è visibile
  • Re: Maschera su filtri multipli e campi nascosti

    Se ti va, questo DEMO è riutilizzabile in qualsiasi applicativo senza particolari modifiche... basta importare la maschera [_Filter] ed il codice del Modulo [basEXPORT]... quindi copia il codice richiamato dai Button di apertura.

    La Form si autoconfigura... provala dovrebbe assolvere a svariate forme di utilizzo ed utilità...(salvo BUGS )

    Nel 1° Post ho inserito il File(Zip) aggiornato con le modifiche.
    http://forum.masterdrive.it/access-79/maschera-filtri-86836/
  • Re: Maschera su filtri multipli e campi nascosti

    Grazie per l'esempio

    ho provato ad importare il modulo e la maschera _Filter ed associare ad un qualsiasi bottone all'evento on click il codice:
    Private Sub Command32_Click()
        Call OpenFILTER
    End Sub
    mi da errore "2467 l'espressione inserita fa riferimento ad un oggetto chiuso o non esistente" ma cmq non risolverebbe il mio problema, perchè questo è un filtro che si applica ai campi visibili nella tabella... E' come se nel tuo esempio dovessi filtrare le righe della Master form in base a dei campi della subform details... (Tipo ho un consulente che lavora in piu ditte e filtrando il nome del consulente trovo la lista di tutte le ditte in cui lavora)

    probabilmente ho posto male la domanda e non devo applicare un filtro.

    in sql dovrei fare inner join oppure union tra 2 query ma non so come farlo in access tramite maschere...

    cerco di spiegare di nuovo...

    Simone ha prodotto canzone1, canzone2 e canzone3; Luigi canzone1 e canzone2 e canzone4

    Quindi in TrackHeader avrò i seguenti record
    ID        Title
    001       canzone1
    002       canzone2
    003       canzone3
    004       canzone4
    in TrackContribute:
    ID         nome
    001       simone
    001       luigi
    002       simone
    002       luigi
    003       simone
    004       luigi
    vorrei creare una maschera che mi restituisca solo ID e Titolo della canzone.
    Considerando solo le canzoni fatte da simone E luigi.
    Vorrei quindi avere 2 campi in cui mettere i nomi delle persone ed un bottone che mi applichi il filtro
    quindi se lascio i campi vuoti il risultato sarà "tutte le canzoni", cioè canzone1,canzone2, canzone3 e canzone4.
    se nel primo campo metto simone il risultato sarà canzone1, canzone2 e canzone3.
    se metto simone nel primo e luigi nel secondo avrò solo canzone1 e canzone2

    che potrei ottenere con la query:
    SELECT DISTINCT H.TrackID, H.Title
    FROM trackHeader AS H INNER JOIN TrackContribute AS C ON H.TrackID = C.TrackID
    WHERE H.TrackID In 
    SELECT DISTINCT H1.TrackID FROM trackHeader AS H1 INNER JOIN TrackContribute AS C1 ON H1.TrackID=C1.TrackID GROUP BY H1.TrackID,C1.nome, having c1.nome like "Simone" 
    And 
    H.TrackID In 
    SELECT DISTINCT H2.TrackID FROM trackHeader AS H2 INNER JOIN TrackContribute AS C2 ON H1.TrackID=C1.TrackID GROUP BY H2.TrackID,C2.nome, having c2.nome like "Luigi" 
  • Re: Maschera su filtri multipli e campi nascosti

    Mmmm io credo tu non abbia ben compreso come funziona... oppure io continuo a non capire.

    Se hai una Maschera con un RecordSource(SELECT quello che vuoi) e poi nella maschera visualizzi solo 1 Campo, al Demo non interessa in quanto prende i Campi del RecordSource non quelli visibili...!
    E' evidente che la dove tu abbia un campo FK(Chiave esterna) lui esponga l'ID e non l'AutoLookUp del valore associato...

    In ogni modo quello che chiedi lo puoi fare in molti modi, ritengo potrebbe essere meglio sfruttare una ListBox a selezione Multpla Estesa, con la quale puoi selezionare tutto quello che vuoi... quindi devi ricostruire il Criterio del Filtro o Clausola WHERE a seconda di come operi, isando l'operatore IN...
    
    SELECT * FROM T1 WHERE idAutore IN(1,5,145)
    Ricorda che sarebbe meglio avere un'anagrafica degli Autori, ed usare in modo corretto le Relazioni Molti Autori Molti Brani... e veicolare solo i Campi Relazionali Indicizzati e magari Chiavi primarie, che renderebbero funzionale la Query che ti ho esposto prima.

    Il metodo che hai abozzato è rigido in quanto offre come possibilità solo il Numero di Caselle che metti a disposizione e questo ti obbliga a scrivere una Query SQL o Filtri completamente non efficienti come ho visto fai.

    Penso tuttavia che i miei concetti possano risultarti difficilmente comprensibili ed attuabili.
    Buon lavoro
  • Re: Maschera su filtri multipli e campi nascosti

    corky81 ha scritto:


    Ciao Osvaldo, scusa ma non ho capito bene cosa intendi.
    Vorrei innanzitutto ringraziare per la tempestività dirti che per semplicità ho il campo "nome" è già composto da nome e cognome assieme (che è chiave primaria in persone e foreign key in trackcontribute), quindi non occorre coinvolgere la tabella persone.
    OK.

    corky81 ha scritto:


    ora con il punto 1 intendi che mi creo una query con inner join tra trackheader e track contribute on trackid?
    tipo:
    SELECT H.TrackID, h.title
    FROM trackHeader AS H INNER JOIN TrackContribute AS C ON H.TrackID=C.TrackID
    where c.nome like "simone" or c.nome like "luigi";
    Non sono bravo a leggere le query con SQL, preferisco la visualizzazione struttura. Io ho focalizzato l'attenzione solo sulle tabelle TrackHeader e TrackContribute (possiamo tralasciare People). Cosa rappresenta la tabella Contribute? Perchè la vuoi coinvolgere?

    corky81 ha scritto:


    non ho capito che intendi per applicare il filtro simone or luigi... è proprio quello che non ho capito, perchè io so come applicare un filtro da una casella di testo solo se il campo è visibile
    Sempre facendo riferimento alla visualizzazione struttura query, in corrispondenza del campo Name, il criterio da scrivere è:
    Like "Simone" Or Like "Luigi"
    non so poi cosa appare in SQL...
  • Re: Maschera su filtri multipli e campi nascosti

    Ora sto seguendo una guida trovata online, ma ho fatto dei progressi ma ho un errore magari a voi basta un secondo...

    dunque ora sto provando solo con un nome alla volta, poi se risesco a farlo funzionare con uno vediamo di fare tutto il resto.

    cmq ho fatto una combobox con origine dati i nomi degli autori (il nome e' chiave primaria degli autori per semplicita') dalla quale seleziono il nome di chi ha prodotto i pezzi

    nell'origine dati della form ho lasciato la query che mi visualizza tutti i titoli ed i trackID

    poi ho scritto una macro associata all'evento after update della combobox:
    Private Sub Combo33_AfterUpdate()
    
    On Error GoTo Err_combo33_afterupdate
    
    Dim ssql As String
    Dim bWasFilterOn As Boolean
    
    bWasFilterOn = Me.FilterOn
    
    Dim strSQL As String
    If IsNull(Me.Combo33) Then
       If Me.RecordSource <> "SELECT H.TrackID, H.title FROM trackHeader AS H INNER JOIN TrackContribute AS C ON H.TrackID = C.TrackID;" Then
            Me.RecordSource = "SELECT H.TrackID, H.title FROM trackHeader AS H INNER JOIN TrackContribute AS C ON H.TrackID = C.TrackID;"
        End If
    Else
    
        strSQL = "SELECT DISTINCTROW H.TrackID, H.Title " & _
        "FROM trackHeader AS H INNER JOIN trackContribute AS C ON H.TrackID = C.TrackID " & _
        "WHERE C.nome = " & Me.Combo33 & ";"
        Me.RecordSource = strSQL
    End If
    
    If bWasFilterOn And Not Me.FilterOn Then
        Me.FilterOn = True
    End If
    
    exit_combo33_afterupdate:
        Exit Sub
        
    Err_combo33_afterupdate:
        MsgBox Err.Number & ": " & Err.Description, vbInformation, Me.Module.Name & ".combo33_AfterUpdate"
        Resume exit_combo33_afterupdate
    
    End Sub
    mi esce un errore, in quanto se dalla combobox seleziono il nome "simone" mi si apre questa finestra:


    se in questa finestra ci metto dentro "simone" il filtro funziona.

    ho provato a cambiare il codice "WHERE C.nome = " & Me.Combo33 & usando me.combo33.value ma non funziona

    probabilmente sbaglio comando, o qualcosaltro.... IDEE??
  • Re: Maschera su filtri multipli e campi nascosti

    corky81 ha scritto:


    ...
    
        "FROM trackHeader AS H INNER JOIN trackContribute AS C ON H.TrackID = C.TrackID " & _
        "WHERE C.nome = " & Me.Combo33 & ";"
    
    Si tratta di un campo testo quindi devi racchiudere il valore tra "doppioapice" o "apostrofo", in modo da ottenere la parte finale della SQL così
    WHERE C.nome = "simone";
    oppure
    WHERE C.nome = 'simone';
    (meglio la prima versione, almeno con Access, per evitare quello che in inglese suona bene come "apostrophe catastrophe")
  • Re: Maschera su filtri multipli e campi nascosti

    Ma combo33 e' una combo box in cui io seleziono "simone" e il mio where deve fare riferimento alla combobox, se ci metto where c.nome = "simone" funziona solo con simone ed ogni volta che cambio un nome devo cambiare il codice

    EDIT... Sorry... ho capito che intendi, ora provo

    EDIT di nuovo...
    Era proprio quello l'errore, dovevo mettere gli apici attorno al valore di combo33

    ora ho usato questo codice:
     "WHERE C.nome = """ & Me.Combo33 & """;"
  • Re: Maschera su filtri multipli e campi nascosti

    E mentre io cercavo link ed aiutavo i colleghi a lavorare davvero hai risolto da solo. Ottimo. Ormai quello che avevo scritto non serve più.
  • Re: Maschera su filtri multipli e campi nascosti

    Non proprio risolto tutto, ma almeno e' un inizio

    ora devo capire come completare la ricerca coinvolgendo tutti i campi... cioe' in pratica se metto solo nome1 mi filtra in base a nome1, se metto anche nome2 dovrebbe cercare le canzoni fatte da nome1 e nome2. Appena lo capisco lo scrivo che sicuramente mi consigliate soluzioni piu' efficenti che io non capiro' come al solito
  • Re: Maschera su filtri multipli e campi nascosti

    corky81 ha scritto:


    ...
    ora devo capire come completare la ricerca coinvolgendo tutti i campi... cioe' in pratica se metto solo nome1 mi filtra in base a nome1, se metto anche nome2 dovrebbe cercare le canzoni fatte da nome1 e nome2...
    Con una If verifichi se la combo non è nulla e in caso non lo sia aggiungi alla WHERE.
    A questo punto di converrebbe creare una stringa ad hoc solo per la WHERE dei nomi (dovrai fare la stessa cosa anche per le altre caselle?) così, se diventa più di uno, per evitare di dover costruire
    WHERE nome = "tizio" Or nome = "caio" Or nome = "sempronio" Or nome = "mevio"
    diventi
    WHERE nome IN ("tizio", "caio", "sempronio", "mevio")
  • Re: Maschera su filtri multipli e campi nascosti

    Ma se utilizzo
    WHERE nome IN ("tizio", "caio", "sempronio", "mevio")
    equivale ad una OR, a me servirebbe una AND
  • Re: Maschera su filtri multipli e campi nascosti

    corky81 ha scritto:


    ma se utilizzo
    WHERE nome IN ("tizio", "caio", "sempronio", "mevio")
    equivale ad una OR, a me servirebbe una AND
    Ah, sì, sono andato a rileggere il thread dall'inizio (cosa che non avevo fatto prima) e vedo che vuoi le canzoni con a cui hanno contribuito simone E luigi. Niente, invece dell'OR metti AND e niente IN.
Devi accedere o registrarti per scrivere nel forum
25 risposte