Newsgroup: it.comp.appl.access
Titolo: Posizionarsi su un record di una maschera continua

Ho una maschera con origine dati query1, con un campo cognome ccc ed
altri campi.
In base ai caratteri (lettere) che digito dentro una casella di testo,
devo visualizzare i record che iniziano in base ai caratteri che man
mano digito,
funzionalità tipo la maschera trova della guida di windows.
ho provato con del codice sotto riportato che però filtra i record,
mentre io devo puntare
al record che inizia con i primi caratteri digitati (n.b. la query è in
ordine alfabetico)
In base a precedenti risposte
ho usato il seguente codice dentro l'evento testo_change dove digito i
carattteri iniziali:
Private Sub Testo_Change()
     Dim CaratteriDigitati As String
     CaratteriDigitati = Nz(Me!Testo.Text, "")
     Me.Filter = "ccc like '" & CaratteriDigitati & "*'"
     Me.FilterOn = True
end sub
solo che, usando tale codice:
1) filtro le parole in base ai caratteri digitati,
cioè, non mi posiziona il record in base ai caratteri digitati  ma
filtra tutti i record;
quindi, se poi con la barra, voglio scorrere i record precedenti o
successivi
non lo posso più fare;
2)inoltre quando digito i caratteri il secondo carattere che digito
viene riportato sempre
come primo cioà digito a ed ho a, se continuo con b dovrei avere ab,
invece ho ba ecc.
Ipotizzo che serva un puntatore al record in base ai caratteri che man
mano
digito dentro la casella di testo
ho provato con:
Me.RecordsetClone.FindFirst "[ccc]='" & CaratteriDigitati & "*'"
Me.Bookmark = Me.RecordsetClone.Bookmark
ma non succede nulla.
----------
Parte iniziale del precedente post:
Casella trova nome tipo guida di windows
               Data:   Fri, 03 Nov 2000 08:02:29
Ho una Maschera continua con origine in query1
Nella maschera visualizzo vari campi tra cui un campo cognome.
Devo inserire una casella di testo, dove man mano che digito
le lettere, contemporaneamente, i record della maschera, si posizionano
sul cognome con le prime lettere uguali a quelle al momento digitate.
es digito a
fa vedere Abissi, Acetone, Archimede
continuo nella digitazione
ar
fa vedere archimede etc….
tipo casella trova della guida di windows
etcccc
------------
thank you

 mano digito,
[cut]
Io ho scritto questo codice che uso appunto per fare quello che chiedi.
Private Sub Ricerca_Change()
Dim rst As 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.SelStart = 255 'Len(Me!Ricerca.Text)
End Sub
CiaveRicerca e' una stringa che se impostata a "" non ha influenza e quindi
la sub trova i campi che iniziano con i caratteri che digito, se impostata a
"*" trova i campi che contengono il testo che digito.
Attenzione pero' che questa sub trova la prima occorrenza, per trovare le
successive ho scritto quest'altra sub:
Private Sub Ricerca_KeyPress(KeyAscii As Integer)
Dim rst As 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
Questa ritrova il record successivo al corrente se premo il tasto invio. se
non ci sono uleriori occorrenze ritrova il primo.
Per alterare il valore della stringa globale ChiaveRicerca uso ques'ultima
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
Questa sub, attivata da un doppio click sulla casella di testo, altera sia
il valore di ChiaveRicerca, sia l'aspetto della casella (da incassata a in
rilievo e viceversa).
Ciao, Sib

 End Sub
Perfetto, Grazie 1000
Ho solo dovuto apportare 2 modifiche
1 non ho usato Chiave Ricerca visto che inizio direttamente con i caratteri
(comunque interessante la soluzione)
Poi ho dovuto aggiungere un piccolo accorgimento per fare in modo che anche
in maschera continua qualsiais record vado a cercare viene rimesso sempre
per primo nella videata (anche se si trova ad esempio in fondo alla videata)
Funziona però sempre, tranne per la videata in cui come primo record
a video ho proprio il primo record dell'elenco (recordsetclone)
Penso che non sia possibile risolere (non fa niente)
Grazie di nuovo

Il codice completo è questo:
Private Sub Testo303_Change()
Dim rst As Recordset
Dim strR As String
    strR = Me.Testo303.Text
    If Not IsNull(Me!Testo303.Text) Then
        Set rst = Me.RecordsetClone
        'vado al primo per poi riposizionare gli altri sempre in alto
        rst.MoveFirst
        Me.Bookmark = rst.Bookmark
        'ogni record ricercato
        rst.FindFirst "COGNOME like """ & Me!Testo303.Text & "*"""
        Me.Bookmark = rst.Bookmark
        rst.Close
        Set rst = Nothing
    End If
    Me!Testo303 = strR
    Me!Testo303.SelStart = 255 'Len(Me!Ricerca.Text)
End Sub
-----------------------------------------------------------------------
 'vado al primo per poi riposizionare gli altri sempre in alto
        rst.MoveFirst
        Me.Bookmark = rst.Bookmark
con queste 2 righe riesco a rimettere ogni record intermedio della videata in
alto, tranne
se il primo dei record è anche il primo a video e la ricerca viene fatta per un
record
che si trova anch'esso a video.
Se però si usa
rst.MoveLast
va bene;
non va bene nel caso della ultima videata;
cioè quando il record che vado a selezionare si trova nella videata in cui
c'è visualizzo anche l'ultimo record.
A questo punto ho pensato
rst.MoveFirst
        Me.Bookmark = rst.Bookmark
rst.MoveLast
        Me.Bookmark = rst.Bookmark
insieme;
ma ne funziona una sola
Ho notato che l'effetto di tutto il codice sopra, porta (si vede ma è molto
veloce)
ad un primo spostamento dei record della maschera continua e poi si riposiziona
sul record  cercato ( rst.FindFirst "COGNOME like """ & Me!Testo303.Text &
"*""")
Se però mi trovo nel caso del primo record e il record cercato è nella stessa
videata,
lo spostamento non avviene.
Conclusioni:
lo spostamento che a visualizzo (anche se velocemente) a video,  che evento è
nella maschera?
Un refresh, un  repaint o cche altro
Chiedo questo perchè, potrei fare un codice del tipo (n.b. serve solo nel caso
in cui
il primo record e il record cercato sono nella stessa videata):
Private Sub Testo303_Change()
Dim rst As Recordset
etc...........
       'vado al primo così riposiziono gli altri sempre in alto
        rst.MoveFirst
        Me.Bookmark = rst.Bookmark
Se il codice sopra ha generato un refresh allora niente;
Se il codice non ha generato niente allora esegui sotto:
       'vado all'ultimo così riposiziono gli altri sempre in alto
        rst.MoveLast
        Me.Bookmark = rst.Bookmark
etc   ..................
End Sub

piccola curiosità
Me!Ricerca.SelStart = 255    'Len(Me!Ricerca.Text)
non ho capito la funzionalità di tale ultima riga
ho anche ripostato per il problema dello scorrimento dei record con:
Intercettare scorrimento record in maschera continua

 Intercettare scorrimento record in maschera continua
Non l'ho letto, se posso ci do' un'occhiata.
Ciao, Sib