| Forms |
| 3.29 Come creare un controllo di ricerca. |
| Davide La Mantia (Sib) |
|
Talvolta si presenta la necessità di avere un semplice controllo per la ricerca rapida in uno specifico campo. Si pensi alla ricerca di un cliente in una maschera. Vero è che Access possiede una specifica autocomposizione che crea una casella combinata per la ricerca, ma tale casella ha qualche limite, prima di tutto cerca il cliente solo dopo l'aggiornamento e cioè quando date invio, e comunque cerca a partire dall'inizio del campo, e non per contenuto. Col mio metodo è sufficiente creare una casella di testo che chiameremo "Ricerca", poi sarà sufficiente aggiungere il codice che segue:
Dim ChiaveRicerca As String
Private Sub Ricerca_Change()
Dim rst As DAO.Recordset
Dim strR As String
strR = Me.Ricerca.Text
If Not IsNull(Me!Ricerca.Text) Then
Set rst = Me.RecordsetClone
rst.FindFirst "DITTA like """ & ChiaveRicerca & Me!Ricerca.Text & "*"""
Me.Bookmark = rst.Bookmark
rst.Close
Set rst = Nothing
End If
Me!Ricerca = strR
Me!Ricerca.SetFocus
Me!Ricerca.SelStart = 255 'Len(Me!Ricerca.Text)
End Sub
Private Sub Ricerca_DblClick(Cancel As Integer)
Select Case Me!Ricerca.SpecialEffect
Case 1
Me!Ricerca.SpecialEffect = 2
ChiaveRicerca = "*"
Me!Ricerca.ControlTipText = "Ricerca rapida per parte del campo"
Case 2
Me!Ricerca.SpecialEffect = 1
ChiaveRicerca = ""
Me!Ricerca.ControlTipText = "Ricerca rapida da inizio campo"
Case Else
MsgBox "Viene reimpostato l'aspetto della casella", vbExclamation, "Errore"
Me!Ricerca.SpecialEffect = 1
ChiaveRicerca = ""
Me!Ricerca.ControlTipText = "Ricerca rapida da inizio campo"
End Select
End Sub
Private Sub Ricerca_KeyPress(KeyAscii As Integer)
Dim rst As DAO.Recordset
Dim str As String
If KeyAscii = 13 Then
If Not IsNull(Me!Ricerca.Text) Then
Set rst = Me.RecordsetClone
rst.FindNext "DITTA like """ & ChiaveRicerca & Me!Ricerca.Text & "*"""
If rst.NoMatch Then rst.FindFirst "DITTA like """ & ChiaveRicerca & Me!Ricerca.Text & "*"""
Me.Bookmark = rst.Bookmark
rst.Close
Set rst = Nothing
End If
Me!Ricerca.SetFocus
Me!Ricerca.SelStart = 255
KeyAscii = 0
End If
End Sub
Si noti che "ChiaveRicerca" è una variabile globale del modulo di classe.Il funzionamento che si ottiene è semplice, basta iniziare a digitare che il codice troverà immediatamente il primo record il cui campo "DITTA" (voi userete il campo che vi interessa) inizia per i caratteri che avete digitato. Se non viene trovato nulla si resta sul primo record. Per trovare i record successivi al primo è sufficiente premere invio. Per effettuare una ricerca per "testo contenuto" e non per "Parte iniziale del campo" basta fare doppio click sul controllo, questi assumerà l'aspetto incassato e, quando inizierete a digitare, troverà il primo record il cui campo "DITTA" contiene (non semplicemente inizia) il testo digitato. Perche' tutto funzioni in modo corretto, bisogna impostare il controllo Ricerca in visualizzazione In Rilievo nella maschera, sara' poi il codice che si occupera' del resto. Nota Il codice VBA di cui sopra fa riferimento alla libreria Microsoft DAO quindi, se usi una versione di Access successiva ad Access 97, devi aggiungere al tuo database i riferimenti a Microsoft DAO 3.6 Object Library. Allegato alla FAQ di Daniele Merlo intitolata 3.122 Database di esempio delle due FAQ relative a Come creare un controllo di ricerca e pubblicata nella Sezione Forms di questo Sito si trova un database di esempio che realizza in pratica quanto qui esposto in teoria. |