Newsgroup: it.comp.appl.access
Titolo: Problemone con "FindRecord"

Chi sa spiegarmi come fare a dare in uscita un messaggio del tipo "Non ho
trovato nessun record" quando il comando Find record non trova dati in una
tabella?
Graaaziee :-)

 ha scritto nel messaggio
news:9f34s3$pk9$1...@nreadA.inwind.it...

Sull'help dai uno sguardo alla proprietą NoMatch.
--
Roberto
---------------------------------------------
il Sito Comune di it.comp.appl.access:
http://www.sitocomune.com
---------------------------------------------


L'ho vista ma non ho ben capito come funziona.
Io sono alle prime armi!
Puoi darmi una mano?


Scusami non avevo notato che stavi usando il metodo FindRecord dell'oggetto
DoCmd e quindi la proprietà NoMatch non c'enta nulla. Chissà perchè pensavo
ad una ricerca effettuata in un recordset tramite FindFirst.
Se stai ricercando un record che nel campo associato al controllo Nome
contiene il valore contenuto nel controllo Pippo penso che la ricerca l'hai
scritta più o meno così:
Me!Nome.SetFocus
DoCmd.FindRecord Me!Pippo, , , , True
A seguire al tuo codice VBA aggiungi
If Me!Nome <> Me!Pippo Then
    MsgBox "Non ho trovato nessun record"
End If



Sei molto gentile e paziente... ma purtroppo la colpa è solo mia perché non
ti ho spiegato bene come stanno le cose.
Forse facciamo prima se ti spiego cosa devo fare.
Io ho una maschera che crea una fattura e in cui inserisco tutti i dati
relativi alle prestazioni eseguite ed alla targa del veicolo (Il campo si
chiama appunto Targa).
Quando chiudo la maschera vorrei che il codice aprisse una tabella in cui
sono registrati i dati di tutte le auto revisionate per verificare se l'auto
sulla quale è stata appena emessa la fattura esiste già nella tabella oppure
no.
Se l'auto non esiste il codice chiederà di inserirla (Ma questo è un'altro
discorso che già ho risolto) Se invece esiste si limiterà ad aggiornare il
valore di un campo.
Il problema sorge proprio nel momento in cui vado a fare questa ricerca. Il
codice da me scritto funziona alla perfezione; tranne che nel momento in cui
vado ad emettere una fattura per un veicolo che non è presente nel database.
A quel punto il codice, al posto di darmi un errore, si limita a fermarsi
sul rimo record della tabella.... sfasandomi tutto.
Le maschere e le tabelle del progetto sono le seguenti:
Maschera: "Nuova Fattura"
Tabella: Revisione Veicoli
il codice, per altro mooolto esile, che ho scritto io è il seguente:
 ' Apre la Tabella contenente tutti i dati dei Veicoli Revisionati
   DoCmd.OpenTable "Revisione veicoli", acNormal, acEdit
  ' Seleziona il primo record della query
    DoCmd.GoToRecord acTable, "Revisione veicoli", acFirst
   ' Va al controllo contenente la targa del veicolo.
     DoCmd.GoToControl "TargaVeicolo"
    ' Cerca il record corrispondente alla targa del veicolo inserito in
fattura.
       DoCmd.FindRecord Me!Targa, , , , , True
' e qui cominciano i problemi... dove sbaglio???
 If (TargaVeicolo <> Me!Targa) Then
     MsgBox "Targa NON trovata"
     Exit Sub
 Else
     MsgBox "Targa Trovata"
     Exit Sub
  End If

 ha scritto nel messaggio
news:9f3d3p$uss$1...@nreadA.inwind.it...

Ma se le cose stanno così a che ti serve il metodo FindRecord?
Va usato quando in una maschera si vuole rendere corrente un record cercato,
che però non è ciò che vuoi.
A te serve solo sapere se in una detrminata tabella esistono oppure no
record che soddisfano determinati criteri; per far questo devi usare la
funzione DLookup (vedi help); se la funzione ti restituirà un valore Null
significa che il record non esiste; se invece la funzione ti restituirà un
valore diverso da Null significa che c'è uno o più record che soddisfano i
criteri di ricerca.



il problema vero è proprio non è quello di cercare il valore nella tabella.
Infatti
con il metodo find record ci riesco benissimo. Il problema sorge nel momento
in
cui il record che cerco non c'è.
Io credevo che il metodo find record, nel momento in cui non trova l'oggetto
della ricerca, restituisse qualche tipo di valore o errore (che so, "True",
"False",
"null" o "Error"). Invece si limita a fermarsi sul primo record del campo in
cui sto
facendo la ricerca. A questo punto ho pensato... "Vabbè, non è un
problema...
dopo aver fatto la ricerca e dopo aver trovato o non trovato il record,
faccio fare
al codice un controllo nella cella in cui si è fermato. E qui sorgono i
problemi.
Credevo che sarebbe stato sufficiente fare un controllo tra la cella in cui
il
puntatore si è fermato e il valore passato dalla maschera... il risultato da
me
sperato avrebbe dovuto essere il seguente:
1)Record Non Trovato: se il record non è stato trovato, il cursore si ferma
sulla
   prima riga della tabella, nel campo da me selezionato... allora io faccio
un
   confronto tra il valore presente il quel record e il valore passato dalla
maschera;
   se il valore è uguale vuol semplicemente dire che effettivamente il
record che
   cercavo si trova proprio nella prima riga (E quindi  passa al punto 2 con
una
   routine If...then...else), se il record è diverso allora mi avverte che
il valore che
   cercavo non esiste nella tabella, e quindi mi chiede se voglio inserirlo.
2) Record trovato: se il record è stato trovato vuol dire che deve "per
forza"
   essere uguale al valore passato dalla maschera... quindi mi limitavo a
svolgere le
   altre operazioni di inserimento spostandomi sulla riga del puntatore
attivo (E fin
   qui funziona tutto a meraviglia).
Tutto perfetto quindi.... peccato che il tanto agognato controllo
(Probabilmente
per un mio errore nella scrittura del codice) non avvenga. Quindi succede
che:
1)Il record viene trovato: Fa tutte le operazioni così come voglio io,
   posizionandosi quindi su quel record e spostandosi di campo in campo
nella riga
   per inserire dei dati:
2)Il record non viene trovato: Al posto di darmi un messaggio in cui mi
avverte
   che il record non è stato trovato, esegue le operazioni di inserimento
nella prima
   riga.
Il problema a questo punto non è cercare il record ma fagli fare sto
benedetto
controllo così come ti dicevo nella mail precedente. Puoi aiutarmi a capire
dov'è
che sbaglio per favore nel codice subito sotto la scritta " e qui cominciano
i
problemi... dove sbaglio???" della mail precedente? Ho forse dichiarato male
il
nome del campo in cui andare a fare il controllo??? Davvero non capisco
(Forse
sono troppo ottuso per questo genere di cose). Devo cominciare a fatturare
ma
non posso fare niente se prima non risolvo questo dannatissimo problema.
Grazie ancora per la pazienza che stai avendo (questo ringraziamento non è
un'opera di lecchinaggio ma ti è davvero dovuto).
Pino.

 ha scritto nel messaggio
news:9f4u64$f3f$1...@nreadB.inwind.it...
[CUT]
Allora mettiamo alcuni punti fermi.
1) A prescindere da quello che tu credi, il metodo FindRecord ricerca, in
base ad alcuni criteri da te stabiliti, un record nell'oggetto che è origine
record della maschera attiva; se il record esiste, esso diventa il record
corrente della maschera attiva; se invece non esiste, nella maschera attiva
continui a visualizzare il record che era corrente prima di eseguire il
metodo FindRecord.
2) Prima di eseguire il metodo FindRecord devi spostare il fuoco sul
controllo sul quale vuoi effettuare la ricerca.
3) Se la ricerca ha dato esito positivo, il valore contenuto nel controllo
su cui hai spostato il fuoco e fatto la ricerca assume il valore della
stringa di ricerca (visto che il record trovato diventa record corrente).
4) Da quanto scritto sopra é evidente che, per sapere se il metodo
FindRecord ha avuto esito positivo, è sufficiente confrontare il valore del
controllo su cui si è effettuata la ricerca con il valore della stringa di
ricerca.
5) Resta il fatto che, prima di eseguire il metodo FindRecord, devi comunque
aprire la maschera nella quale ti comparirà il record trovato; se però il
record non esiste, nella maschera ti comparirà il primo record dell'oggetto
che è origine record della maschera.
6) Non credo che si possa parlare di record correnti per le tabelle come
dici tu.
Tutto ciò è incontrovertibile nella misura in cui tu hai deciso, per
risolvere il tuo problema, di usare il metodo FindRecord. Naturalmente
esistono altri modi per fare ciò che ti serve.
Se invece tu vuoi, fermo restando l'uso di FindRecord, aprire la maschera
solo nel caso in cui il record esiste, è indispensabile prima di tutto
appurare l'esistenza del record nella tabella, ed aprire la maschera ed
eseguire il metodo FindRecord SOLAMENTE nel caso in cui il record esiste.
Per fare questo la funzione DLookup (in alternativa la funzione DCount) è
quella che fa al caso tuo; il fatto che non riesci ad usarla è dovuto
probabilmente al fatto che non ne hai scritto correttamente i criteri, o per
degli errori di sintassi. Postaci il modo in cui hai scritto la Dlookup e
poi vedremo.
Ti ricordo che la Dlookup ti restituisce un valore Null nel caso in cui il
record non esiste (a questo punto puoi inviare un messaggio di errore
all'operatore) o un valore significativo se il record esiste (in questo caso
apri la maschera ed esegui il metodo FindRecord).
