Combobox filtrata da casella di testo

di il
15 risposte

Combobox filtrata da casella di testo

Salve a tutti, come da titolo avrei bisogno di un aiuto per risolvere tale problematica.
In una sub (FormArticoli) ho una combobox (cboArtMagazz) che, come origine riga, fa riferimento ad una tabella dove vengono riportati tutti gli articoli (tblArticoli).

Ho creato una casella di testo txtfiltro che, nel caso in cui si scriva borsa, filtra la cbo mostrandomi tutti gli articoli che contengono la parola borsa. Per fare ciò ho inserito nel campo descrArticolo (oggetto della query origine della cbo) il seguente criterio: Like "*"+[Forms]![FormArticoli]![txtfiltro]+"*"

Ora succede che quando apro la maschera che a sua volta contiene la sub FormArticoli, già all'apertura mi chiede a video il criterio (sgradevole).
Diversamente, ho provato ad usare tramite vba il seguente codice

Me.cboArtMagazz.RowSourceType = "Table/Query"
strSQL = "SELECT tblArticoli.ID_Articolo, tblArticoli.Descrizione, tblArticoli.Cod_Articolo FROM tblArticoli WHERE (tblArticoli.Descrizione) Like '*" & Me!txtfiltro & "*'"
Me.cboArtMagazz.ColumnCount = 3
Me.cboArtMagazz.ColumnWidths = "0;2835;2835"
Me.cboArtMagazz.RowSource = strSQL
cboArtMagazz.Requery

Dove nella prima colonna vi è l'IdArticolo;descrArticolo e codArticolo

Tutto bene, funziona se non fosse che se vado sul record successivo per inserire altri oggetti, appena cambio il valore contenuto in txtfiltro, il requery su cboArtMagazz fa in modo tale che perdo il valore precedentemente preimpostato (su tutti irecord)
Come posso risolvere facendo in modo tale che il requery non vada a modificare i valori storicizzati agendo quindi solo sul nuovo record? Dall'orario si capisce che stò uscendo di testa per questa cosa...

15 Risposte

  • Re: Combobox filtrata da casella di testo

    Salve,
    premetto che non ho capito nulla sul tuo modo di generare i filtri, ma questa non è una questione che voglio affrontare a quest'ora, magari domani ti suggerisco un modo diverso.
    Per quanto concerne invece l'azione che vuoi scatenare SOLO su nuovo record potresti utilizzare:
    Private SUb Form_Current()
        If Me.NewRecord Then
            ' Quì scrivi quello che vuoi ottenere se sei su Nuovo Record
        End iF
    ENd Sub
    Saluti a domani
  • Re: Combobox filtrata da casella di testo

    zio Ken ha scritto:


    In una sub (FormArticoli)
    Intendi una SOTTOMASCHERA che si chiama FormArticoli? Se sì, attento a non chiamarla "sub"...per i programmatori significa un'altra cosa.

    zio Ken ha scritto:


    il seguente criterio: Like "*"+[Forms]![FormArticoli]![txtfiltro]+"*"
    Ti consiglio di scrivere:
    Like "*" & [Forms]![FormArticoli]![txtfiltro] & "*"
  • Re: Combobox filtrata da casella di testo

    Gianni55 ha scritto:


    Salve,
    premetto che non ho capito nulla sul tuo modo di generare i filtri, ma questa non è una questione che voglio affrontare a quest'ora, magari domani ti suggerisco un modo diverso.
    Per quanto concerne invece l'azione che vuoi scatenare SOLO su nuovo record potresti utilizzare:
    Private SUb Form_Current()
        If Me.NewRecord Then
            ' Quì scrivi quello che vuoi ottenere se sei su Nuovo Record
        End iF
    ENd Sub
    Saluti a domani
    Ciao, ho provato tramite il tuo consiglio ma purtroppo non funge. Quando sono nel primo record tt ok, mentre se passo ad un record successivo, anche inserendo l'if il requery mi va a togliere il valore impostato tramite la cboArtMagazz nel primo record eliminando quindi l'idArticolo.

    @Osvaldo
    Grazie mille per l'intervento, si causa forte stress ho scritto di impeto sbagliando...
    La soluzione di mettere la condizione all'interno dell'origine riga mi chiede, già all'apertura della maschera madre, di inserire un valore nel campo txtfiltro e questo non va bene.

    Che metodi mi consigliate?
    Inoltre txtfiltro vorrei farlo utilizzare all'occorrenza per scremare la cbo, deve essere un aiuto non la regola, nel senso non deve essere necessariamente valorizzato..
  • Re: Combobox filtrata da casella di testo

    Io (molto duro di comprendonio) ho bisogno di una descrizione più chiara e dettagliata, passo passo.
    1. Hai una maschera principale: come si chiama?
    2. Poi c'è una sottomaschera che si chiama FormArticoli: giusto?
    3. Elenca i nomi propri di tutti i campi di entrambe maschera e sottomaschera
    4. Rispiega con qualche esempio pratico cosa devi fare usando i nomi propri
  • Re: Combobox filtrata da casella di testo

    OsvaldoLaviosa ha scritto:


    Io (molto duro di comprendonio) ho bisogno di una descrizione più chiara e dettagliata, passo passo.
    1. Hai una maschera principale: come si chiama?
    2. Poi c'è una sottomaschera che si chiama FormArticoli: giusto?
    3. Elenca i nomi propri di tutti i campi di entrambe maschera e sottomaschera
    4. Rispiega con qualche esempio pratico cosa devi fare usando i nomi propri
    Ciao Osvaldo, La maschera è composta così
    Maschera madre:FormDocumenti (con origine tblDocumenti) che contiene le informazioni relative all'anagrafica del cliente, i vari totali ed altre info esterne alla situazione.
    Sottomaschera:FormArticoli (con origine tblSottoDocumenti) al fine di creare qualsiasi documento, va ad implementare la tabella relativa agli oggetti del documento. La tblDocumenti e la tblSottoDocumenti sono legati tramite IDDocumento.

    La FormArticoli fa riferimento alla tblSottoDocumenti e tramite la cboArtMagazz va storicizzare gli articoli tramite IDArticolo, nella tblSottoDocumenti da li, la quantità, prezzo, cod iva e varie...
    La cboArtMagazz ha come origine IDArticolo ed è composta da 3 colonne: l'IdArticolo;descrArticolo e codArticolo

    Fin qui quindi la gestione è abbastanza ordinaria. Ora, considerando che ci possono essere tantissimi articoli da gestire, per rendere più veloce la selezione della cboArtMagazz ho inserito un campo di testo txtfiltro, nella FormArticoli che scrivendo una qualsiasi cosa, mi andava a scremare la cboArtMagazz con i soli articoli che contengono la parola inserita nella txtfiltro.

    Come posso fare in modo tale che, la cboArtMagazz nel caso in cui la txtfiltro sia valorizzata mi dia come risultanze solo gli articoli che contemplano quanto scritto nella txtfiltro evitando Il problema che, se effettuo il requery su cboArtMAgazz dopo aver valorizzato la txtfiltro mi elimina la selezione su tutti gli oggetti della FormArticoli...?
  • Re: Combobox filtrata da casella di testo

    Io lascerei la gestione "ordinaria" di maschera/sottomaschera formDocumenti/formArticoli con la normale casella combinata su cboArtMagazz. Non metterei la txtArticolo da queste parti...perchè faresti continuamente "impazzire" la combo e di conseguenza maschera/sottomaschera.
    1. Io creerei una maschera singola popup ScremaArticoli (che non poggia su alcuna tabella) che vai ad aprire con un clic di pulsante ApriScremaArticoli.
    2. In maschera ScremaArticoli metti txtArticolo e una casella combinata IDArticolo con 3 colonne (IDArticolo, DescArticolo, CodArticolo) e avente come Origine riga una query con il parametro Like "*"ecc...che legge txtArticolo
    3. Accanto alla txtArticolo ci metti un pulsante Screma, accanto alla casella combinata IDArticolo ci metti un pulsante Imposta.
    4. In txtArticolo vai a digitare una porzione di testo inclusa in DescArticolo, il pulsante Screma va a dire alla casella combinata IDArticolo di attivarsi/impostarsi secondo il parametro di txtArticolo, mostrando solo i valori filtrati in base al valore di txtArticolo. Quindi selezioni l'Articolo che ti interessa, poi il pulsante Imposta provvede a impostare il valore dentro Forms!formDocumenti!formArticoli!cboArtMagazz, quindi chiudi la maschera ScremaArticoli.
  • Re: Combobox filtrata da casella di testo

    Ci avevo pensato ed in un primo momento avevo fatto così ma rallentava troppo le azioni dovendo fare su ogni singolo record questa "tarantella".
    ho provato anche a creare un alta cbo temporanea che viene filtrata dalla txtfiltro e poi "passa" l'id a cboArtMagazz così che il requery non viene fatto direttamente su cboArtMagazz non perdendo l'informazione ma così, anke se efficiente, avere 2 campi filtro è poco armonica come cosa...vi è secondo voi un altro metodo più pulito o che mi permette di utilizzare la txtfiltro e la cboArtMagazz senza ulteriori campi/complicanze?
  • Re: Combobox filtrata da casella di testo

    zio Ken ha scritto:


    Ci avevo pensato ed in un primo momento avevo fatto così ma rallentava troppo le azioni dovendo fare su ogni singolo record questa "tarantella".
    Vado per ipotesi. Non so come sono stati digitati i valori di DescArticolo, ma...:
    A) Può darsi che potresti organizzare su più campi...se cerchi di "cogliere" il loro contenuto interno. Mi viene in mente anche di usare le caselle combinate a cascata (a patto che ci siano i presupposti)...ma la tarantella dovresti ballarla lo stesso.
    B) Quando hai davvero moltissimi valori e un solo campo "descrittivo"...ti accorgi che può non essere "sufficiente" in certi casi...e allora ti balli la tarantella. Io ho un database con una situazione diversa, ma ingarbugliata che talvolta devo continuamente stuzzicare l'origine riga della casella combinata per farmi vedere i dati diversamente...anch'io lì mi ballo la tarantella.
    C) Ripensando agli Articoli...quando la descrizione è complessa...direi sia più conveniente digitare codArticolo, oggi poi si fa in un lampo con la pistola codice a barre.
  • Re: Combobox filtrata da casella di testo

    OsvaldoLaviosa ha scritto:


    zio Ken ha scritto:


    Ci avevo pensato ed in un primo momento avevo fatto così ma rallentava troppo le azioni dovendo fare su ogni singolo record questa "tarantella".
    Vado per ipotesi. Non so come sono stati digitati i valori di DescArticolo, ma...:
    A) Può darsi che potresti organizzare su più campi...se cerchi di "cogliere" il loro contenuto interno. Mi viene in mente anche di usare le caselle combinate a cascata (a patto che ci siano i presupposti)...ma la tarantella dovresti ballarla lo stesso.
    B) Quando hai davvero moltissimi valori e un solo campo "descrittivo"...ti accorgi che può non essere "sufficiente" in certi casi...e allora ti balli la tarantella. Io ho un database con una situazione diversa, ma ingarbugliata che talvolta devo continuamente stuzzicare l'origine riga della casella combinata per farmi vedere i dati diversamente...anch'io lì mi ballo la tarantella.
    C) Ripensando agli Articoli...quando la descrizione è complessa...direi sia più conveniente digitare codArticolo, oggi poi si fa in un lampo con la pistola codice a barre.
    nada, per ora ho risolto utilizzando il txtfiltro ed una cbo temporanea che mi filtra i valori tramite la txtfiltro e va ad addegnare il valore a cboArtMagazz...grazie lo stesso
  • Re: Combobox filtrata da casella di testo

    zio Ken ha scritto:


    Ci avevo pensato ed in un primo momento avevo fatto così ma rallentava troppo le azioni dovendo fare su ogni singolo record questa "tarantella".
    ho provato anche a creare un alta cbo temporanea che viene filtrata dalla txtfiltro e poi "passa" l'id a cboArtMagazz così che il requery non viene fatto direttamente su cboArtMagazz non perdendo l'informazione ma così, anke se efficiente, avere 2 campi filtro è poco armonica come cosa...vi è secondo voi un altro metodo più pulito o che mi permette di utilizzare la txtfiltro e la cboArtMagazz senza ulteriori campi/complicanze?
    Va detto che la scelta del metodo da applicare dipende molto dalla mole degli articoli caricati e dalla diversificazione e classificazione ad essi attribuita.
    Detto questo e visto che tutte le discrimine sono basate sul campo descrizione io alla form articoli di magazzino inserirei solo la TxtFiltro (quindi abbandonerei l'uso della Combo) ed in questa sull'evento "su modifica" inserirei questo codice:
    Dim Criterio As String
    Criterio = "DescrizioneArticolo like" & Chr$(34) & "*" & Me!TxtFiltro & "*" & Chr$(34)
    
     If Len(Me!TxtFiltro.Text) = 0 Then
          FilterOn = False
        Else
          FilterOn = False
          Me.Filter = Criterio
          Me.FilterOn = True
              If Me.RecordsetClone.RecordCount = 0 Then  'conta i record dopo il filtro se zero
                 MsgBox "Nessun record corrisponde al criterio !", vbExclamation, "Attenzione"
                     TxtFiltro = ""
                     FilterOn = False
                 End If
          Me.TxtFiltro.SetFocus
          Me!TxtFiltro.SelStart = Len(Me!TxtFiltro.Text & vbNullString)
       End If
    Vedi se fa al caso tuo
  • Re: Combobox filtrata da casella di testo

    Gianni55 ha scritto:


    zio Ken ha scritto:


    Ci avevo pensato ed in un primo momento avevo fatto così ma rallentava troppo le azioni dovendo fare su ogni singolo record questa "tarantella".
    ho provato anche a creare un alta cbo temporanea che viene filtrata dalla txtfiltro e poi "passa" l'id a cboArtMagazz così che il requery non viene fatto direttamente su cboArtMagazz non perdendo l'informazione ma così, anke se efficiente, avere 2 campi filtro è poco armonica come cosa...vi è secondo voi un altro metodo più pulito o che mi permette di utilizzare la txtfiltro e la cboArtMagazz senza ulteriori campi/complicanze?
    Va detto che la scelta del metodo da applicare dipende molto dalla mole degli articoli caricati e dalla diversificazione e classificazione ad essi attribuita.
    Detto questo e visto che tutte le discrimine sono basate sul campo descrizione io alla form articoli di magazzino inserirei solo la TxtFiltro (quindi abbandonerei l'uso della Combo) ed in questa sull'evento "su modifica" inserirei questo codice:
    Dim Criterio As String
    Criterio = "DescrizioneArticolo like" & Chr$(34) & "*" & Me!TxtFiltro & "*" & Chr$(34)
    
     If Len(Me!TxtFiltro.Text) = 0 Then
          FilterOn = False
        Else
          FilterOn = False
          Me.Filter = Criterio
          Me.FilterOn = True
              If Me.RecordsetClone.RecordCount = 0 Then  'conta i record dopo il filtro se zero
                 MsgBox "Nessun record corrisponde al criterio !", vbExclamation, "Attenzione"
                     TxtFiltro = ""
                     FilterOn = False
                 End If
          Me.TxtFiltro.SetFocus
          Me!TxtFiltro.SelStart = Len(Me!TxtFiltro.Text & vbNullString)
       End If
    Vedi se fa al caso tuo
    Grazie mille per il suggerimento ed anche se al momento ho risolto vorrei provare ad impostare qlk considerando quanto consigliatomi.
    Il fatto è che la cboArtMagazz è legata all'IdArticolo come origine controllo mentre tramite le 3 colonne, mi va a dare in visualizzazione descrArticolo e codArticolo.
    Volendo utilizzare il codice da te postato, dovrei adattarlo a quanto impostato nel primo messaggio
    Me.cboArtMagazz.RowSourceType = "Table/Query"
    strSQL = "SELECT tblArticoli.ID_Articolo, tblArticoli.Descrizione, tblArticoli.Cod_Articolo FROM tblArticoli WHERE (tblArticoli.Descrizione) Like '*" & Me!txtfiltro & "*'"
    Me.cboArtMagazz.ColumnCount = 3
    Me.cboArtMagazz.ColumnWidths = "0;2835;2835"
    Me.cboArtMagazz.RowSource = strSQL
    cboArtMagazz.Requery
    ma temo che anche se provassi ad usare il tuo codice, il requery mi andrebbe comunque a resettare il valore attribuito dalla cboArtMagazz che in questo caso devo necessariamente utilizzare per poter poi attribuire l'articolo dopo la scrematura del filtro...o erro?
  • Re: Combobox filtrata da casella di testo

    Salve
    a mio parere come già detto stai sbagliando l'approccio logico del problema.
    Hai una MkDocumento ed una sottoMascheraArticoli ,nella quale aggiungi gli articoli che riguarderanno quel documento.
    Ora il problema è questo:
    Prelevare gli articoli dal magazzino o TbArticoliMagazz se preferisci, la mia domanda è questa:
    Quanti sono questi articoli?
    se sono da 20 a 40, faccio un esempio, è ancora pensabile prelevarli con una combo.
    se sono 60, faccio ancora un esempio, puoi farlo con due combo a cascata, con la prima riduci la ricerca della seconda.
    ma se hai un magazzino che viaggia sui 100 articoli o è indefinito è impensabile risolvere la questione con delle combo.
    Questo è il problema, per tornare al tuo esempio con una discrimina "borse" in un magazzino di 5oo prodotti ne scegli una cinquantina, immagina cosa vuol dire scorrere una combo con 50 voci.
    E allora cosa fare? io ti spiego come faccio io:
    1 aggiungi un campo Sel Si/No alla tab Magazzino.
    2 Crea una Maschera continua "MkArticoliMagazz" con tutte le notizie che riguardano gli articoli.
    3 nel pièpagina inserisci quella ricerca con txtbox.
    a questo punto il processo, sinteticamente, sarà questo :
    a) Cerchi l'articolo con la TxtBox, se quello giusto Flag su si
    b) Quando li hai scelti tutti lanci una query di accodamento alla TbArticoli ed il gioco è fatto.
    Se decidi di intraprendere questa strada, abbandona questo post, altrimenti diventa una chat, ed affrontiamo le difficoltà
    che troverai.
    Saluti
  • Re: Combobox filtrata da casella di testo

    Perfetto,

    ho fatto come consigliatemi poichè gli articoli hanno continuato, giustamente, ad aumentare quindi in qualche maniera ho dovuto abbandonare la richiesta di farlo in quel modo.

    Ora sorge un nuovo problema, quando nella sottomaschera si sceglie un articolo, su AfterUpdate avevo inserito una serie di comandi cui, in base al listino appartenente al cliente, in base alla quantità, in base al prezzo, scontistica e varie, veniva calcolato l'imponibile ed il relativo importo iva...

    Eseguendo l'accodamento, questo passaggio non lo si riesce a fare se non andando a "riconfermare" l'articolo/i selezionati tramite la form cui effettua l'accodamento.
    Avevo importato tramite la form che effettua l'accodamento dei set focus vari sperando che mi si ricalcolasse il tutto ed invece nulla...è possibile eseguire il codice presente nella cboArtMagazz (afterUpdate) tramite una maschera esterna?
  • Re: Combobox filtrata da casella di testo

    Ora sorge un nuovo problema, quando nella sottomaschera si sceglie un articolo, su AfterUpdate avevo inserito una serie di comandi cui, in base al listino appartenente al cliente, in base alla quantità, in base al prezzo, scontistica e varie, veniva calcolato l'imponibile ed il relativo importo iva...
    Dove e quali calcoli hai inserito?
    Eseguendo l'accodamento, questo passaggio non lo si riesce a fare se non andando a "riconfermare" l'articolo/i selezionati tramite la form cui effettua l'accodamento.
    Questo mi fa pensare che la source della sottomaschera non è la tab pura ma siano stati aggiunti dei calcoli, chiedo
    Avevo importato tramite la form che effettua l'accodamento dei set focus vari sperando che mi si ricalcolasse il tutto ed invece nulla...è possibile eseguire il codice presente nella cboArtMagazz (afterUpdate) tramite una maschera esterna?
    i set focus non servono a questo, per ricalcolare o fai un requery della sottomaschera o... se posti il codice che inserisci per accodare i record forse è meglio cosi abbandoniamo le ipotesi.

    Saluti
Devi accedere o registrarti per scrivere nel forum
15 risposte