Filtro su query a campi incrociati

di il
19 risposte

19 Risposte - Pagina 2

  • Re: Filtro su query a campi incrociati

    Togli tutti i vari filtri, diretti o tramite Parametri, impostati precedentemente nelle query ed il codice relativo alla maschera M_Costo_Eve_Cap lo sostituisci con il seguente:
    
    Option Compare Database
    Option Explicit
    
    Private Sub esci_Click()
        DoCmd.Close
        DoCmd.OpenForm "MENU_BdT"
    End Sub
    
    Private Sub Form_Load()
        FiltraDati
    End Sub
    
    Private Sub txtAnno_AfterUpdate()
        FiltraDati
    End Sub
    
    Private Sub FiltraDati()
        Me.Filter = "Anno = " & Me.txtAnno
        Me.FilterOn = True
    End Sub
    
    modificando il nome del controllo testo Testo3, che funge da filtro, in txtAnno.
    La prorietà Filter della maschera renderà dinamico il filtro dei dati e l'aggiornamento dei dati della stessa.
    In precedenza mi sono permesso di fare una modifica sulle query:
    • Q_Costo_Eve_Cap
      
      SELECT Eventi.evento, Movimenti.id_capitolo, Movimenti.movimento, Movimenti.data_mov, Year([data_mov]) AS Anno
      FROM Eventi INNER JOIN Movimenti ON Eventi.ID_Eve = Movimenti.id_evento
      GROUP BY Eventi.evento, Movimenti.id_capitolo, Movimenti.movimento, Movimenti.data_mov, Year([data_mov]);
      
      Q_Costo_Eve_Cap_CI
      
      TRANSFORM Int(Sum([movimento])) AS Cap
      SELECT Q_Costo_Eve_Cap.evento, Q_Costo_Eve_Cap.Anno, Int(Sum([movimento])) AS Totale
      FROM Q_Costo_Eve_Cap
      GROUP BY Q_Costo_Eve_Cap.evento, Q_Costo_Eve_Cap.Anno
      PIVOT Q_Costo_Eve_Cap.id_capitolo;
      
    rinominando con l'alias Anno il risultato della funzione Year([data_mov])
  • Re: Filtro su query a campi incrociati

    Ciao Willy,le versioni, mentre facevo tentativi sono state tante, ma non mi è sfuggito eventualmente di riparare un errore evidente. Ora la mia query sicuramente non lo contiene più ma non risponde ugualmente alla maschera.
  • Re: Filtro su query a campi incrociati

    Si Carletto, funziona e te ne sono grato. Era una delle soluzioni a cui si doveva pensare come alternativa immediata.
    Il problema però rimane per un uso che secondo me era congruo di PARAMETERS che invece dava tantissimi problemi alla mia maschera.
    In questo modo il mio problema è risolto ed è quello che conta, ma in futuro cosa mi ha insegnato questo problema se non l'ho risolto?

    E' per questo motivo che chiedo comunque ad Alex se potrà farmi la solita tiratina d'orecchi in riferimento alla strada che stavo percorrendo.
  • Re: Filtro su query a campi incrociati

    antocuomo ha scritto:


    Si Carletto, funziona e te ne sono grato. Era una delle soluzioni a cui si doveva pensare come alternativa immediata.
    Il problema però rimane per un uso che secondo me era congruo di PARAMETERS che invece dava tantissimi problemi alla mia maschera.
    In questo modo il mio problema è risolto ed è quello che conta, ma in futuro cosa mi ha insegnato questo problema se non l'ho risolto?

    E' per questo motivo che chiedo comunque ad Alex se potrà farmi la solita tiratina d'orecchi in riferimento alla strada che stavo percorrendo.
    Premesso che prediligo la gestione della proprietà Filter, personalmente la ritego una comodità estrema nella gestione dei Filtri Flessibili... consente di costruire la Condizione in modo Intelligente senza dover articolare un predicato SQL e farne degradare le prestazioni.
    Tuttavia, Willy ti ha dato la soluzione più pulita, ad esempio:
    Query [Q_Costo_Eve_Cap]
    
    [SELECT Eventi.evento, Movimenti.id_capitolo, Movimenti.movimento, Movimenti.data_mov, Year([data_mov]) AS Anno
    FROM Eventi INNER JOIN Movimenti ON Eventi.ID_Eve = Movimenti.id_evento
    GROUP BY Eventi.evento, Movimenti.id_capitolo, Movimenti.movimento, Movimenti.data_mov, Year([data_mov]), Eventi.ID_Eve
    HAVING (((Year([data_mov]))=[forms]![M_Costo_Eve_Cap].[testo3]));
    di conseguenza la Q_CI [Q_Costo_Eve_Cap_CI]:
    
    TRANSFORM Int(Sum([movimento])) AS Cap
    SELECT Q_Costo_Eve_Cap.evento, Int(Sum([movimento])) AS Totale
    FROM Q_Costo_Eve_Cap
    GROUP BY Q_Costo_Eve_Cap.evento, Q_Costo_Eve_Cap.Anno
    PIVOT Q_Costo_Eve_Cap.id_capitolo;
    
    Il problema di scrivere il Parametro nella Query, è che se non lo valorizzi non vedi nulla, e questo spesso costringe a scrivere una doppia Condizione che obbliga il Motore a risolvere 2 Parametri, quindi in sostanza ad eseguire la Query 2 volte... non è sempre detto nel senso che dipende da come lo si scrive, ma basta analizzare con lo ShowPlan e lo si comprende...
    Il Filtro invece, se non serve non lo si mette..., è comodo anche per generare Report con l'uso della WHERE condition, in quanto basta passare Me.Filter ecc...
  • Re: Filtro su query a campi incrociati

    Vista la panoramica delle soluzioni applicabili, aggiungo, solo per completezza didattica, la implementazione nella versione che impiega la sintassi con parametri.
    Essendo due le query, di cui una in cascata all'altra, i parametri possono essere inseriti nell'una o nell'altra (purché i campi o i valori calcolati siano accessibili attraverso il proprio nome o alias).
    Ad esempio se la query iniziale, da cui si è partiti (M_Costo_Eve_Cap) ha all'interno anche il dato del valore di riferimento con cui selezionare i dati: Year([data_mov]) come alias pari ad "Anno"
    
    SELECT Eventi.evento, Movimenti.id_capitolo, Movimenti.movimento, Movimenti.data_mov, Year([data_mov]) AS Anno
    FROM Eventi INNER JOIN Movimenti ON Eventi.ID_Eve = Movimenti.id_evento
    GROUP BY Eventi.evento, Movimenti.id_capitolo, Movimenti.movimento, Movimenti.data_mov, Year([data_mov]), Eventi.ID_Eve;
    
    si può impostare il valore con cui filtrare i dati anche nella query a campi incrociati (M_Costo_Eve_Cap_Cl) ponendo il parametro ([forms]![M_Costo_Eve_Cap].[testo3]) che verrà associato nella condizione WHERE per estrarre l'anno a cui far riferimento:
    
    PARAMETERS [forms]![M_Costo_Eve_Cap].[testo3] Long;
    TRANSFORM Int(Sum([movimento])) AS Cap
    SELECT Q_Costo_Eve_Cap.evento, Int(Sum([movimento])) AS Totale
    FROM Q_Costo_Eve_Cap
    WHERE (((Q_Costo_Eve_Cap.Anno)=[forms]![M_Costo_Eve_Cap].[testo3]))
    GROUP BY Q_Costo_Eve_Cap.evento, Q_Costo_Eve_Cap.Anno
    PIVOT Q_Costo_Eve_Cap.id_capitolo;
    
    che se andiamo a verificare è similare alla prima query a campi incrociati posta dall'OP (a meno della, erronea, Like al posto della uguaglianza nei criteri) e che non trovava soluzione, come già indicato, per i dati mancanti su cui filtrare i valori annuali.
Devi accedere o registrarti per scrivere nel forum
19 risposte