Casella combinata su una query dinamica

di il
11 risposte

Casella combinata su una query dinamica

Buongiorno a tutti
tutto nelle stessa maschera
una casella combinata che lavora su una query (dinamica_qry) e che apre una lista di nominativi in anagrafe
una casella di testo dove inserire il parziale del nome
un tasto per applicare il criterio alla query dinamica_qry
un altro tasto per resettare la query dinamica_qry e togliere la clausola where
Le routine che cambiano il codice sql in dinamica_qry funzionano bene, infatti se ispeziono dinamica_qry dal pannello vedo che viene impostata sempre correttamente sia quando resetto che quando applico il filtro il nome (es. LIKE '*mario*')
Il problema e' che una volta impostata e registrata la query la casella combinata non lavora con la query aggiornata ma sempre con quella iniziale
se esco in struttura e lascio la query filtrata quando riapro la maschera la casella combinata lavora sul filtrato
se la lascio libera lavora su tutti i nomi in anagrafe
le due sub relative ai tasti applica e resetta:
Option Compare Database

Private Sub pulApplica_Click()
creaquery
[Forms]![RicercaAnagraficaBase]![cboAnagrafica].Requery
End Sub

Private Sub pulReset_Click()
Dim strSQL
strSQL = "SELECT Anagrafiche.ID, Anagrafiche.NOME, Anagrafiche.DATA_ISCRIZIONE, Anagrafiche.CORSO, Anagrafiche.FASE_CORSO, Anagrafiche.ATTIVO, Anagrafiche.NATO_A, Anagrafiche.NATO_IL FROM Anagrafiche ORDER BY Anagrafiche.NOME;"
[Forms]![RicercaAnagraficaBase]![txtNomeParziale].Value = ""
Call UpdateQuery(strSQL)
[Forms]![RicercaAnagraficaBase]![cboAnagrafica].Requery
End Sub
in Private Sub pulApplica_Click()
creaquery lavora correttamente e dinamica_qry viene correttamente redatta e registrata (verificato ispezionandola)
il problema deve essere nel codice sopra
ho gia' provato con il requery della maschera intera [Forms]![RicercaAnagraficaBase].Requery ma senza risultato
qualcuno mi puo' aiutare?

11 Risposte

  • Re: Casella combinata su una query dinamica

    Non so se ho compreso il tuo "ingarbugliato" meccanismo, ma mi pare di capire che dopo aver impostato/applicato un primo filtro, dopo vuoi resettare tutto e ripartire con un nuovo filtro: vero? Se sì, prova a implementare queste istruzioni:
    Me.FilterOn = False
    Me.Filter = ""
    Me.FilterOn = True
  • Re: Casella combinata su una query dinamica

    Gia' provato il filtro non funziona
    anche con questo codice
    Option Compare Database
    
    Private Sub pulApplica_Click()
    'creaquery
    '[Forms]![RicercaAnagraficaBase]![cboAnagrafica].Requery
    If Not IsNull(Me.txtNomeParziale) Then
        Me.Filter = "NOME LIKE '*" & Me.txtNomeParziale & "*'"
        Me.FilterOn = True
        Me.cboAnagrafica.Requery
    End If
    End Sub
    
    
    Private Sub pulReset_Click()
    
    'Dim strSQL
    'strSQL = "SELECT Anagrafiche.ID, Anagrafiche.NOME, Anagrafiche.DATA_ISCRIZIONE, Anagrafiche.CORSO, Anagrafiche.FASE_CORSO, Anagrafiche.ATTIVO, Anagrafiche.NATO_A, Anagrafiche.NATO_IL FROM Anagrafiche ORDER BY Anagrafiche.NOME;"
    '[Forms]![RicercaAnagraficaBase]![txtNomeParziale].Value = ""
    'Call UpdateQuery(strSQL)
    '[Forms]![RicercaAnagraficaBase]![cboAnagrafica].Requery
    Me.txtNomeParziale = ""
    Me.Filter = ""
    Me.FilterOn = False
    Me.cboAnagrafica.Requery
    End Sub
    
    nella barra multifunzione il filtro si illumina quando premo il bottone pulApplica_Click()
    si spegne quando premo pulReset_Click()
    ma nell'elenco della casella combinata appaiono sempre tutti
  • Re: Casella combinata su una query dinamica

    Appare tutto veramente molto casuale e poco strutturato...
    Nella sostanza hai scritto troppo codice per fare nellansostanza nulla... e questo crea confusione.
    Perche hain2 funzioni CreaQuery e UpdateQueey...?
    Nel concreto cosa fanno...? Perche devi cambiare la query...?
    Cosandeve fare la maschera dopo che hai cambiato la query...?

    Il suggerimento di Osvaldo che è rifondato nel senso che bastava il FilterOn=False... oppure filter=vbNullatring e FilterOn=true, le 3 istruzioni sono eccessive..., ma avrebbe un senso se avessi la form filtrata su Filter...
    È così...?
  • Re: Casella combinata su una query dinamica

    Grazie Alex
    creaquery e update query adesso sono disattivati con loro ho fatto un tentativo con queste due funzioni per modificare in tempo reale la query dalla quale attinge la casella combinata ma non riesco a farlo funzionare
    il codice sopra e' invece per un tentativo con i filtri on off
    tieni conto che sto facendo delle prove su un solo criterio (parziale del nome) ma poi i criteri in realta' saranno di piu'
    quallo che voglio realizzare e' che inserendo un criterio (esempio un nome nella casella parziale del nome)

    mi esca la lista corrispondente dalla casella combinata

    Dove sbaglio?
  • Re: Casella combinata su una query dinamica

    Intanto se hai una combo non ha senso fare ricerca parziale...

    Detto questo creare una maschera di filtri è relativamente semplice ma serve avere idee molto chiare... e su questo credo serva lavorare...

    Un filtro composito, ovvero con più condizioni/criteri si semplifica in modo semplice con un'ottica di questo tipo:
    
    Dim strWH As String
    If Len(Me!Controllo1.Value & vbNullstring)>0 Then strWH=strWH & "Campo1=" & Me!Controllo1.Value& " AND "
    If Len(Me!Controllo2.Value & vbNullstring)>0 Then strWH=strWH & "Campo2=" & Me!Controllo2.Value & " AND "
     ' .... aggiungi le altre 1000 condizioni....
    If Len(strWH)>0 then strWH=Mid$(strWH,1,Len(strWH)-5)
    Me.Filter=strWH
    Me.FilterON=True
    Ora è ovvio ed evidente che questo sia un esempio banale... ma abbastanza concreto.

    Se poi vuoi approfondire tecniche più complesse ma ben strutturate per gestire criteri e filtri... puoi studiare questo esempio abbastanza articolato:
    forum.masterdrive.it/access-79/msaccess-gestione-filtri-ordinamento-101267/
  • Re: Casella combinata su una query dinamica

    Grazie Alex
    ho cambiato strada e riesco ad ottenere l'elenco record filtrato/non filtrato aggiornato su una sottomaschera con questo codice
    Private Sub pulApplica_Click()
    Dim myCond
    Dim myFase
    myFase = Me.cboFase.Value
    If Not IsNull(myFase) Then
        myCond = "SELECT * FROM Anagrafiche WHERE FASE_CORSO = '" & myFase & "' ORDER BY NOME"
        Me![SottomascheraPROVA].Form.RecordSource = myCond
        Me![SottomascheraPROVA].Requery
    End If
    End Sub
    
    Private Sub pulReset_Click()
    Dim myCond
    myCond = "SELECT * FROM Anagrafiche ORDER BY NOME"
    Me![SottomascheraPROVA].Form.RecordSource = myCond
    Me![SottomascheraPROVA].Requery
    Me.cboFase.Value = ""
    Me.Requery
    End Sub
    pur tuttavia vorrei avere l'elenco aggiornato sempre nella medesima form dove imposto i criteri e sto provando con una casella di riepilogo
    due semplici bottoni applica filtri resetta filtri
    ma nella casella di riepilogo crpAnagrafica visualizza sempre tutto
    questo il codice ma c'e' qualcosa che non funziona
    Private Sub pulApplica_Click()
    
    Dim myCond
    Dim myFase
    myFase = Me.cboFase.Value
    If Not IsNull(myFase) Then
        myCond = "SELECT * FROM Anagrafiche WHERE FASE_CORSO = '" & myFase & "' ORDER BY NOME"
        Me.RecordSource = myCond
        Me.Requery
        Me.crpAnagrafica.Requery
    End If
    
    End Sub
    
    Private Sub pulReset_Click()
    
    Dim myCond
    myCond = "SELECT * FROM Anagrafiche ORDER BY NOME"
    Me.RecordSource = myCond
    Me.cboFase.Value = ""
    Me.Requery
    Me.crpAnagrafica.Requery
    
    End Sub
    mi puoi aiutare?
  • Re: Casella combinata su una query dinamica

    Risolto!
    Grazie a tutti
  • Re: Casella combinata su una query dinamica

    Spiega ad eventuali lettori come hai fatto con dovizia di particolari per i meno preparati... altrimenti la prossima volta se vorrai un aiuto... saremo costretti a ricordartelo...
  • Re: Casella combinata su una query dinamica

    Allego tutto il codice della form
    ho utilizzato una casella di riepilogo
    e quando imposto i filtri la chiave di volta e' questa:

    Me.crpAnagrafica.RowSource = myCondTot
    Me.crpAnagrafica.Requery

    crpAnagrafica ovviamente e' la casella di riepilogo
    myCondTot e' la strin SQL per i filtri

    questa e' la videata della maschera in questione con tutte le ricerche funzionanti

    Option Compare Database
    
    Private Sub crpAnagrafica_AfterUpdate()
    Me.Requery
    End Sub
    
    Private Sub crpAnagrafica_DblClick(Cancel As Integer)
    DoCmd.OpenForm "ModificaAnagrafica"
    End Sub
    
    Private Sub Form_Current()
    
    End Sub
    
    Private Sub pulApplica_Click()
    
    Dim myCondTot, myCondTesta, myCondCorpo, myCondCoda
    Dim x As Integer
    Dim Arry(24, 1) As Variant
    Dim Arrx(8, 2) As Variant
    
    myCondTesta = "SELECT * FROM qryAnagrafiche"
    myCondCorpo = ""
    myCondCoda = " ORDER BY NOME;"
    
    Arry(0, 0) = Me.txtNomeParziale.Value
    Arry(0, 1) = " NOME LIKE '*" & Arry(0, 0) & "*'"
    Arry(1, 0) = Me.cboFase.Value
    Arry(1, 1) = " FASE_CORSO = '" & Arry(1, 0) & "'"
    Arry(2, 0) = Me.cboCorso.Value
    Arry(2, 1) = " CORSO = '" & Arry(2, 0) & "'"
    Arry(3, 0) = Me.cboExPatente.Value
    Arry(3, 1) = " EX_PATENTE = '" & Arry(3, 0) & "'"
    Arry(4, 0) = Me.txtCitta.Value
    Arry(4, 1) = " CITTA = '" & Arry(4, 0) & "'"
    Arry(5, 0) = Me.txtTelefono.Value
    Arry(5, 1) = " TELEFONO LIKE '*" & Arry(5, 0) & "*'"
    Arry(6, 0) = Me.txtEmail.Value
    Arry(6, 1) = " EMAIL LIKE '*" & Arry(6, 0) & "*'"
    Arry(7, 0) = Me.txtSocial.Value
    Arry(7, 1) = " SOCIAL LIKE '*" & Arry(7, 0) & "*'"
    Arry(8, 0) = Me.cboSex.Value
    Arry(8, 1) = " SEX= '" & Arry(8, 0) & "'"
    Arry(9, 0) = Me.txtVTeoriaDal.Value
    Arry(9, 1) = " T_VOTO >= " & Arry(9, 0)
    Arry(10, 0) = Me.txtVTeoriaAl.Value
    Arry(10, 1) = " T_VOTO <= " & Arry(10, 0)
    Arry(11, 0) = Me.txtVGuidaDal.Value
    Arry(11, 1) = " G_VOTO >= " & Arry(11, 0)
    Arry(12, 0) = Me.txtVGuidaAl.Value
    Arry(12, 1) = " G_VOTO <= " & Arry(12, 0)
    Arry(13, 0) = Me.txtIscrizioneDal.Value
    Arry(13, 1) = " DATA_ISCRIZIONE >= " & Arry(13, 0)
    Arry(14, 0) = Me.txtIscrizioneAl.Value
    Arry(14, 1) = " DATA_ISCRIZIONE <= " & Arry(14, 0)
    Arry(15, 0) = Me.txtNatoDal.Value
    Arry(15, 1) = " NATO_IL >= " & Arry(15, 0)
    Arry(16, 0) = Me.txtNatoAl.Value
    Arry(16, 1) = " NATO_IL <= " & Arry(16, 0)
    Arry(17, 0) = Me.txtTeoriaStartDal.Value
    Arry(17, 1) = " TEORIA_START >= " & Arry(17, 0)
    Arry(18, 0) = Me.txtTeoriaStartAl.Value
    Arry(18, 1) = " TEORIA_START <= " & Arry(18, 0)
    Arry(19, 0) = Me.txtTeoriaEndDal.Value
    Arry(19, 1) = " TEORIA_END >= " & Arry(19, 0)
    Arry(20, 0) = Me.txtTeoriaEndAl.Value
    Arry(20, 1) = " TEORIA_END <= " & Arry(20, 0)
    
    Arry(21, 0) = Me.txtFRosaStartDal.Value
    Arry(21, 1) = " F_ROSA_START >= " & Arry(21, 0)
    Arry(22, 0) = Me.txtFRosaStartAL.Value
    Arry(22, 1) = " F_ROSA_START <= " & Arry(22, 0)
    Arry(23, 0) = Me.txtFRosaEndDal.Value
    Arry(23, 1) = " F_ROSA_END >= " & Arry(23, 0)
    Arry(24, 0) = Me.txtFRosaEndAl.Value
    Arry(24, 1) = " F_ROSA_END <= " & Arry(24, 0)
    
    For x = 0 To 24
        If Len(Arry(x, 0)) > 0 Then
            If Len(myCondCorpo) = 0 Then
                myCondCorpo = Arry(x, 1)
            Else
                myCondCorpo = myCondCorpo & " AND " & Arry(x, 1)
            End If
         End If
    Next x
    
    Arrx(0, 0) = Me.flgAttivo.Value
    Arrx(0, 1) = " ATTIVO = True"
    Arrx(0, 2) = " ATTIVO = False"
    Arrx(1, 0) = Me.flgExtraUe.Value
    Arrx(1, 1) = " EXTRA_UE = True"
    Arrx(1, 2) = " EXTRA_UE = False"
    Arrx(2, 0) = Me.flgAula.Value
    Arrx(2, 1) = " LEZIONI_AULA = True"
    Arrx(2, 2) = " LEZIONI_AULA = False"
    Arrx(3, 0) = Me.flgApp.Value
    Arrx(3, 1) = " APP_REG = True"
    Arrx(3, 2) = " APP_REG = False"
    Arrx(4, 0) = Me.flgScuole.Value
    Arrx(4, 1) = " ALTRE_SCUOLE = True"
    Arrx(4, 2) = " ALTRE_SCUOLE = False"
    Arrx(5, 0) = Me.flgFinanziato.Value
    Arrx(5, 1) = " FINANZIAMENTO = True"
    Arrx(5, 2) = " FINANZIAMENTO = False"
    Arrx(6, 0) = Me.flgSStatino.Value
    Arrx(6, 1) = " STATINO IS NOT NULL"
    Arrx(6, 2) = " STATINO IS NULL"
    Arrx(7, 0) = Me.flgPromo.Value
    Arrx(7, 1) = " PROMOZIONI IS NOT NULL"
    Arrx(7, 2) = " PROMOZIONI IS NULL"
    Arrx(8, 0) = Me.flgAttenzione.Value
    Arrx(8, 1) = " NOTE_VELOCI IS NOT NULL"
    Arrx(8, 2) = " NOTE_VELOCI IS NULL"
    
    For x = 0 To 8
        If Len(Arrx(x, 0)) > 0 Then
            If Arrx(x, 0) = "Si" Then
                If Len(myCondCorpo) = 0 Then
                    myCondCorpo = Arrx(x, 1)
                Else
                    myCondCorpo = myCondCorpo & " AND " & Arrx(x, 1)
                End If
            Else
                If Len(myCondCorpo) = 0 Then
                    myCondCorpo = Arrx(x, 2)
                Else
                    myCondCorpo = myCondCorpo & " AND " & Arrx(x, 2)
                End If
            End If
        End If
    Next x
    
    'ora i controlli sono tutti fatti si puo' scrivere la linea sql
    If Len(myCondCorpo) > 0 Then
        myCondTot = myCondTesta & " WHERE" & myCondCorpo & myCondCoda
    Else
        myCondTot = myCondTesta & myCondCoda
    End If
    
    'e applicarla
    Me.crpAnagrafica.RowSource = myCondTot
    Me.crpAnagrafica.Requery
        
    End Sub
    
    Private Sub pulApplica_Exit(Cancel As Integer)
    Me.Requery
    End Sub
    
    Private Sub pulEdit_Click()
    DoCmd.OpenForm "ModificaAnagrafica"
    End Sub
    
    Private Sub pulReset_Click()
    
    Dim myCondTot
    myCondTot = "SELECT * FROM qryAnagrafiche ORDER BY NOME;"
    Me.txtNomeParziale = ""
    Me.cboFase = ""
    Me.cboCorso = ""
    Me.cboExPatente = ""
    Me.txtCitta = ""
    Me.txtTelefono = ""
    Me.txtEmail = ""
    Me.txtSocial = ""
    Me.cboSex = ""
    
    Me.flgAttivo = ""
    Me.flgExtraUe = ""
    Me.flgAula = ""
    Me.flgApp = ""
    Me.flgScuole = ""
    Me.flgFinanziato = ""
    Me.flgSStatino = ""
    Me.flgPromo = ""
    Me.flgAttenzione = ""
    
    Me.txtVTeoriaDal = ""
    Me.txtVTeoriaAl = ""
    Me.txtVGuidaDal = ""
    Me.txtVGuidaAl = ""
    
    Me.crpAnagrafica.RowSource = myCondTot
    Me.crpAnagrafica.Requery
    
    End Sub
  • Re: Casella combinata su una query dinamica

    Lo sai che quell'array oltreché.a non servire a nulla ti fa perdere il doppio del tempo rispetto al metodo.che ti avevo suggerito io...?
    Se ne sei consapecole farai come meglio credi... basta sia consolidato.
    P.s.... era meglio usare la proprietà Filter ma te ne accorgerai nel tempo e.non insisto.
  • Re: Casella combinata su una query dinamica

    Certamente ci sono mille strade per arrivare al risultato e ovviamente il codice puo' essere migliorato e di molto, questa e' la prima stesura.
    Sono sempre stato abituato a lavorare con gli array fin dai tempi di macchine lente
    A livello di codifica, ai tempi, con gli array era piu' veloce e si risparmiava memoria preziosa piuttosto che scrivere molto codice
    Ora come ora con le macchine attuali penso che la differenza sia trascurabile

    lavorare sul filtro non saprei...
    Me.Filter=strWH
    Me.FilterON=True
    bisogna comunque far lavorare il tutto sulla casella riepilogo s non solo su Me.
    non so se i filtri lavorano su quella e su cio' che diamo in pasto alla crpAnagrafica
    magari faro' una prova
    Grazie moltissimo Alex la tua disponibilita' e' preziosissima
Devi accedere o registrarti per scrivere nel forum
11 risposte