Ricerca caselle combinate a cascata

di il
14 risposte

Ricerca caselle combinate a cascata

Buongiorno a tutti,
ho un problema con una ricerca tramite caselle combinate a cascata.

Ho 3 caselle combinate che ricercano per Anno, Fornitore, Caffè. Andando a selezionare i valori desiderati la sottomaschera dovrebbe caricare solo i dati contenenti quei valori.

Funziona se lo faccio solo per fornitore e caffè ma non per anno. Io credo ci sia un problema quando vado a definire la variabile anno as string, ma ho provato anche con integer, single…praticamente tutte.

In pratica se considero anche la casella combinata anno mi esce la casella di dialogo chiedendo di inserire manualmente il valore parametro “anno arrivo” per due volte, così funziona. Lascio il codice per come funziona, cioè escludendo la ricerca per anno.

Private Sub CasellaCombinata2_AfterUpdate()
Call Criterioricerca
End Sub

Private Sub CasellaCombinata4_AfterUpdate()
Call Criterioricerca
End Sub

Private Sub CasellaCombinata6_AfterUpdate()
Call Criterioricerca
End Sub

Function Criterioricerca()
 'Dim strAnno As String
Dim strFornitore, strCaffe As String
Dim Scegli, strScelta As String

 'If IsNull(Me.CasellaCombinata2) Then
 'strAnno = "[annoarrivo] like '*'"
 'Else
 'strAnno = "[annoarrivo] = " & Me.CasellaCombinata2
 'End If
If IsNull(Me.CasellaCombinata4) Then
strFornitore = "[fornitore] like '*'"
Else
strFornitore = "[fornitore] = '" & Me.CasellaCombinata4 & "'"
End If
If IsNull(Me.CasellaCombinata6) Then
strCaffe = "[caffè] like '*'"
Else
strCaffe = "[caffè] = '" & Me.CasellaCombinata6 & "'"
End If
 'strScelta = strAnno & "and" & strFornitore & "and" & strCaffe
strScelta = strFornitore & "and" & strCaffe
Scegli = "select * from data_q where" & strScelta
Me.Sottomaschera_data_q.Form.RecordSource = Scegli
Me.Sottomaschera_data_q.Form.Requery

End Function

14 Risposte

  • Re: Ricerca caselle combinate a cascata

    Ti pongo due domande: Perché annoarrivo deve essere una stringa e perché avvalersi della proprietà rowsource e non filter.

  • Re: Ricerca caselle combinate a cascata

    03/02/2023 - Antony73 ha scritto:


    Ti pongo due domande: Perché annoarrivo deve essere una stringa e perché avvalersi della proprietà rowsource e non filter.

    Non sono molto esperto e diciamo che ho costruito il codice con ciò che conosco meglio.
    Anno arrivo non deve essere una stringa, ho provato però a definirla anche come integer ma non funziona.

  • Re: Ricerca caselle combinate a cascata

    Io farei qualcosa del genere:

    Function Criterioricerca() as string
    
    dim strWhere as string
    
    If Len(Me.CasellaCombinata4 & vbNullString) > 0 Then strwhere = strwhere & "[fornitore] like '" & Me.CasellaCombinata4 & "*' And "
    If Len(Me.CasellaCombinata6 & vbNullString) > 0 Then strwhere = strwhere & "[caffè] like '" & Me.CasellaCombinata6 & "*' And "
    
    strwhere=strwhere & "annoarrivo=" & me.CasellaCombinata2.value
    
    Criterioricerca=strwhere
    
    end function
    

    dopodichè passerei la funzione alla proprietà filter:

    Me.Sottomaschera_data_q.Form.filter=Criterioricerca
    Me.Sottomaschera_data_q.Form.filteron=true

    Ipotizzando che il controllo me.CasellaCombinata2 sia la combobox che permette la scelta dell'annoarrivo.

    Ho scritto a braccio. Controlla gli errori.

  • Re: Ricerca caselle combinate a cascata

    Una correzione ma concettualmente è abbastanza  corretto:

    Function Criterioricerca() as string
    
    dim strWhere as string
    
    If Len(Me.CasellaCombinata4.value & vbNullString) > 0 Then strwhere = strwhere & "[fornitore] like '" & Me.CasellaCombinata4 & "*' And "
    If Len(Me.CasellaCombinata6.value & vbNullString) > 0 Then strwhere = strwhere & "[caffè] like '" & Me.CasellaCombinata6 & "*' And "
    If Len(me.CasellaCombinata2.value & vbNullString) > 0 Then strwhere = strwhere & "[annoarrivo] =" & Me.CasellaCombinata2 & " And "
    
    If Len(strWhere)>0 Then 
       strwhere=Mid$(strwhere,1,Len(strwhere)-5) ' Serve a togliere [ AND ] finale che altrimenti c'è sempre
    End if
    Criterioricerca=strwhere
    
    end function

    Eventuali altri criteri tipo questo:

    strwhere=strwhere & "annoarrivo=" & me.CasellaCombinata2.value

    non li inserirei nella Funzione citata… perde senso del perchè sia da aggiungere in quel modo…

  • Re: Ricerca caselle combinate a cascata

    Grazie, ora però da un altro tipo di errore.

    Questo è il codice come lo avete inserito voi:

    Altra cosa: se ho nella casella combinata per esempio “ best coffee” e “best”, scegliendo “best” mi da entrambi i risultati.

  • Re: Ricerca caselle combinate a cascata

    Quello non è il codice che ti abbiamo suggerito, infatti il tuo è errato.
    Mi pare tu non abbia le idee chiarissime su cosa è una Funzione e come si usa…!

    La Funzione [CriterioRicerca] è stata usata proprio per restituire la stringa, che poi assegni alla proprietà Filter… se tu sposti nella Funzione l'assegnazione, generi 2 ERRORI.

    1. La funzione non serve a NULLA, basta usare una SUB
    2. La fase di assegnazione, che hai esposto in GIALLO… in quel modo probabilmente rischia di LOPPARE

    GUarda meglio quanto ti ha suggerito Antony73, l'assegnazione viene considerata DOPO ed esterna non interna.

    Per l'altro problema è altrettanto ovvio, avendo composto il criterio con una WildCard… che accetta ricerca PARZIALE, se non ti serve si toglie il LIKE si usa = e si tolgono le WildCard.

  • Re: Ricerca caselle combinate a cascata

    Si partivo dal presupposto che il campo annoarrivo fosse sempre indicato. Per questo non ho previsto di manipolare la stringa con la funzione Mid$. Ma nel caso più generale è piu corretta la tua versione.

    Grazie, ora però da un altro tipo di errore.

    La proprietà filter la devi utilizzare nell'evento afterupdate e non nella funzione.

  • Re: Ricerca caselle combinate a cascata

    Oppure in un pulsante.

  • Re: Ricerca caselle combinate a cascata

    03/02/2023 - @Alex ha scritto:


    Quello non è il codice che ti abbiamo suggerito, infatti il tuo è errato.
    Mi pare tu non abbia le idee chiarissime su cosa è una Funzione e come si usa…!

    La Funzione [CriterioRicerca] è stata usata proprio per restituire la stringa, che poi assegni alla proprietà Filter… se tu sposti nella Funzione l'assegnazione, generi 2 ERRORI.

    1. La funzione non serve a NULLA, basta usare una SUB
    2. La fase di assegnazione, che hai esposto in GIALLO… in quel modo probabilmente rischia di LOPPARE

    GUarda meglio quanto ti ha suggerito Antony73, l'assegnazione viene considerata DOPO ed esterna non interna.

    Per l'altro problema è altrettanto ovvio, avendo composto il criterio con una WildCard… che accetta ricerca PARZIALE, se non ti serve si toglie il LIKE si usa = e si tolgono le WildCard.

    Scusa ma non mi è chiaro ancora. Dopo aver inserito la function creo una sub sull'evento after update della sottosmachera per applicare il filtro?

    Grazie

  • Re: Ricerca caselle combinate a cascata

    Immagina di voler applicare la procedura al controllo casellacombinata4.

    Allora scrivi:

    private sub casellacombinata4_AfterUpdate()
    Me.Sottomaschera_data_q.Form.filter=Criterioricerca
    Me.Sottomaschera_data_q.Form.filteron=true
    end sub

    ovviamente lo scrivi anche per gli altri controlli.

  • Re: Ricerca caselle combinate a cascata

    06/02/2023 - Antony73 ha scritto:


    Immagina di voler applicare la procedura al controllo casellacombinata4.

    Allora scrivi:

    private sub casellacombinata4_AfterUpdate()
    Me.Sottomaschera_data_q.Form.filter=Criterioricerca
    Me.Sottomaschera_data_q.Form.filteron=true
    end sub

    ovviamente lo scrivi anche per gli altri controlli.

    Perfetto grazie. Ho tolto le wildcard e funziona bene fornitore e caffè; continua ad avere problemi con l'anno in arrivo. 

  • Re: Ricerca caselle combinate a cascata

    Se non studi un minimo diventa uno stillicidio di domande “banali” ovviamente…

    Quando si costruiscono i CRITERI la sintassi da usare è diversa a seconda del TIPO di dato, Testo/Numeri/Date, quindi se hai copia/incollato il codice suggerito, la dove il TIPO è Numerico non servono gli APICETTI…

    Per i meno pratici ma anche per chi sa cosa significa, io suggerisco sempre di usare gli strumenti NATIVI di access, che tu devi imparare a conoscere e colmare delle LACUNE di sostanza tecnica.

    Si tratta della Funzione nativa che elenco sotto:

    Function BuildCriteria(Field As String, FieldType As Integer, Expression As String) As String
        Membro di Access.Application
    

    Chiaro che serve saperla usare nel modo giusto, e per questo devi fare un po di prove ma fa parte dello studio.

  • Re: Ricerca caselle combinate a cascata

    Mancavano gli ' e ora funziona.
    Grazie mille per il vostro aiuto.

    If Len(me.CasellaCombinata2.value & vbNullString) > 0 Then strwhere = strwhere & "[annoarrivo] ='" & Me.CasellaCombinata2 & "' And "

    07/02/2023 - @Alex ha scritto:


    Se non studi un minimo diventa uno stillicidio di domande “banali” ovviamente…

    Non riesco a capire questo tuo fare saccente. Sono su un forum per fare domande e capire determinati argomenti che ovviamente non capisco a pieno oppure per cui mi serve un aiuto. Le domande sono importanti per lo studio e per la comprensione della materia in oggetto. Ho notato che anche in altri post hai reso tutto molto antipatico solo perchè evidentemente sei competente. Ma la competenza non ti da diritto a screditare o banalizzare le domande degli altri. Rifletti su come rispondi e vedrai che anche la tua relazione con gli altri migliorerà. Infine ti ringrazio ancora per il tuo prezioso aiuto.

    Daniele

  • Re: Ricerca caselle combinate a cascata

    07/02/2023 - alladed ha scritto:


    Non riesco a capire questo tuo fare saccente. Sono su un forum per fare domande e capire determinati argomenti che ovviamente non capisco a pieno oppure per cui mi serve un aiuto. Le domande sono importanti per lo studio e per la comprensione della materia in oggetto. Ho notato che anche in altri post hai reso tutto molto antipatico solo perchè evidentemente sei competente. Ma la competenza non ti da diritto a screditare o banalizzare le domande degli altri. Rifletti su come rispondi e vedrai che anche la tua relazione con gli altri migliorerà. Infine ti ringrazio ancora per il tuo prezioso aiuto.

    Daniele

    Il forum, e di coinseguenza la partecipazione, richiede un minimo di conoscenza di base, cosa che ti ho suggerito di approfondire, perchè è evidente tu abbia LACUNE di sostanza e questo non significa offendere ma prenderne atto.

    Il fatto di sentirsti offeso o cos'altro, rimane nella piena soggettività personale e porteremo reciprocamente pazienza, non ho usato toni offensivi nel modo più assoluto ma ti rinnovo ancora la necessità di renderti autonomo con cose banali di base, studiando e non facendo domande ad approssimazioni successive.

    Ricorda che il fatto tu ritenga simpatico o altro, non importa molto, ma importa alla fine partecipare rispettando il Forum nel modo e nella considerazione, e noi non siamo HELP DESK di nessuno, quindi prima studi fai le tue ricerche ed approfondimenti poi nel caso il forum è disponibile, perchè vogliamo che chi partecipa abbia una infarinatura sufficiente per un confronto tecnico, non siamo al Bar non sei in piazza non è una chat di adolescenti, e non è sufficiente “NON RISPONDERE” per snobbare chi non segue queste linee, ma serve educare chi partecipa, poi sarà libero di farlo con i Nostri crismi, o cercare altro.

    Io ti ho esposto cosa secondo me devi fare per migliorare, libero di farlo… e di conseguenza riceverai un proporzionale aiuto o suggerimenti magari fastidiosi.

Devi accedere o registrarti per scrivere nel forum
14 risposte