Newsgroup: it.comp.appl.access
Titolo: Ricerca record già esistente

Un grazie anticipato per l'aiuto. Vorrei che, nel momento in cui inserisco
in una maschera un N° Arch (testo-chiave primaria-non duplicabile)
verificare se ho già inserito tale numero.
In caso affermativo cancelli quanto digitato e non mi permetta di passare al
campo successivo se non prima di aver digitato un numero (testo) diverso
oppure ritornare al menù principale tramite un pulsante di comando.
Ho scritto il seguente codice ma non funziona molto bene:
Private Sub NumArch_BeforeUpdate(Cancel As Integer)
If Not IsNull(DLookup("[N° Arch]", "Archivio", "[N° Arch]='" & Me!NumArch
&"'")) Then
MsgBox "Numero di archivio già esistente"
Cancel = True
Me!NumArch.Undo
End If
End Sub
In effetti la prima volta ho il controllo se il record è già presente e
compare il messaggio,  ma dopo aver cliccato su l'OK posso posizionarmi sul
campo successivo. Nel caso invece cancelli il campo N° Arch mi ritrovo in un
loop continuo che mi chiede di inserire un nuovo numero.
Dov'è l'errore???

 ha scritto nel messaggio
news:3ryT6.12475$Zo3.1...@news1.tin.it...

Prova sostituendo
Me!NumArch.Undo
con
Me.Undo
Me!NumArch.SetFocus
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------

 ha scritto nel messaggio
news:9fnocl$2rae$1...@stargate1.inet.it...

Ho dimenticato di segnalare che nella struttura della tabella ho messo
Richiesto=si e Consenti lunghezza zero=no.
Succede che aprendo la maschera inizialmente posso posizionarmi su qualsiasi
campo (cosa che non vorrei) e poi, se inserisco un dato già esistente, dopo
il messaggio di avvertimento, se cancello quanto digitato, non riesco più ad
uscire dalla maschera se non inserendo un N° Arch nuovo!
Un saluto ed un grazie!
Giorgio

Non mi sembra che il tuo problema sia solo quello di verificare che esista
già un record nella tabella Anagrafe con lo stesso codice N° Arch.
Troppi ne vuoi fare di controlli; inoltre vuoi che l'operatore abbia la
possibilità di scegliere strade diverse a seconda delle circostanze.
Beh, la prossima volta raccontacela tutta. ;-)
Innanzitutto nella tabella Archivio setta a No la proprietà Richiesto del
campo N° Arch, altrimenti si innesca il loop da te lamentato: devi
protergeti, come vedremo, in altra maniera per garantirti che l'operatore
non ometta di digitare il codice.
Per far sì che all'apertura della maschera il fuoco sia posizionato sul
controllo NumArch, a fronte dell'evento "Su corrente" della maschera genera
la seguente riga di codice VBA:
Private Sub Form_Current()
Me!NumArch.SetFocus
End Sub
Se la maschera che contiene il menù principale si chiama MENU, a fronte
dell'evento "Prima di aggiornare" del controllo NumArch genera il seguente
codice VBA:
Private Sub NumArch_BeforeUpdate(Cancel As Integer)
If Not IsNull(DLookup("[N° Arch]", "Archivio", _
"[N° Arch]=" & Chr$(34) & Me!NumArch _
& Chr$(34))) Then
Dim IntNuovo As Integer, strTitolo As String
Dim IntFinestraMsg As Integer, strMsg As String
strTitolo = "Il codice " & Me!NumArch & " è già _
presente in Archivio"
strMsg = "Per ridigitare il codice corretto premi SI; _
per tornare al Menu Principale premi NO"
IntFinestraMsg = vbYesNo + vbExclamation
IntNuovo = MsgBox(strMsg, IntFinestraMsg, strTitolo)
If IntNuovo = vbYes Then
Cancel = True
Me!NumArch.Undo
Else
Cancel = True
Me.Undo
DoCmd.Close
DoCmd.OpenForm ("MENU")
End If
End If
End Sub
Così facendo, qualora l'operatore abbia digitato un codice già esistente in
tabella, premendo il pulsante SI della MsgBox ritenterà di digitare un
codice corretto, premendo invece il pulsante NO chiuderà la maschera di
inserimento ed aprirà la maschera menù principale.
Per verificare che l'operatore non si dimentichi di digitare qualcosa in
NumArch, a fronte dell'evento "Prima di aggiornare" della maschera di
inserimento genera il seguente codice VBA:
Private Sub Form_BeforeUpdate(Cancel As Integer)
If IsNull(Me!NumArch) Then
Dim IntNuovo As Integer, strTitolo As String
Dim IntFinestraMsg As Integer, strMsg As String
strTitolo = "Non hai digitato il codice NumArch"
strMsg = "Per digitare il codice premi SI; _
per abbandonare il record e tornare _
al Menu principale premi NO"
IntFinestraMsg = vbYesNo + vbExclamation
IntNuovo = MsgBox(strMsg, IntFinestraMsg, strTitolo)
If IntNuovo = vbYes Then
Me!NumArch.SetFocus
Else
Cancel = True
Me.Undo
DoCmd.Close
DoCmd.OpenForm ("MENU")
End If
End If
End Sub
Se quindi l'operatore ha dimenticato di digitare qualcosa nel controllo
NumArch, verrà avvisato con una MsgBox; se pigerà il pulsante SI, il cursore
si posizionerà sul controllo NumArch perché venga effettuata la digitazione
del codice; se invece pigerà il tasto NO, il record in fase di digitazione
verrà abbandonato, verrà chiusa la maschera di immissione dati ed aperta la
maschera del menù principale.
Spero che sia ciò che volevi.


 ha scritto nel messaggio
news:9g2hh9$2v16$1...@stargate1.inet.it...

Scusa l'abissale ignoranza ma ho ancora qualche problema che dopo vari
tentativi non sono riuscito a risolvere.
All'apertura della maschera "Inserimento" il prompt si posiziona su
"NumArch" e se digito un codice esistente compare il messaggio che mi
consente di ridigitare un nuovo codice o tornare al Menù principale. E fin
qui tutto OK. Se non digito nulla posso posizionarmi su un altro campo ma se
clicco sul pulsante "Menù principale" compare il messaggio di avvertimento
che ho lasciato vuoto il campo "NumArch", con la scelta di cliccare su SI
per un nuovo inserimento oppure su NO per ritornare al Menù principale.
Perchè se clicco SI torno al Menù principale e se clicco su NO mi compare il
messaggio "Errore run-time 2501. L'azione Close è stata annullata"?
Il tuo codice mi sembra perfetto!
Giorgio

 ha scritto nel messaggio
news:1YvV6.23281$a44.2...@news1.tin.it...

Non ho la più pallida idea quale sia il codice che hai generato a fronte
dell'evento "Su clic" del pulsante "Menù principale";
prova a postarlo.


 ha scritto nel messaggio
news:ceQV6.2863$7S1....@news.infostrada.it...

Ti ringrazio, sono riuscito a risolvere il problema.
Al prossimo........
Giorgio