Newsgroup: it.comp.lang.delphi
Titolo: Prevenire duplicati al momento di inserimento in un dataset

salve a tutti,
  come è possibile evitare di inseire duplicati in un campo di una
tabella? Per esempio io ho una tabella con due campi (A e B). Io vorrei
salvare inA dei numeri ed impedire che l'utente possa inserire in A un
numero già presente. Ho provato mettendo un Locate nell'BeforePost del
dataset, ma non funziona. Nessuno ha qualche idea in proposito?
Grazie,
 Andrea Pollini


che sappia io non e' possibile. Magari fossi smentito perche'
uso sempre tabelle varie.
Personalmente prima del post (table1.beforepost)
faccio un table1.locate, se la ricerca è negativa
faccio il post altrimenti il cancel.
saluti,
Lorenzo

..ma non dici quale db usi....
Se usi interbase puoi applicare il costraint UNIQUE ad un campo
e quindi da codice non fai questo controllo: lo si delega al db 
che ti restituisce una eccezione che tu puoi gestire.
Su paradox non so.
Bye
AS
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 numero già presente.
Se ho ben capito A è una chiave univoca e primaria.....
Premetto che io gestisco l'eccezione (come già ti ha detto Alberto) e cerco
di usare campi autoincrementali per creare chiavi primarie.....comunque.....
Hai provato ad usare l'istruzione SQL "REPLACE"? praticamente è una specie
di INSERT che aggiorna i dati nel caso trova chiavi primarie uguali.
Es:
REPLACE INTO tabella (A,B) VALUES (123,999)
Inserisce i valori nella tabella, se trova A esistente aggiorna solamente B
Ciao
Gianni Giusti

Il DB E' Interbase, scusa se non ho specificato...


 faccio il post altrimenti il cancel.
...Ma fecendo una locate non si sposta il puntatore del record e dunque il
post ??? in questo modo fai un post e con conseguente key violation se il
campo č indice primario, il cancel in beforpost dopo una locate(non sei piů
in dsInsert) non serve piů ci starebbe meglio un abort.
Si potrebbe gestire con una query temporanea di ricerca nell'evento
beforepost qualcosa del tipo "select Count(campo) from tabella where campo =
ID" ma penso che dia problemi in fase di modifica del campo.
Un modo potrebbe essere mettere il campo come chiave primaria e gestire
l'eccezione KeyViolation
Saluti NEA

 Gianni Giusti


 post ???
in effetti, spiegato di getto come ho fatto io succede proprio quello che
hai detto tu.
Pero' si sa che in delphi quello che non c'e' bisogna inventarlo (uso il BDE
con delphi5) ed io, quando ho l'esigenza di fare un locate, ho anche una
TTable
in piu' che punta alla stessa tabella fisica sul disco. Cosi' con Table1
faccio il
Locate mentre con Table2 faccio l'Insert.
Poi ogni applicazione ha le sue soluzioni.
saluti,
lorenzo

 ...una query e quindi l'ho disponibile per qualsiasi altro scopo.
Interessante, lo terrò in considerazione nel caso tornassi ad usare i
componenti standard di Delphi. Grazie per il suggerimento.
.....toglimi una curiosità...
nel componente Tquery c'è una proprietà, AutoCalcField, mettendola  a true,
non si dovrebbe avere immediatamente il valore di un autoinc senza
rieseguire la query? con MySql non funziona, magari con altri server SQL
sì......oppure stò dicendo una C**ata mostruosa?
Ciao
Gianni Giusti

 sì......oppure stò dicendo una C**ata mostruosa?
No.
Quella prop riguarda i campi calcolati da CODICE.
Se fai sul FieldEditor hai modo di creare dei campi calcolati direttamente
dall'oggetto dataset.
Se la pk viene assegnata da un trigger viene fatto tutto lato server e quindi
il client non ne sa un kakkio, salvo un requery.
Ma poi, come lo becchi il nuovo record se non ne conosci la pk?
Certo, il modo lo si trova, ma è un bel casino.
La tecnica che uso io evita tutto 'sto macello.
Bye
AS


 La tecnica che uso io evita tutto 'sto macello.
Capito benissimo....(adesso ho capito pure perchè non mi funzionava)
Tornando agli autoincrementali mi dimenticavo che comunque è possibile
recuperare l'ultimo inserimento con l'istruzione  LAST_INSERT_ID() che ti
restituisce l'ultimo valore di un campo autoincrementale della connessione
corrente, in pratica, la chave la genera il server SQL (autoinc e sei sicuro
della sua univocità...sembra quasi uno slogan) e tu la recuperi e la usi per
inserire il dettaglio. In Delphi non la uso mai, perchè il risultato i
componenti Zeos me lo danno "al volo", ma in PHP la uso e funge.
Ciao
Gianni Giusti