Errore criteri query in sql

di il
8 risposte

Errore criteri query in sql

Buon giorno,
qualche giorno fa ho scritto un thread riguardo una mia difficoltà nel scrivere una query che avesse come criteri delle caselle combinate. Dopo un pò di peripezie sono riuscito (più o meno nel mio intento): il mio scopo era quello di avere una query che pescasse che filtrasse i risultati in base ai valori scelti in delle combobox di una maschera.
Fino a che sono inclusi nei criteri due combobox... ok. Ma ora che devo inserire le restanti due, ho paura di avere sbagliato a scrivere il codice di sql, perchè mi restituisce non solo i valori di ciò che ho scelto nelle combobox ma anche altri (non tutti cmq).
Cosa ho sbagliato?

Codice con due combobx incluse:
PARAMETERS [forms]![Visualizza dati]![CboAnno] Long, [forms]![Visualizza dati]![CboDitta] Text ( 255 );
SELECT Round(Avg([Misurazioni]![assenza_sorgente]),4) AS MF, Round(Avg([Misurazioni]![con_sorgente]),4) AS ML, [ML]-[MF] AS Ms, Round(Var([Misurazioni]![assenza_sorgente]),4) AS [?F^2], Round(Var([Misurazioni]![con_sorgente]),4) AS [?L^2], Round(Sqr(Nz(Var([Misurazioni]![assenza_sorgente]),0)+Nz(Var([Misurazioni]![con_sorgente]),0)),4) AS ?s, Round([Ms]+(Sqr(Nz(Var([Misurazioni]![assenza_sorgente]),0)+Nz(Var([Misurazioni]![con_sorgente]),0)))*3,4) AS [Estremo superiore], Round([Ms]-(Sqr(Nz(Var([Misurazioni]![assenza_sorgente]),0)+Nz(Var([Misurazioni]![con_sorgente]),0)))*3,4) AS [Estremo inferiore], 3*[?s] AS 3?s, Misurazioni.ditta, Misurazioni.anno
FROM Misurazioni
GROUP BY Misurazioni.ditta, Misurazioni.anno
HAVING (((Misurazioni.ditta)=[Maschere]![Visualizza dati]![CboDitta]) AND ((Misurazioni.anno)=[Maschere]![Visualizza dati]![CboAnno])) OR (((Misurazioni.anno)=[Maschere]![Visualizza dati]![CboAnno]) AND (([Maschere]![Visualizza dati]![CboDitta]) Is Null)) OR (((Misurazioni.ditta)=[Maschere]![Visualizza dati]![CboDitta]) AND (([Maschere]![Visualizza dati]![CboAnno]) Is Null)) OR ((([Maschere]![Visualizza dati]![CboDitta]) Is Null) AND (([Maschere]![Visualizza dati]![CboAnno]) Is Null));
codice (sbagliato) con incluse 4 combobox:
PARAMETERS [forms]![Visualizza dati]![CboAnno] Long, [forms]![Visualizza dati]![CboDitta] Text ( 255 ), [forms]![Visualizza dati]![CboOggetto] Text ( 255 ), [forms]![Visualizza dati]![CboDocumento] Text ( 255 );
SELECT Round(Avg([Misurazioni]![assenza_sorgente]),4) AS MF, Round(Avg([Misurazioni]![con_sorgente]),4) AS ML, [ML]-[MF] AS Ms, Round(Var([Misurazioni]![assenza_sorgente]),4) AS [?F^2], Round(Var([Misurazioni]![con_sorgente]),4) AS [?L^2], Round(Sqr(Nz(Var([Misurazioni]![assenza_sorgente]),0)+Nz(Var([Misurazioni]![con_sorgente]),0)),4) AS ?s, Round([Ms]+(Sqr(Nz(Var([Misurazioni]![assenza_sorgente]),0)+Nz(Var([Misurazioni]![con_sorgente]),0)))*3,4) AS [Estremo superiore], Round([Ms]-(Sqr(Nz(Var([Misurazioni]![assenza_sorgente]),0)+Nz(Var([Misurazioni]![con_sorgente]),0)))*3,4) AS [Estremo inferiore], 3*[?s] AS 3?s, Misurazioni.ditta, Misurazioni.anno, Misurazioni.oggetto, Misurazioni.documento
FROM Misurazioni
GROUP BY Misurazioni.ditta, Misurazioni.anno, Misurazioni.oggetto, Misurazioni.documento
HAVING (((Misurazioni.ditta)=[Maschere]![Visualizza dati]![CboDitta]) AND ((Misurazioni.anno)=[Maschere]![Visualizza dati]![CboAnno]) AND ((Misurazioni.oggetto)=[Maschere]![Visualizza dati]![CboOggetto]) AND ((Misurazioni.documento)=[Maschere]![Visualizza dati]![CboDocumento])) OR (((Misurazioni.anno)=[Maschere]![Visualizza dati]![CboAnno]) AND ((Misurazioni.oggetto)=[Maschere]![Visualizza dati]![CboOggetto]) AND ((Misurazioni.documento)=[Maschere]![Visualizza dati]![CboDocumento]) AND (([Maschere]![Visualizza dati]![cboDitta]) Is Null)) OR (((Misurazioni.ditta)=[Maschere]![Visualizza dati]![CboDitta]) AND ((Misurazioni.oggetto)=[Maschere]![Visualizza dati]![CboOggetto]) AND ((Misurazioni.documento)=[Maschere]![Visualizza dati]![CboDocumento]) AND (([Maschere]![Visualizza dati]![CboAnno]) Is Null)) OR (((Misurazioni.ditta)=[Maschere]![Visualizza dati]![CboDitta]) AND ((Misurazioni.anno)=[Maschere]![Visualizza dati]![CboAnno]) AND ((Misurazioni.documento)=[Maschere]![Visualizza dati]![CboDocumento]) AND (([Maschere]![Visualizza dati]![CboOggetto]) Is Null)) OR (((Misurazioni.ditta)=[Maschere]![Visualizza dati]![CboDitta]) AND ((Misurazioni.anno)=[Maschere]![Visualizza dati]![CboAnno]) AND ((Misurazioni.oggetto)=[Maschere]![Visualizza dati]![CboOggetto]) AND (([Maschere]![Visualizza dati]![CboDocumento]) Is Null)) OR ((([Maschere]![Visualizza dati]![cboDitta]) Is Null) AND (([Maschere]![Visualizza dati]![CboAnno]) Is Null) AND (([Maschere]![Visualizza dati]![CboOggetto]) Is Null) AND (([Maschere]![Visualizza dati]![CboDocumento]) Is Null));
Quest'ultimo codice dà il problema.

In ogni caso al seguente link trovate questo database

Link al mio precedente thread: https://www.iprogrammatori.it/forum-programmazione/access/report-che-filtra-valori-vedere-t33413.html

Grazie mille per l'ascolto

Jibi

8 Risposte

  • Re: Errore criteri query in sql

    Nel tuo esporre in modo frammentato i problemi hai ricevuto varie indicazioni più o meno adatte al tuo problema.
    Nel link che hai esposto io ti indicai la strada giusta tecnicamente che poi è la medesima che rinnovo sotto, ma purtroppo hai optato di seguire quelle meno tecniche che risultano all'apparenza più semplici... ma poi inutili e complicate se necessarie ad una logica strutturata.
    Parlo di parametrizzare come hai fatto una query.
    Risulta inefficiente disfunzionale e non consente di sapere cosa sia il filtro ...

    Ti ribadisco che la strada più tecnica e funzionale nonché semplice è quella di sfruttare il parametro WHERE di OpenReport e la proprietà Filter di Form... in questo modo con pochissime righe di codice circa 8 fai tutto con estrema pulizia, proprio perché puoi passare al parametro WHERE di OpenReport esattamente la proprietà Filter senza altre complicazioni.

    Qui trovi un sunto di come approcciarsi al problem a Criteri multipli...
    http://forum.masterdrive.it/microsoft-office-access-vba-23/acces-concatenare-i-filtri-43909/
  • Re: Errore criteri query in sql

    Incurosito sono andato a vedere il tuo progetto e provato ad apportare delle modifiche per renderlo forse più interessante, qui il link
    ***********

    Ci sarebbe comunque, secondo me, da rivedere la struttura delle tabelle dove i campi Ditta, Oggetto, Documento, Meteo dovrebbero essere gestiti tramite delle tabelle specifiche separate e relazionate alla tabella Misurazioni tramite opportuni campi ID.

    Nella tabella Misurazioni bisognerebbe impostare l'obbligatorietà o meno dei campi.

    La maschera mMisurazione sarebbe naturalmente da implementare ulteriormente, almeno nel fatto di impedire l'eventuale possiiblità di creare doppioni.
  • Re: Errore criteri query in sql

    Ringrazio moltissimo Alex e mi scuso con lui per aver seguito un altro metodo che erroneamente consideravo più semplice.
    Ringrazio mltissimo anche Carletto per avermi dato una enorme mano nel propormi quel database da lui fatto. A tal proposito colgo l'occasione per espletare un mio dubbio su un codice da lei scritto. Si tratta del codice chiamato FiltroDati. L'ho un pò modificato secondo le esigenze del database, ma quando vado a inserire la riga con la cmbAnno, mi restituisce errore. Io credo che sia perchè il valore del campo sia numerico e non di testo, allora ho provato a rimuovere le virgolette ma restituisce ancora errore. Dove ho sbagliato ? Forse è il Chr(34)?
    Private Sub FiltroDati()
        strFiltro = ""
        If Not IsNull(Me.cmbDitta) Then strFiltro = strFiltro & IIf(strFiltro = "", "", " AND ") & "Ditta = " & Chr(34) & Me.cmbDitta & Chr(34)
        If Not IsNull(Me.cmbOggetto) Then strFiltro = strFiltro & IIf(strFiltro = "", "", " AND ") & "Oggetto = " & Chr(34) & Me.cmbOggetto & Chr(34)
        If Not IsNull(Me.cmbDocumento) Then strFiltro = strFiltro & IIf(strFiltro = "", "", " AND ") & "Documento = " & Chr(34) & Me.cmbDocumento & Chr(34)
        If Not IsNull(Me.cmbAnno) Then strFiltro = strFiltro & IIf(strFiltro = "", "", " AND ") & "Anno = " & Chr(34) & Me.cmbAnno & Chr(34)
        If strFiltro = "" Then
            Form_Visualizza_dati.FilterOn = False
        Else
            Form_Sottomaschera_vis_dati.Filter = strFiltro
            Form_Sottomaschera_vis_dati.FilterOn = True
        End If
        ImpostaControlli
    End Sub
    PS: ho cambiato i nomi delle maschere ovviamente. La riga incriminata è la numero 6, se si considera la riga Private Sub. Se ci fosse bisogno posto anche il codice ImpostaControlli.

    Grazie mille ad entrambi e buon anno

    Jibi
  • Re: Errore criteri query in sql

    Fai DEBUG sulla stringa [strFiltro] e ti accorgi che hai un pezzo di troppo alla fine... negli esempi che hai visto nei Link infatti c'è un pezzo che tu hai perso... ovvero lo strip del Concatenatore di CRITERI " AND " che sono 5 caratteri finali appunto...!!!!
  • Re: Errore criteri query in sql

    Ho fatto debug e mi si evidenzia questa riga:
    Form_Sottomaschera_vis_dati.Filter = strFiltro
    Comunque intendi questi come i 5 caratteri mancanti? : & "#" ? Il campo Anno è di tipo numerico e non più di tipo data come aveva scritto inizialmente Carletto. Del resto il codice a me sembra uguale al suo
  • Re: Errore criteri query in sql

    La riga di codice
    If Not IsNull(Me.cmbAnno) Then strFiltro = strFiltro & IIf(strFiltro = "", "", " AND ") & "Anno = " & Chr(34) & Me.cmbAnno & Chr(34)
    deve essere modificata in
    If Not IsNull(Me.cmbAnno) Then strFiltro = strFiltro & IIf(strFiltro = "", "", " AND ") & "Anno = " & Me.cmbAnno
    essendo, come hai detto tu, Anno un campo numerico e quindi il suo valore di filtro non deve essere racchiuso ne da doppie virgolette ne da apici.
  • Re: Errore criteri query in sql

    Chiarisci se dai del LEI o se ti rivolgi ad altri quando scrivi... perchè è fraintendibile, ed io non mi voglio introdurre in cose dette da altri che adottano approcci al Forum che non condivido, quindi mi asterrò in tal caso.

    Il Criterio da applicare alla proprietà Filtro si compone così:
    
    Dim strWH as String
    If Len(Me.cmbDitta & "")>0 Then strWh="Ditta='" & Me.cmbDitta & "' AND "
    If Len(Me.cmbOggetto & "")>0 Then strWH=strWH & "Oggetto='" & Me.cmbOggetto & "' AND "
    If Len(Me.cmbDocumento & "")>0 Then  strWH=strWH & "Documento=" & Me.cmbDocumento & " AND "
    If Len(strWH)>0 Then 
        strWH=Mid$(StrWH,1,Len(strWH)-5) 
        Me.FilterOn=False
        Me.Filter=strWh
        Me.FilterOn=True
    End If
    Va da se che se il CAMPO è Testo serve introdurre l'APICE, se è Numerico NO, se è Data va applicata la Formattazione delle Date con il riconoscimento dell'accezione Anglosassone nel caso in cui si usi la Conversione Esplicita.

    Nell'esempio i primi 2 Campi sono Testo il 3° è Numerico... ovviamente sono a titolo di Esempio... tu modificherai a tuo uso.
  • Re: Errore criteri query in sql

    Ringrazio moltissimo entrambi per l'enorme aiuto datomi. Ogni volta che scrivo su questo forum aggiungo un mattone alla conoscenza dei database.
    Grazie

    Jibi
Devi accedere o registrarti per scrivere nel forum
8 risposte