Maschera su filtri multipli e campi nascosti

di il
25 risposte

25 Risposte - Pagina 2

  • Re: Maschera su filtri multipli e campi nascosti

    Ma se faccio un a query tipo:
    SELECT DISTINCT H.TrackID, H.Title
    FROM trackHeader AS H INNER JOIN TrackContribute AS C ON H.TrackID=C.TrackID
    WHERE c.nome = "simone" and c.nome "luigi"
    mi da errore... non posso fare una and tra 2 diverse righe della stessa tabella, sbaglio?

    tipo ora ci sarei riusito con una specie di join ma diventera' una cosa abbastanza grande se coinvolgo tutte le variabili ma potrebbe funzionare
    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 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 "luigi");
    no??
  • Re: Maschera su filtri multipli e campi nascosti

    corky81 ha scritto:


    ma se faccio un a query tipo:
    SELECT DISTINCT H.TrackID, H.Title
    FROM trackHeader AS H INNER JOIN TrackContribute AS C ON H.TrackID=C.TrackID
    WHERE c.nome = "simone" and c.nome "luigi"
    mi da errore... non posso fare una and tra 2 diverse righe della stessa tabella, sbaglio?
    ...
    Ecco cosa c'era che non mi suonava (per restare in argomento) nell'AND quando avevo pensato all'OR o IN: uno stesso record non potrà MAI contenere 2 nomi contemporaneamente. Un classico.
    Ecco che risuona il secondo intervento di @Alex.
    Devi cambiare approccio alla query, in generale. Man mano che aggiungi criteri (e mi limito al nome) la query diventa sempre più complessa, perché devi associare la tabella TrackContribute a se stessa, con l'uso degli Alias, ogni volta che c'è un nome, in modo da ottenere solo le TrackID che hanno corrispondenza e solo a quel punto mettera in join con TrackHeader.
    Prova a costuire in QBE una query con 4 volte la tabella TrackContribute, mettendo in relazione TrackID tra le varie tabelle. Trascina TrackID da una tabella e i 4 campi Nome. Il nome da cercare va indicato nella prima riga del criterio in corrispondenza di ogni campo Nome. A te poi interesserà solo avere TrackID.
    Costruisci questa query e guarda come è fatta in SQL.
    Il recordsource della maschera sarà dato da
    SELECT TrackID, Title FROM trackHeader WHERE TrackID IN (... la SQL di prima ... )
    A grandi linee dovrebbe andare. Un passo alla volta.
  • Re: Maschera su filtri multipli e campi nascosti

    Intendi cosi'??

  • Re: Maschera su filtri multipli e campi nascosti

    corky81 ha scritto:


    intendi cosi'??
    Perfetto, quasi. Manca un campo nome, visto che nella maschere le possibilità di inserimento del nome sono 4. Salvala come query "temporanea" per averla lì da modificare in caso di necessità. Ne copi la SQL e crei un'altra query, direttamente in SQL mettendo insieme quello che avevo detto prima.
  • Re: Maschera su filtri multipli e campi nascosti

    Ok fatto... ho coinvolto solo 3 tabelle, questo il codice:
    SELECT TrackID, Title FROM trackHeader WHERE TrackID IN (
    SELECT DISTINCT TrackContribute.TrackID
    FROM (TrackContribute INNER JOIN TrackContribute AS TrackContribute_1 ON TrackContribute.TrackID = TrackContribute_1.TrackID) INNER JOIN TrackContribute AS TrackContribute_2 ON TrackContribute_1.TrackID = TrackContribute_2.TrackID
    WHERE (((TrackContribute.nome)="simone") AND ((TrackContribute_1.nome)="luigi") AND ((TrackContribute_2.nome)="massimo")));

    ora provo provo ad aggiungere le altre tabelle, genre e mood?? cosi':
    SELECT trackHeader.TrackID, trackHeader.Title
    FROM trackHeader
    WHERE (((trackHeader.[TrackID]) In (SELECT DISTINCT TrackContribute.TrackID
    FROM (((((((TrackContribute INNER JOIN TrackContribute AS TrackContribute_1 ON TrackContribute.TrackID = TrackContribute_1.TrackID) INNER JOIN TrackContribute AS TrackContribute_2 ON TrackContribute_1.TrackID = TrackContribute_2.TrackID) INNER JOIN trackGenre ON TrackContribute_2.TrackID = trackGenre.trackID) INNER JOIN trackGenre AS trackGenre_1 ON trackGenre.trackID = trackGenre_1.trackID) INNER JOIN trackGenre AS trackGenre_2 ON trackGenre_1.trackID = trackGenre_2.trackID) INNER JOIN trackMood ON trackGenre_2.trackID = trackMood.TrackID) INNER JOIN trackMood AS trackMood_1 ON trackMood.TrackID = trackMood_1.TrackID) INNER JOIN trackMood AS trackMood_2 ON trackMood_1.TrackID = trackMood_2.TrackID
    WHERE (((TrackContribute.nome)="simone") AND ((TrackContribute_1.nome)="luigi") AND ((TrackContribute_2.nome)="massimo") AND ((trackGenre.genre)="pop") AND ((trackGenre_1.genre)="indie") AND ((trackGenre_2.genre)="rock") AND ((trackMood.mood)="Bitter") AND ((trackMood_1.mood)="Loving") AND ((trackMood_2.mood)="Passionate")))));
    Cosi' la query funziona, ora non so bene come associarla ai campi.

    non so se sia corretto quello che ho in testa o se ci sia un modo piu' semplice ed efficente...

    pensavo di seguire l'esempio di prima, visto che a cambiare e' solo la where... tipo se ho tutti i campi vuoti uso la query senza il where; se ho qualche campo non nullo parto dal primo e controllo, se non e' nullo aggiunge TrackContribute.nome = """ & cboNome1 & """
    poi controlla il secondo e se non e' nullo aggiunge un altro pezzo alla query....

    credo sia fattibile anche se e' piuttosto incastrato come metodo...

    Phil hai qualche altra dritta da spacciarmi??
  • Re: Maschera su filtri multipli e campi nascosti

    corky81 ha scritto:


    ok fatto... ho coinvolto solo 3 tabelle, questo il codice:
    SELECT TrackID, Title FROM trackHeader WHERE TrackID IN (
    SELECT DISTINCT TrackContribute.TrackID
    FROM (TrackContribute ...);
    Il fatto che tu abbia proseguito e che tutto funzioni ti mette già sulla buona stranda, in tutti i sensi.
    Torno però su una cosuccia: è necessario l'uso di DISTINCT? Così
    SELECT TrackID, Title FROM trackHeader WHERE TrackID IN (
    SELECT TrackContribute.TrackID FROM (TrackContribute ...);
    hai risultati duplicati?
    Per il resto, credo convenga creare una "superquery", tipo quella che hai fatto prima, però parametrica, in qui passi i parametri via codice.
    Leggi come si attribuisce il valore dei parametri via codice
    https://msdn.microsoft.com/en-us/library/office/ff193967.aspx
    http://www.access-programmers.co.uk/forums/showthread.php?t=218925
  • Re: Maschera su filtri multipli e campi nascosti

    Scusa non ho valori duplicati... mi stavo portando dietro il distinct dalla query che avevo fatto prima che aveva duplicati in quanto facevo join di tutto senza usare IN, senza pensare che questa li prende solo da trackHeader senza join

    ora do un occhiata alle pagine che mi hai linkato poi probabilmente tornero' a chiedere qualcosaltro che non capiro'
  • Re: Maschera su filtri multipli e campi nascosti

    Sta cosa dei parametri poi me la riguardo meglio... credo che per ora posso usare me.nomecasellacombinata
    come avevo fatto prima nell'esempio con un solo nome con
        strSQL = "SELECT  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

    La mia domanda ora e':
    Cerco di costruirmi la mia query con degli IF che mi aggiungono pezzi di codice se il contenuto di una cella e' diverso da NULL controllando tutte le 9 celle o mi consigliate un altro metodo?
  • Re: Maschera su filtri multipli e campi nascosti

    corky81 ha scritto:


    sta cosa dei parametri poi me la riguardo meglio... credo che per ora posso usare
    ...
    Cerco di costruirmi la mia query con degli IF che mi aggiungono pezzi di codice se il contenuto di una cella e' diverso da NULL controllando tutte le 9 celle o mi consigliate un altro metodo?
    Rileggiti tutto il thread: la risposta te la sei data da solo (e in futuro potrai dartela da solo, in base a quello che man mano impari)
  • Re: Maschera su filtri multipli e campi nascosti

    Grazie Phil, sei stato gentilissimo! Ho capito che intendi, la risposta me la sono data da solo, chiedevo solo se c'era un modo migliore.

    Ieri ho applicato 3 filtri e funzionava tutto. Poi se riesco più tardi applico anche gli altri ed incollo il codice qui, magari può essere utile a qualcuno.

    Devo mettere una spunta da qualche parte per segnalare che il thread è risolto?
  • Re: Maschera su filtri multipli e campi nascosti

    Grazie a tutti per i consigli, sono riuscito a fare il filtro!!

    se qualcuno dovesse essere interessato ecco il codice che ho usato:
    Dim strSQL As String
    Dim inizio As String
    Dim fine As String
    Dim cong As String
    Dim variab As String
    
    'definisco la parte iniziale della stringa
    inizio = "SELECT trackHeader.TrackID, trackHeader.Title FROM trackHeader WHERE (((trackHeader.[TrackID]) In " & _
            "(SELECT DISTINCT TrackContribute.TrackID FROM (((((((TrackContribute " & _
            "INNER JOIN TrackContribute AS TrackContribute_1 ON TrackContribute.TrackID = TrackContribute_1.TrackID) " & _
            "INNER JOIN TrackContribute AS TrackContribute_2 ON TrackContribute_1.TrackID = TrackContribute_2.TrackID) " & _
            "INNER JOIN trackGenre ON TrackContribute_2.TrackID = trackGenre.trackID) INNER JOIN trackGenre AS trackGenre_1 ON trackGenre.trackID = trackGenre_1.trackID) " & _
            "INNER JOIN trackGenre AS trackGenre_2 ON trackGenre_1.trackID = trackGenre_2.trackID) INNER JOIN trackMood ON trackGenre_2.trackID = trackMood.TrackID) " & _
            "INNER JOIN trackMood AS trackMood_1 ON trackMood.TrackID = trackMood_1.TrackID) INNER JOIN trackMood AS trackMood_2 ON trackMood_1.TrackID = trackMood_2.TrackID " & _
            "WHERE ("
    'definisco la congiunzione che poi diventerá il mio AND ma per la prima volta deve essere nulla
    cong = ""
    'definisco la parte finale della stringa
    fine = "))));"
    
    'controllo tutte le celle, se sono vuote imposto origine dati della maschera tutti i trackID e titoli del mio DB
    If IsNull(Me.cboNome1) And IsNull(Me.cboNome2) And IsNull(Me.cboNome3) And IsNull(Me.cboGenre1) And IsNull(Me.cboGenre2) And IsNull(Me.cboGenre3) And IsNull(Me.cboMood1) And IsNull(Me.cboMood2) And IsNull(Me.cboMood3) Then
       If Me.RecordSource <> "SELECT trackHeader.TrackID, trackHeader.Title FROM trackHeader;" Then
            Me.RecordSource = "SELECT trackHeader.TrackID, trackHeader.Title FROM trackHeader;"
        End If
    Else
    'se ho almeno una combobox non nulla inizio a creare la mia stringa SQL
    strSQL = inizio
    
    'e controllo le singole combobox; per ogni combo non nulla aggiungo un pezzo di codice che mi aggiunge una clausola nell'ultimo where
        If IsNull(Me.cboNome1) = False Then
        strSQL = strSQL & cong & "((TrackContribute.nome) = """ & Me.cboNome1 & """)"
        cong = " AND "
        End If
        
        If IsNull(Me.cboNome2) = False Then
        strSQL = strSQL & cong & "((TrackContribute_1.nome) = """ & Me.cboNome2 & """)"
        cong = " AND "
        End If
        
        If IsNull(Me.cboNome3) = False Then
        strSQL = strSQL & cong & "((TrackContribute_2.nome) = """ & Me.cboNome3 & """)"
        cong = " AND "
        End If
        
        If IsNull(Me.cboGenre1) = False Then
        strSQL = strSQL & cong & "((TrackGenre.genre) = """ & Me.cboGenre1 & """)"
        cong = " AND "
        End If
        
        If IsNull(Me.cboGenre2) = False Then
        strSQL = strSQL & cong & "((TrackGenre_1.genre) = """ & Me.cboGenre2 & """)"
        cong = " AND "
        End If
        
        If IsNull(Me.cboGenre3) = False Then
        strSQL = strSQL & cong & "((TrackGenre_2.genre) = """ & Me.cboGenre3 & """)"
        cong = " AND "
        End If
        
        If IsNull(Me.cboMood1) = False Then
        strSQL = strSQL & cong & "((TrackMood.mood) = """ & Me.cboMood1 & """)"
        cong = " AND "
        End If
        
        If IsNull(Me.cboMood2) = False Then
        strSQL = strSQL & cong & "((TrackMood_1.mood) = """ & Me.cboMood2 & """)"
        cong = " AND "
        End If
        
        If IsNull(Me.cboMood3) = False Then
        strSQL = strSQL & cong & "((TrackMood_2.mood) = """ & Me.cboMood3 & """)"
        cong = " AND "
        End If
        
        Me.RecordSource = strSQL & fine
    End If
Devi accedere o registrarti per scrivere nel forum
25 risposte