Filtro su query

di il
28 risposte

28 Risposte - Pagina 2

  • Re: Filtro su query

    Prova a giocare 10 or 12

    Ruota di palermo and napoli

    “Giuoca” con giudizio.

  • Re: Filtro su query

    18/10/2023 - sihsandrea ha scritto:


    Ruota di palermo and napoli

    Vabbè… allora prossima App da sviluppare statistiche numeri e ruote ;-))

    ….da piccolo mi ricordo di aver sviluppato un programma in basic e assembler, su tutte le ruota per ruota e tante statistiche … e funzionava alla grande, un pò lentino, ma già con i processori 386 andava alla grande ;-) …. 

    e vabbè…. (mo' Toki mi brontala che sono andato OT … chiedo venia) 
    Buoana serata 

  • Re: Filtro su query

    Ok. sono più basico di quello che ritenevo….

    Mi avete ampiamente aiutato, ora risolverò.

    Grazie mille a tutti

    P.S. Peccato non poter più usare le emoticon, per me davano una bella mano a rendere più “umano” il testo ;-)

  • Re: Filtro su query

    Scusate, non ho risolto…

    Dunque, siccome avrò massimo 3 scelte, ho deciso di creare tre caselle di testo in cui inserire i 3 valori selezionati dalla casella di riepilogo.

    (Ho cercato di riferirmi direttamente alla casella di riepilogo, ma non ho abbastanza strumenti per gestire metodi e proprietà di quell' oggetto)

    A questo punto la query visualizzata nella foto dei post precedenti (modificata con i tre criteri corrispondenti alle 3 caselle di testo)  funziona perfettamente, ma quando cerco di usarla in vba per maneggiare i risultati, con questo codice

    Set dbs = CurrentDb
    Set rstOpticut = dbs.OpenRecordset("tblEtichetteOpticut")
    Set rstTS = dbs.OpenRecordset("qryCommessePezziPerEtichette")

    arrivato alla “Set rstTS” mi da Errore 3061 - Parametri insufficienti, previsto 3 (sono i 3 criteri della query?)

    Se anzichè riferirmi alla query creo la stringa sql:

    strSql = "SELECT tblCommessePezzi.*, tblArticoli.Articolo INTO tblCmmessePezziPerEtichette " & _
            "FROM tblCommessePezzi INNER JOIN tblArticoli ON tblCommessePezzi.IdArticolo = tblArticoli.IDArticolo " & _
            "WHERE tblCommessePezzi.IdCommessa=forms![frmCommesseDaEtichettare]![txt1] Or " & _
            "forms!frmCommesseDaEtichettare!txt2 Or forms!frmCommesseDaEtichettare!txt3"

    e cerco di eseguire il codice:

    Set dbs = CurrentDb
    Set rstOpticut = dbs.OpenRecordset("tblEtichetteOpticut")
    Set rstTS = dbs.OpenRecordset(strSql)

    mi da errore 3219 - Operazione non valida

    verificando il valore di “strSql” nella finestra immediata ottengo:

    SELECT tblCommessePezzi.*, tblArticoli.Articolo INTO tblCmmessePezziPerEtichette FROM tblCommessePezzi INNER JOIN tblArticoli ON tblCommessePezzi.IdArticolo = tblArticoli.IDArticolo WHERE tblCommessePezzi.IdCommessa=329 OR 328 OR 332 
    

    che mi pare corretto….

    P.S. la routine di cui fa parte lo stralcio postato è già esistente e funzionante nel DB, con l'unica differenza che si riferiva ad una commessa sola, ora è nata l'esigenza di utilizzare i dati di più commesse contemporaneamente 

    Riuscite ad aiutarmi ancora per favore?

  • Re: Filtro su query

    strSql = "SELECT tblCommessePezzi.*, tblArticoli.Articolo INTO tblCmmessePezziPerEtichette " & _
            "FROM tblCommessePezzi INNER JOIN tblArticoli ON tblCommessePezzi.IdArticolo = tblArticoli.IDArticolo " & _
            "WHERE tblCommessePezzi.IdCommessa=" & forms![frmCommesseDaEtichettare]![txt1] & _
            " OR tblCommessePezzi.IdCommessa=" & forms!frmCommesseDaEtichettare!txt2 & _
            " OR tblCommessePezzi.IdCommessa=" & forms!frmCommesseDaEtichettare!txt3

    sempre che i tre controlli vengano valorizzati altrimenti riceverai errore.

  • Re: Filtro su query

    19/10/2023 - PocoPratico ha scritto:


    Dunque, siccome avrò massimo 3 scelte, ho deciso di creare tre caselle di testo in cui inserire i 3 valori selezionati dalla casella di riepilogo.

    Ciaoooo,

    Fai attenzione, l'approccio non è corretto.
    Porre dei limiti di scelta “ al massimo 3 ” non è corretto e magari nel tempo ti crea problemi. 

    Cerca di risolvere un problema alla volta, solo così puoi imparare e decidere autonomamente la strada migliore da prendere.

    Per esempio: 
    se vuoi gestire con una casella di riepilogo a multi scelta …  bene , a questo punto ti poni il problema di “come leggo le scelte effettuate” ? 

    Quindi risolvi questo primo passo e metti in una stringa, atta ad essere passata ad una stringa sql, le scelte che hai sffettuato.
    In questo caso devi iterare sulle scelte effettuate e salvarle in una variabile di stringa usando come separatore le Virgole.

    Fatto questo hai risolto il 99% del problema.

  • Re: Filtro su query

    Io utilizzerei lo strumento nativo di Access “Filtro in base a maschera” che assolve a tutti gli Or (anche And) che desideri.

  • Re: Filtro su query

    19/10/2023 - Stifone ha scritto:


    strSql = "SELECT tblCommessePezzi.*, tblArticoli.Articolo INTO tblCmmessePezziPerEtichette " & _
            "FROM tblCommessePezzi INNER JOIN tblArticoli ON tblCommessePezzi.IdArticolo = tblArticoli.IDArticolo " & _
            "WHERE tblCommessePezzi.IdCommessa=" & forms![frmCommesseDaEtichettare]![txt1] & _
            " OR tblCommessePezzi.IdCommessa=" & forms!frmCommesseDaEtichettare!txt2 & _
            " OR tblCommessePezzi.IdCommessa=" & forms!frmCommesseDaEtichettare!txt3

    sempre che i tre controlli vengano valorizzati altrimenti riceverai errore.

    Ciao, per eliminare i 3 controlli fissi , che non è cosa buona da fare, io farei una cosa del genere:

    • poniamo che la casella di riepilogo si chiama : ListBoxTest
    • poniamo per buona la stringa sql sopra riportata

    Esempio:

    Si itera la casella di riepilogo e si costruisce la stringa di parametri e se esistono delle scelte 
    si costruisce la stringa WHERE da concatenare alla stringa Sql
    
    ' set selected string parameters listbox
    Dim i As Integer
    Dim stringWhere As String
    For i = 0 To Me.ListBoxTest.ListCount - 1
        If Me.ListBoxTest.Selected(i) Then
            If stringWhere <> vbNullString Then stringWhere = stringWhere & ","
            stringWhere = stringWhere & Me.ListBoxTest.Column(0, i)
        End If
    Next i
    ' check parameters
    If stringWhere <> vbNullString Then stringWhere = "WHERE tblCommessePezzi.IdCommessa IN (" & stringWhere & ")"
    
    >>>> se stringWhere è vuota, allora non eseguire il resto del codice. <<<<<
    
    ' set sql string
    strSql = "SELECT tblCommessePezzi.*, tblArticoli.Articolo INTO tblCmmessePezziPerEtichette " & _
             "FROM tblCommessePezzi INNER JOIN tblArticoli ON tblCommessePezzi.IdArticolo = tblArticoli.IDArticolo " & _
             stringWhere & ";"

    insomma… una cosa del genere dove eventualmente inserire i controlli necessari per non eseguire il codice se non viene selezionato nulla dalla casella di riepilogo

    ;-)

  • Re: Filtro su query

    19/10/2023 - PocoPratico ha scritto:


    Dunque, siccome avrò massimo 3 scelte, ho deciso di creare tre caselle di testo in cui inserire i 3 valori

    A questo punto, in riferimento a quanto riportato in precedenza, potresti fare una cosa di questo tipo …

    fai questo semplice test per verificare i risultati dove nella stringTest visualizzerai le selezioni che hai fatto e che hai passato alla tua stringa sql:

    ' test string
    Dim stringTest As String
    
    ' set selected parameters listbox
    Dim stringWhere As String
    Dim selectedItem As Variant
    Dim listBox As Access.listBox
    Set listBox = Me.ListBoxTest
    
    ' read the listbox items
    For Each selectedItem In listBox.ItemsSelected
        If stringWhere <> vbNullString Then stringWhere = stringWhere & ","
        stringWhere = stringWhere & listBox.Column(0, selectedItem)
    Next selectedItem
    Set listBox = Nothing
    
    ' check selected
    If stringWhere <> vbNullString Then
        ' set parameters where string
        stringWhere = "WHERE IDArticolo IN (" & stringWhere & ")"
        
        ' set sql string with where parameters
        Dim strSql As String
        strSql = "SELECT tblCommessePezzi.*, tblArticoli.Articolo INTO tblCmmessePezziPerEtichette " & _
             	 "FROM tblCommessePezzi INNER JOIN tblArticoli ON tblCommessePezzi.IdArticolo = tblArticoli.IDArticolo " & _
             	 stringWhere & ";"
        
        ' open recordset
        Dim rs As DAO.Recordset
        Set rs = DBEngine(0)(0).OpenRecordset(strSql)
        ' read recordset
        Do While Not rs.EOF
            stringTest = stringTest & vbCrLf & rs.Fields(0).Value & " - " & rs.Fields(1).Value & " - " & rs.Fields(2).Value
            rs.MoveNext
        Loop
        ' close
        rs.Close
        Set rs = Nothing
    End If
    
    ' message test
    MsgBox stringTest

    Ci sono alcuni cambiamenti rispetto a prima, come per esempio iterare gli elementi selezionati e un controllo per non eseguire la parte di codice con la stringa sql.

    Se vuoi fare dei test , seleziona degli elementi nella casella di riepilogo e poi manda in esecuzione il codice sopra per vedere i risultati.
    Sostituisci Me.ListBoxTest con il nome della tua casella di riepilogo.
    Nelle rs.Fields(0).Value metti l'indice della colonna che vuoi visualizzare come test.

    ;-) 

  • Re: Filtro su query

    La tua idea potrebbe avere un senso, peccato che non può funzionare se non compili SEMPRE tutti e 3 i controlli… e se hai bisogno di 2, e se hai bisogno di 4…? 

    Usa la ListBox in selezione multipla estesa è la soluzione giusta.

    Se componi la cosa da codice non ha minimamente senso quello che fai… non ha senso mettere 3 Criteri se ne serve 1 o 3 se ne servono 5… si validano i controlli e se hanno un criterio si considera altrimenti NO.

    Io userei una ListBox per operare il criterio di selezione, ed una Form o SubForm per visualizzare i risultati.

    Dim stringWhere 	As String
    Dim selectedItem 	As Variant
    For Each selectedItem In Me!ListBoxTest.ItemsSelected
        stringWhere = stringWhere & Me.ListBoxTest.Column(0, selectedItem - 1) & ";"
    Next selectedItem
    If Len(stringWhere)>0 Then 
    	stringWhere = Mid$(stringWhere,1,Len(stringWhere)-1)
    	Me!NomeSubForm.Form.Filter="IDCommessa IN (" & stringWhere & ")"
    	Me!NomeSubForm.Form.FilterOn=True
    Else
    	Me!NomeSubForm.Form.Filter=False
    End if

    Altrimenti con le 3 TextBox

    Dim stringWhere 	As String
    If Len(txtBox1.Value & vbNullstring) Then stringWhere=stringWhere & txtBox1.Value & ","
    If Len(txtBox2.Value & vbNullstring) Then stringWhere=stringWhere & txtBox2.Value & ","
    If Len(txtBox3.Value & vbNullstring) Then stringWhere=stringWhere & txtBox3.Value & ","
    If Len(stringWhere)>0 Then 
    	stringWhere = Mid$(stringWhere,1,Len(stringWhere)-1)
    	Me!NomeSubForm.Form.Filter="IDCommessa IN (" & stringWhere & ")"
    	Me!NomeSubForm.Form.FilterOn=True
    Else
    	Me!NomeSubForm.Form.Filter=False
    End if
  • Re: Filtro su query

    Ohhhhhhh, dunque:

    1_Grazie, grazie, grazie a tutti.
    Non è per nulla scontato chiedere qualcosa ed avere più persone che decidono di regalarti del tempo!!!!!

    2_Il problema presentato nell'ultimo mio post era più che altro a causa dei messaggi d'errore in fase di lettura della SQL.
    Stamattina, ravanando ben bene, mi sono accorto che, (causa i 1000 copia/incolla/cancella/ricopia), c'era nell' SQL un riferimento ad una commessa “tblCommessePezziPerEtichette” che avevo creato e poi cancellato durante le mie infinite prove per bypassare la mia non capacità di gestire le listbox. 
    Individuato il problema il tutto ha funzionato….

    3_In conseguenza del fatto che non ve ne siete accorti neanche voi ;-) , mi avete suggerito un sacco di soluzioni più efficaci, che ho ovviamente adottato!!!!!  così ora ho imparato a leggere direttamente la listbox superando il limite delle 3 txtbox che avevo usato

    Grazie ancora, alla prossima!!!!

  • Re: Filtro su query

    21/10/2023 - PocoPratico ha scritto:


    , c'era nell' SQL un riferimento ad una commessa “tblCommessePezziPerEtichette” che avevo creato e poi cancellato durante le mie infinite prove per bypassare la mia non capacità di gestire le listbox. 
    Individuato il problema il tutto ha funzionato….

    3_In conseguenza del fatto che non ve ne siete accorti neanche voi ;-)

    Se qualcuno scrive selec * fron tabellaclienti ecc…

    Chi risponde presume che esista la tabellaclienti

    Meglio così.

  • Re: Filtro su query

    21/10/2023 - sihsandrea ha scritto:

    Se qualcuno scrive selec * fron tabellaclienti ecc…

    Chi risponde presume che esista la tabellaclienti

    Meglio così.

    Speriamo almeno scriva “SELECT” …

  • Re: Filtro su query

    23/10/2023 - @Alex ha scritto:


    Speriamo almeno scriva “SELECT” …

    E magari pure from…

Devi accedere o registrarti per scrivere nel forum
28 risposte