Testare la fine del file

di il
9 risposte

Testare la fine del file

Mi piace anticipare le mosse di un operatore....
L'operatore si trova di fronte ad una maschera per l'aggiornamento delle schede soci della nostra associazione.
All'interno di un campo text inizia a inserire caratteri relativi a nomi dei soci.
Ad ogni carattere che digita, una casella accanto di riepilogo gli mostra tutti i possibili nominativi già presenti nel DB corrispondenti alla sua stringa che intanto cresce.
In ogni momento l'OP può catturare dalla casella di riepilogo un nominativo ed aggiornarne la scheda.
Fino a questo punto tutto OK.
Quando l'OP si trova ad aver digitato il nome di un socio inesistente e la casella di riepilogo rimane vuota, mi piacerebbe che il sistema automaticamente gli proponesse di inserirlo mostrando un MsgBox (Nuovo socio S/N).
Con un pò di impegno riuscirei a farlo, se non fosse per due cose che ignoro:
- testare la condizione di EOF() raggiunta;
- impartire il comando di append nuovo record,
di cui sinceramente non so proprio come impostarne le sintassi in VBA.
Mi piacerebbe ricevere l'aiuto di un esperto che mi legge: è possibile?

Grazie
antonio cuomo

9 Risposte

  • Re: Testare la fine del file

    Si può fare, solo ti invito a fare una riflessione con me... (se ho capito bene)

    Quando l'operatore scrive un nome non presente tu vorresti che automaticamente uscisse un msgbox che chiede se vuoi inserirlo come un novo utente... sembrerebbe una buona idea, ma se questo deve avvenire automaticamente si corre il rischio che se lOP erroneamente digita una lettera sbagliata... viene interrotto da un msgbox.... la cosa sarebbe antipatica...

    il controllo invece, secondo me, andrebbe messo nell'evento "su uscita" oppure su pressione del tasto invio... che ne pensi?
  • Re: Testare la fine del file

    Su eventi Change della TextBox vai a modificare il criterio where che filtra il RowSource della listbox. ...
    A quel punto ti basta leggere il Listcount della listbox. ..e se=0 vai sul Msgbox.
    L'inserimento lo puoi fare in diversi modi ma il più semplice è aprire una form associata in modalità AcAdd o aggiunta. ..e dialogo in modo da renderla Sincrona.
  • Re: Testare la fine del file

    Perdonami Alex, ho un dubbio...
    Su eventi Change della TextBox vai a modificare il criterio where che filtra il RowSource della listbox. ...
    A quel punto ti basta leggere il Listcount della listbox. ..e se=0 vai sul Msgbox.
    se l'OP volesse cercare ad esempio "Antonio" e scrivendo sbaglia a scrivere e a metà parola dopo "Anto" preme ad esempio la "u" otterremo "Antou" in questo caso uscirebbe lo stesso il MsgBox?
  • Re: Testare la fine del file

    Sì corretto... in effetti serve strutturare una logica più intelligente. ...ma era solo un'idea.
    Qualsiasi controllo che restituisca ZERO genererebbe il medesimo difetto....
  • Re: Testare la fine del file

    Ho compreso tutto quanto ho letto (e non mi capita spesso).
    Per rispondere ad Angelo dirò che accolgo il suo suggerimento: io testerò mediante listcount, l'EOF() appunto "su uscita" dal TextBox.

    Ad Alex intanto, sottopongo l'attuale mio codice modificato secondo le sue istruzioni che a quanto pare ha ancora qualche problema:

    Nota che da menù io apro una maschera con
    DoCmd.OpenForm "M_Aderenti", acAdd, acDialog
    In essa trovano posto la TextBox, la ListBox e anche i campi della scheda socio, che si riempiono quando clicco sopra una row della listaBox. Sul click il focus passa automaticamente alla scheda dati.

    A questa fase si dovrebbe agganciare anche la procedura di "append nuovo socio", ma ciò non accade ancora.
    Dove pecco Alex ?

    Private Sub Testo106_Change()
    indizio = Me.Testo106.Text
    If Not IsNull(indizio) Then
    Me.Elenco104.RowSource = "Select ID, nome, indirizzo, nato from Aderenti where (nome like " & Chr$(34) & "*" & indizio & "*" & Chr$(34) & ");"
    Me.Elenco104.Requery
    End If
    End Sub

    Private Sub Elenco104_Click()
    Dim trovato As Object
    Set trovato = Me.RecordsetClone
    trovato.FindFirst "[ID]=" & str(Me.Elenco104)
    Me.Bookmark = scelta.Bookmark
    End Sub

    Private Sub Testo106_Exit(Cancel As Integer)
    If Me.Elenco104.ListCount = 0 Then
    If MsgBox("Nominativo inesistente" & Chr(13) & Chr(10) & "Vuoi inserirlo ?", vbCritical + vbYesNo, "Esito della ricerca") = vbYes Then
    MsgBox ("Bisogna creare lo spazio per il nuovo socio")
    '......... Append
    '......... Trasferimento TextBox -> [nome]
    Else
    MsgBox ("Modifica nome inserito")
    Me.Testo106.SetFocus
    End If
    End If
    End Sub

    Ciao a tutti
    antonio
  • Re: Testare la fine del file

    In essa trovano posto la TextBox, la ListBox e anche i campi della scheda socio, che si riempiono quando clicco sopra una row della listaBox. Sul click il focus passa automaticamente alla scheda dati.
    allora ti do un consiglio clicca nella propietà dell elenco e nell'origine riga metti:
    SELECT aderenti.nome, aderenti.indirizzo, aderenti.nato FROM aderenti WHERE (((aderenti.nome) Like "*" & [Forms]![Maschera1]![testo106].[Text] & "*"));
    
    vai nel codice e cancella tutto testo106_change

    poi vai nell'evento change del text box e metti una MACRO (non codice) riesegui query su elenco104

    quanto sopra permettera l'aggiornamento realtime dell'elenco mano mano che modifichi e non al click... per maggiori info ed un esempio funzionante...
    http://progrediamo.altervista.org/joomla/pc-e-informatica/item/46-query-dinamica-visualizzata-in-una-sottomaschera-e-controllata-da-un-textbox.html
    A questa fase si dovrebbe agganciare anche la procedura di "append nuovo socio", ma ciò non accade ancora.
    se hai seguito attentamente le istruzioni del punto precedente dovresti risolvere anche il problema del testo106_exit
  • Re: Testare la fine del file

    Ti ringrazio Angelo per il buon suggerimento; mi ha snellito un attimo il mio codice, ma purtroppo il risultato non mi è cambiato.
    Dopo la prima "cura" il problema mi si era spostato più avanti e cioè alla difficoltà di avere un "append" a seguito di un dialogo con l'OP.
    Al momento per ogni nuovo carattere digitato in TextBox, io visualizzo tranquillamente in Elenco tutti i record che matchano, e quando arrivo ad una stringa che non esiste ancora, l'elenco giustamente mi si svuota.
    Se clicco su elenco vuoto non succede nulla;
    allora mi sono inventato (Su uscita) da TextBox un codicino per dialogare con l'OP e scegliere se occorre, di inserire un nuovo record.
    Come dicevo sopra, nella stessa maschera aperta con
    DoCmd.OpenForm "M_Aderenti", acAdd, acDialog (come diceva Alex) e con
    "Origine record" tabella "Aderenti", convivono il TextBox, l'Elenco ed ogni campo del solo record (non in sottomaschera) che vado a selezionare in Elenco.
    Il problema è: (vedasi la Sub Test106_Exit riportata sopra) creare un record nuovo e trasferire tutto quanto scritto, dalla TextBox all'interno del campo nome sottostante.

    In pratica simulare il comando del pulsantino "Nuovo record (vuoto)" situato accanto ai "pulsanti di spostamento" (in basso a sx di ogni maschera) ?
    Questa cosa, come mille altre, non la so fare. Mi salvi chi può.
    Ciao a chi legge.
  • Re: Testare la fine del file

    Potrei aver capito male comunque secondo me, alla conferma da parte dell'op circa l'append dovresti aggiungere, quando l'op preme ok, il codice sottostante:
    
    dim memo as string
    
    memo= testo106.value
    
    DoCmd.GoToRecord acDataForm, "M_Aderenti", acNewRec
    
    '[campo che dovrebbe assumere valore di text_106 senza parentesi quadre].value = memo
    
    docmd.save
    
    nb:
    potrebbe non salvarti correttamente il record... se così fosse prova ad aggiungere, dopo docmd.save:
    
    DoCmd.GoToRecord acDataForm, Me.Name, acPrevious
    DoCmd.GoToRecord acDataForm, Me.Name, acNext
    
  • Re: Testare la fine del file

    Caro angelo, ciao,
    In verità non pensavo che anche di sabato avrei potuto attendermi una risposta tanto sollecita quindi
    mentre mi ero messo in attesa di un possibile suggerimento da parte di voi programmatori mi sono dilettato a fare delle ricerche non poco faticose e guarda caso siamo arrivati alle stesse conclusioni.
    Ho modificato così la mia sub "Su uscita" in questo modo:
    Private Sub Testo106_Exit(Cancel As Integer)
    If Me.Elenco104.ListCount = 0 Then
    If MsgBox("Nominativo inesistente" & Chr(13) & Chr(13) & "Nuovo inserimento ?", vbCritical + vbYesNo, "ESITO RICERCA") = vbYes Then
    DoCmd.GoToRecord , , acNewRec ' Aggiunge un nuovo record
    Me.nome.Value = Me.Testo106.Value ' Copia il nome nel campo/record di editing
    Me.Testo22.Requery ' Non conoscevo il DoCmd.Save: è più corretto? lo proverò
    Else
    Me.Elenco104.SetFocus 'Passaggio ozioso ma necesario per ritornare su Testo106
    Me.Testo106.SetFocus 'Ritorno a modificare il testo immesso / errato.
    End If
    End If
    End Sub

    Ti sono molto grato per ogni tua indicazione, siete davvero tutti gentili e soprattutto competenti.
    Alla prossima e grazie.
    Antonio cuomo
Devi accedere o registrarti per scrivere nel forum
9 risposte