Newsgroup: it.comp.appl.access
Titolo: evitare duplicato

Buonasera.
Con il seguente codice
SELECT IDScontrino FROM tblScontrini WHERE IDFornitore = " & Me.cmbIDFornitore & " AND DataScontrino = " & Me.txtDataScontrino & " AND ImportoScontrino = " & Me.txtImportoScontrino
verifico la presenza di un precedente scontrino già esistente che abbia la stessa data, Fornitore e importo.
Tale evento può verificarsi,  pertanto prima di salvare l'utente conferma se si tratta di un duplicato o ha erroneamente inserito di nuovo tale scontrino.
I controlli della maschera non sono associati.
La query non trova alcun record in quanto l'importo dello scontrino esistente è in formato valuta (1,00) e il valore della casella di controllo txtImportoScontrino è 1.
Come posso far capire a Vba che il valore della casella di controllo è nello stesso formato?
Se nella griglia dei criteri della query, scrivo a mano 1 invece funziona.
Grazie
Giuseppe


Non trova nulla perchè la WHERE CONDITION sicuramente è errata nella sintassi del campo Data.
Vedi questo:
http://www.donkarl.com/it?FAQ3.13
 
 
@Alex


Ciao Alex e grazie della risposta.
No il problema è il confronto tra l'importo dello scontrino già registrato e il valore della casella di testo non associato del record da salvare.
Ho provato su un'altro record e se verifico IdFornitore, DataScontrino e ho aggiunto IDStruttura la query trova record corrispondenti.
Se aggiungo il criterio sull'importo (e in questo caso i decimali non erano ,00) la query va in errore.
Ho aggiunto davanti a me.txtImportoScontrino la funzione noEuro che sostituisce la virgola con il punto. 
Questo il codice completo:
SELECT IdScontrino FROM tblScontrini WHERE IdStruttura = " & Me.txtIDStruttura & " AND DataScontrino = " & Me.txtDataScontrino & " AND IDFornitore = " & Me.cmbIDFornitore & " AND ImportoScontrino = " & norEuro(Me.txtImportoScontrino)
e questo il risultato che ho nella finestra immediata di Vba
SELECT IdScontrino FROM tblScontrini WHERE IdStruttura = 3 AND DataScontrino = 30/08/2020 AND IDFornitore = 93 AND ImportoScontrino = 14.50
Giuseppe
 

 Giuseppe
 
Giuseppe, ti manca un pezzo ma devi ascoltare quando ti vengono dati suggerimenti.
Devi discriminare la Risoluzione IMPLICITA da quella ESPLICITA, tu usi la risoluzione ESPLICITA del prodicato, quindi ti devi preoccupare di come poi il sistema, JET in questo caso interpreta quello che tu gli passi, cosa che non faresti in risoluzione IMPLICITA in quanto verrebbe delegato lui.
 
ES(RIS. IMPLICITA):
SELECT IdScontrino FROM tblScontrini 
WHERE IdStruttura = FORMS!NOMEFORM!txtIDStruttura  AND 
              DataScontrino = FORMS!NOMEFORM!txtDataScontrino  AND 
              IDFornitore = FORMS!NOMEFORM!cmbIDFornitore AND 
              ImportoScontrino =  norEuro(Forms!NomeForm!txtImportoScontrino)
 
In questo caso il costrutto si occupa di reperire i VALORI e convertirli.
Pe rconversione intendo tutto quello che afferisce alla sintassi di FIELDTYPE. 
 
Quindi siccome tu usi la ris. Esplicita, ovvero risolvi i RIFERIMENTI esterni esplicitamente passando i VALORI... devi anche fare una parte del lavoro di adattamento.
La data che hai inserito è corretta, per PURO CASO, solo perchè NON esiste il mese 30..., quindi JET non la converte in accezione ANGLOSASSONE in mm/dd/yyyy, ma se fosse una data avesse il gg sotto il 12 del mese, avresti la sorpresa... di conseguenza "te lo avevo detto".
 
Per i NUMERI con decimali il problema è SIMILE... in quanto devi convertire il SEPARATORE DECIMALE in relazione alle impostazioni di SISTEMA, tu passi la VIRGOLA ma lui vuole il PUNTO.
 
Quindi per le DATE DEVI usare il suggerimento dato prima
Per i numeri Decimali devi usare questo:
http://www.donkarl.com/it?FAQ6.21
 
 
Saluti
@Alex
 
 


Alex ho risolto, ma credo per il criterio data non aver compreso bene come modificare il predicato SQL.
Con il  codice che riporto di seguito, trovo l'eventuale scontrino già esistente, indipendentemente se il giorno è inferiore o superiore a 12 (qui ho capito la differenza che mi hai spiegato).
SELECT IdScontrino, DataScontrino FROM tblScontrini WHERE IdStruttura = " & Me.txtIDStruttura & " AND DataScontrino = " & "#" & Format(Me.txtDataScontrino, "mm/dd/yyyy") & "#" & " AND IDFornitore = " & Me.cmbIDFornitore & " AND ImportoScontrino = " & Str(Me.txtImportoScontrino)
Scusami se non compriendo. Ho fatto tante prove ma questa soluzione è l'unica che mi restituisce il risultato sperato.
Ciao.
Giuseppe

 Giuseppe
 
Infatti così è giusto... 
In questo Link sempre di Karl trovi altre opzioni sempre lagate al campo Data:
http://www.donkarl.com/it?FAQ6.8
 
 
@Alex


Perfetto. Grazie ancora.
Giuseppe