Newsgroup: it.comp.appl.access
Titolo: Casella combinata con ricerca attiva durante digitazione

Ciao a tutti, ho un db con una maschera ordini e relativa sottomaschera dettaglio ordini inglobata sotto forma di foglio dati.
 
Dalla sottomaschera dettagli ordini scelgo da una casella combinata il prodotto da inserire, ma la lista è lunga e spesso digitando le prime lettere non azzecco il prodotto risultando in una perdita di tempo.
 
Mi domandava se invece fosse possibile ricercare tutti i prodotti che hanno al loro interno i caratteri digitati nella casella combinata, filtrando la stessa mostrando solo quelli corrispondenti alla digitazione.
 
Non voglio usare un campo testo per cercare nella casella combinata in quanto non mi sembra funzionale e non saprei come gestire la cosa sulle varie n righe di prodotti che devo inserire nella sottomaschera dettaglio ordini in visualizzazione foglio dati.
 
Qualche idea?
 
Grazie in anticipo.


Se vuoi usare le combo standard, devi adattarti
Potresti farti una combo personalizzata con textbox+button+listbox
 
 
 

Il 12/06/2017 20:25, Maroso Marco ha scritto:

campo testo
combo larga quanto il solo simbolo della freccia in giu posizionata 
vicino al capo testo
 
sull'evento dopo aggiornamento del campo testo imposti l'origine dati 
della tua combo. qualcosa tipo
 
Me.tuacombo.rowsource="selecet ... from... where articolo like '*" & 
me.tuoCasellaTesto & "*'"
 
e sempre sull'evento
me.tuacombo.setfocus
me.tuacombo.dropdown
 
 
ti apparirà al tendina di tutti gli articoli che contengono la parte 
digitata.
 
Oppure se tutti gli articoli hanno un barcode, usa uno scanner barcode e 
passa la paura
 
ciao
 
 
 
 
 
 
 
 

Il 12/06/2017 20:25, Maroso Marco ha scritto:

questo codice funziona una favola!
 
Private Sub Combo0_Change()
' Function Description:
' Filter a combo box list as the user types, similarly to how application
' launchers like Colibri, AppRocket and LaunchBar opperate.
     ' e.g. if the list contains the names of U.S. Presidents, and
     ' the user types "gw," then the resulting SQL WHERE clause will
     ' look like "Name Like '*g*w*'" and the resulting list
     ' will include George Washington, George H. W. Bush and
     ' George W. Bush, among others.
     ' The order is preserved, so that typing "wg" creates an SQL WHERE
     ' clause like "Name Like '*w*g*'" and the resulting list would
     ' include George Washington but not the Bushes.
 
' This is accomplished by grabbing the text typed by the user in the
' combo box's edit field, creating an SQL SELECT statement from it,
' and finally applying that SQL statement to the combo box's
' .RowSource property.
 
' Form design settings:
'  Set AutoExpand to No
'  Column Count 3
'  Keyed on column 1 (record primary key)
'  Showing column 2 (user-readable data) column 2 width > 0
'  First and Second column width=0
 
Dim strText, strFind
 
' Get the text that the user has typed into the combo box editable field.
strText = Me.Combo0.Text
 
' If the user has typed something in, then filter the combobox
' list to limit the visible records to those that contain the
' typed letters.
' Otherwise (if the field is blank), the user has deleted whatever
' text they typed, so show the entire (unfiltered) list
If Len(Trim(strText)) > 0 Then
     ' Show the list with only those items containing the typed
     ' letters.
 
     ' Create an SQL query string for the WHERE clause of the SQL
     ' SELECT statement.
     strFind = "Name Like '"
     For i = 1 To Len(Trim(strText))
         If (Right(strFind, 1) = "*") Then
             ' When adding another character, remove the
             ' previous "*," otherwise you end up with
             ' "*g**w*" instead of "*g*w*."
             ' This has no apparent impact on the user, but
             ' ensures that the SQL looks as intended.
             strFind = Left(strFind, Len(strFind) - 1)
         End If
         strFind = strFind & "*" & Mid(strText, i, 1) & "*"
     Next
     strFind = strFind & "'"
 
     ' Create the full SQL SELECt string for the combo box's
     ' .RowSource property.
     strSQL = "SELECT tName.nameKey, tName.Name, SortOrder FROM tName 
Where " & _
     strFind & " ORDER BY SortOrder;"
 
     '' NOTE: to remove the order requirement, such that typing "wg"
     '' and "gw" return the same results, the SQL WHERE clause needs
     '' to look like "Name Like '*w* AND *g*'."
     '' The code above should be changed as follows:
     ''For i = 1 To Len(Trim(strText))
     ''   strFind = strFind & "Name Like '*" & Mid(strText, i, 1) & "*' 
And "
     ''Next
     ''
     ''strSQL = "SELECT tName.nameKey, tName.Name, SortOrder from 
tblApps Where " & _
     ''Left(strFind, Len(strFind) - 5) & " Order By SortOrder"
 
     ' Filter the combo list records using the new SQL statement.
     Me.Combo0.RowSource = strSQL
 
Else
     ' Show the entire list.
     strSQL = "SELECT tName.nameKey, tName.Name, tName.SortOrder FROM 
tName ORDER BY tName.SortOrder; "
     Me.Combo0.RowSource = strSQL
End If
 
' Make sure the combobox is open so the user
' can see the items available on list.
Me.Combo0.Dropdown
 
End Sub
 
 
Akery
 
---
Questa e-mail è stata controllata per individuare virus con Avast antivirus.
https://www.avast.com/antivirus
 
 


Ho risolto in altro modo ed ora posto il codice .
Grazie mille comunque.


Ho risolto in altro modo ed ora posto il codice .
Grazie mille comunque, la tua soluzione implicava l'uso di altro campo oltre la combobox giusto?.


Grazie mille a tutti coloro che hanno risposto.
 
Ho risolto semplicemente eseguendo quanto segue :
 
Ho impostato la sorgente riga della combobox alla tabella prodotti che contiene tutti i campi che mi occorrono 
 
Ho creato una query chiamata ricercaprodotto (che contiene tutti i campi della tabella prodotti) ed ho messo un criterio sul campo nomeprodotto che volevo "filtrare" in base al digitato.
Il criterio del campo nomeprodotto è semplicemente [Tempvars]![nomeprodotto]
 
Sul codice relativo alla combobox sull'evento cambia ho scritto quanto segue :
 
Private Sub IDProdotto_Change()
On Error GoTo ErrorHandler
 
If idprodotto Is ActiveControl Then
    If Not IsNull(idprodotto.Text) And Len(idprodotto.Text) > 2 Then
        TempVars.Add "NomeProdotto", Me.idprodotto.Text
        idprodotto.RowSource = "ricercaprodotto"
        If Not IsNull(Me.IDOrdine) Then
           'abilito e disabilito la combo in modo da chiuderla
           'senza usare sendkey esc in quanto creava problemi con il blocnum
            Me.idprodotto.Enabled = False
            Me.idprodotto.Enabled = True
            Me!idprodotto.Dropdown
 
        End If
    End If
End If
 
ErrorHandlerExit:
   Exit Sub
 
ErrorHandler:
   MsgBox "Errore IDProdotto_Change N.: " & Err.Number & "; Descrizione: " & _
      Err.Description
   Resume ErrorHandlerExit
 
End Sub
 
 
gli altri eventi sono i seguenti:
 
Private Sub idprodotto_GotFocus()
If Not IsNull(Me.idprodotto) Then GoTo fine
 
If Not IsNull(Me.IDCategoria) Then
    Me.idprodotto.RowSource = "select * from prodotti where idcategoria=" & Me.IDCategoria
    If Not IsNull(Me.IDOrdine) Then
        Me!idprodotto.Dropdown
    End If
Else
 If IsNull(Me.idprodotto) Then Me.idprodotto.RowSource = "select * from prodotti"
     If Not IsNull(Me.IDOrdine) Then
         Me!idprodotto.Dropdown
     End If
End If
 
fine:
End Sub
 
Private Sub IDProdotto_LostFocus()
TempVars.Remove "NomeProdotto"
End Sub
 
Private Sub IDProdotto_NotInList(NewData As String, Response As Integer)
Response = acDataErrContinue
If Not IsNull(Me.IDOrdine) Then
    Me!idprodotto.Dropdown
End If
End Sub