Ricerca record mediante casella di riepilogo

di il
11 risposte

Ricerca record mediante casella di riepilogo

Cari tutti, mi sto struggendo i pochi neuroni per fare una cosa che secondo me è fra le cose più elementari che si possano chiedere ad access:

Digito nella casella di testo 'trova' dei caratteri, e su "modifica", nella casella di riepilogo sottostante, mi compare la lista di tutti i record che contengono i caratteri in sequenza appena digitati. Per fare questo uso:
st = "SELECT Nome FROM Sponsor Where ([Nome] like " & Chr$(34) & "*" & Me!trova.text & "*" & Chr(34) & ");"
Me!Estratti.RowSource = st ' Estratti è il nome della casella di riepilogo

Ora il problema che non riesco a risolvere:

Io voglio che se premo INVIO dopo aver digitato i caratteri, mi venga chiesto se voglio inserire un nuovo record per quei caratteri, ma se col mouse entro nella casella 'Estratti' e scelgo una delle voci disponibili, il puntatore vada a posizionarsi sul record selezionato.
Ho provato entrambe le routine di
Su INVIO
Su uscita

ma succede che se clicco sulla casella di riepilogo, la sequenza passa anche sulla routine di Su Uscita oppure se uso Su INVIO, il controllo passa il focus ad un pulsante esterno che non c'entra niente.
Quale errore probabilmente logico, sto commettendo?

11 Risposte

  • Re: Ricerca record mediante casella di riepilogo

    Non riesco a cogliere i dettagli del tuo problema. Più semplicemente mi viene di pensare che si tratta di una normale gestione dell'evento "Non in elenco"...e solo quello devi gestire...magari nella maniera più "classica" possibile.
  • Re: Ricerca record mediante casella di riepilogo

    Ciao Osvaldo,
    cosa intendi dire con la gestione dell'evento "Non in elenco"?
    E' possibile invece che nell'elenco possano esserci più voci che contengono i miei caratteri digitati ma io ho inviato ENTER sulla casella di testo e voglia considerare solo la possibilità di inserire un nuovo record.
  • Re: Ricerca record mediante casella di riepilogo

    Nuovo record di quale tabella?
  • Re: Ricerca record mediante casella di riepilogo

    antocuomo ha scritto:


    Ciao Osvaldo,
    cosa intendi dire con la gestione dell'evento "Non in elenco"?
    E' possibile invece che nell'elenco possano esserci più voci che contengono i miei caratteri digitati ma io ho inviato ENTER sulla casella di testo e voglia considerare solo la possibilità di inserire un nuovo record.
    Se capisco bene, con la pressione di INVIO devi generare un NUOVO RECORD, con la semplice selezione della voce da elenco spostarti sul selezionato...?

    L'intercettazione di RETURN si può eseguire su KeyPress, intercettando appunto il Codice ASCII del Return=13(vbKeyReturn)
    
    Option Compare Database
    Option Explicit
    
    Private Sub TuaCombo_KeyPress(KeyAscii As Integer)
        Select Case KeyAcii
            Case Access.Constants.vbKeyReturn:       ' Codice per il NUOVO RECORD esempio: (DoCmd.GoToRecord acDataForm, Me.Name, acNewRec)
            Case Else
        End Select
    End Sub
    Per spostarti sul selezionato... il Wizzard lo fa in atuomatico... su DopoAggiornamento
    
    Me.Recordsetclone.FindFirst "NomeCampo=" & Me!TuaCombo
    If Not Me.RecordsetClone.NoMatch then
        Me.Bookmark=Me.Recordsetclone.Bookmark
    Else
        MsgBox "Non trovato"
    End if
    Non so se ho capito tutto.
  • Re: Ricerca record mediante casella di riepilogo

    Come sempre Alex, hai capito più di quanto si poteva capire ma rimane un problema:
    Il codice ascii di return non lo riconosce. Viene catturato ancor prima della sub ed il cursore esce fuori dal controllo casella di testo.

    Private Sub trova_KeyPress(KeyAscii As Integer)
    Select Case KeyAscii
    Case Is >= 0
    MsgBox KeyAscii ' Tutti i cadici passano di qua ma non il 13
    Case Access.Constants.vbKeyReturn:
    Call chiede_nuovo_rec
    Case Else
    End Select
    End Sub
  • Re: Ricerca record mediante casella di riepilogo

    Hai guardato BENE quello che ho scritto io e quello che hai scritto tu...?
    Secondo te, come può riconoscere vbKeyReturn se già la prima condizione del SELECT la include e di fatto bypassa...?

    Ti sei chiesto perchè nel mio codice io abbia prima messo vbKeyReturn e non viceversa...?
    Quel Case Else... secondo te cosa sarebbe...?

    Insomma dai... ragionaci prima di buttare le cose.
  • Re: Ricerca record mediante casella di riepilogo

    Si Alex, sono d'accordo con te sul fatto che la condizione obiettivo in quel modo viene bypassata, ma ancor prima della mia modifica (implementata solo per testare), nella case "return" non entra mai e la call non viene eseguita.

    Private Sub trova_KeyPress(KeyAscii As Integer)
    Select Case KeyAscii
    Case Access.Constants.vbKeyReturn:
    Call chiede_nuovo_rec
    Case Else
    MsgBox KeyAscii
    End Select
    End Sub

    Anche in questo modo, la Call non viene eseguita e la casella di testo perde il focus
  • Re: Ricerca record mediante casella di riepilogo

    antocuomo ha scritto:


    Si Alex, sono d'accordo con te sul fatto che la condizione obiettivo in quel modo viene bypassata, ma ancor prima della mia modifica (implementata solo per testare), nella case "return" non entra mai e la call non viene eseguita.
    Prova il KeyDown... sostituisci a KeyAscii il parametro KeyCode e forza KeyCode=0.
    
    Private Sub trova_KeyDown(KeyCode As Integer, Shift As Integer)
        Select Case KeyCode
            Case Access.Constants.vbKeyReturn
                   KeyCode = 0
                   MsgBox "INVIO"
            Case Else
        End Select
    End Sub
  • Re: Ricerca record mediante casella di riepilogo

    Grande Alex. Hai sempre un asso nella manica.
    Ora tutto procede regolarmente. Il KeyDown è stato risolutivo.
    P.S. Perché forzare KeyCode = 0 ?

    Grazie mille.
    antonio
  • Re: Ricerca record mediante casella di riepilogo

    Forzare KeyCode=0 equivale ad annullare il vbKeyEnter, ovviamente dopo averlo intercettato.
    Questo evita quindi l'esecuzione del normale comportamento, e quello che ne consegue, come il passaggio del Focusa ad altro Controllo o, in alcuni casi il passaggio al Record successivo.
    Non è obbligatorio, ma nel tuo caso probabilmente è una buona indicazione.
  • Re: Ricerca record mediante casella di riepilogo

    Di nuovo grazie.
Devi accedere o registrarti per scrivere nel forum
11 risposte