Newsgroup: it.comp.lang.delphi
Titolo: Doppio record

Ciaon a tutti,
        ho una tabella e ho fatto tutto il necessario per poter aggiungere o 
modificare un record.
Oggi pero' si e' verificato un problema, durante la modifica di una record 
e' stato cambiato il campo descrizione ed e' stato inserito un valore che 
gia' esisteva in un altro record.
Com'e' possibile effettuare un controllo per evitare di salvare due voci con 
lo stesso nome???
Ho provato in modi dievrsi, ma non ci sono riuscito.
Grazie dell'aiuto,
Ciao,
Daniele 

> Ho provato in modi dievrsi
quali?
A.


Che vuol dire la modifica di un record etc...: lo hai fatto tu tramite 
utility (tipo Database Desktop) oppure ciò è avvenuto programmaticamente?
Dipende dal tipo di tabella che utilizzi, se prevede o meno la 
possibilità di indicizzare univocamente uno o più campi.
In ogni caso, la creazione di un campo-indice (credo sia questo il tuo 
problema) va SEMPRE verificato PRIMA della creazione, con una semplice 
ricerca (eventualmente: while not Eof...) in tutti i record della 
tabella.
Detto per inciso, non mi pare che una descrizione ripetuta possa creare 
problemi di indicizzazione di una tabella (però dipende 
dall'architettura adottata); sarebbe meglio utilizzare codici univoci, 
meglio se numerici, a cui collegare una descrizione univoca, da gestire 
separatamente in un'altra tabella...
NioBi
--- posted by geoForum on 
http://www.delphiedintorni.it

 quali?
Ho pensato di mettere ReadOnly il campo in questione, ma potrebbe essere 
necessario rinominare il campo con un nome nuovo non ancora usato.
Ho anche tentato di fare un locate, ma ritorna sempre true perche' il 
record, in effetti esiste e quindi c'e'.
Allora sono ricorso al RecNo, ma anche qui non vado troppo bene.
Infine, quando entro in modifica salvo il vecchio valore in una stringa, 
modifico il campo e controllo con locate il nuovo valore...
ma anche qui ci sono dei problemi.
Ho finito i tentativi ..... (tutti artigianali lo so ....).
Grazie per tutto,
Ciao,
Daniele

non ho ben capito... il tuo problema è che data una tabella fatta
cosi:
codice integer
descrizione varchar(30)
prima di inserire un nuovo record devi verificare che non esista un
record con lo stesso valore del campo descrizione?
Una nota.. :-|
Non dovrebbe essere necessario chiederti che tipo di db usi, la
tecnologia e infine se usi oggetti query, tabella, se usi un
clientdataset...
Per uno sviluppatore descrivere dettagliatamente ma sinteticamente il
CONTESTO dovrebbe essere automatico come respirare.
Da come scrivi presumo usi paradox.. ma via tquery o ttable??
A.

 tabella.
Per quale motivo? si puņ semplicemente provare a creare l'indice: se
riesce, bene; se non riesce, vuol dire che ci sono valori duplicati. Che
intendi per "verificare"?
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 CONTESTO dovrebbe essere automatico come respirare.
Haime' io non faccio parte della vostra categoria e non di rado ho delle 
mancanze tecniche che portano ad una spiegazione sommaria e poco elegante 
del problema.
Comunque sono riuscito a risolvere il problema in modo un po macchinoso (o 
maccheronico??).
Ecco come ho risolto forse, ma non credo, potra' servire a qualcuno !!!
Nel caso di un nuovo record prima di salvare controllo se, il testo 
digitato, esite gia' un record con quella dicitura.
Il controllo viene eseguito con un locate, se torna vero, allora c'e' un 
avviso e il salvataggio si blocca tornando all'input della descrizione.
Se invece il record e' in modifica, prima di entrare nella procedura 
memorizzo la posizione nel DB con RecNo, poi prima di salvare controllo se 
il campo in questione esise gia'.
Il problema e' nel controllo, infatti se il record non esiste, allora si 
tratta di una rinominazione dello stesso; Ma se esiste, sempre tramite 
locate, controllo il numero di record (RecNo)
trovato. Se il numero di record trovato e' uguale a quello salvato entrando 
in procedura allora posso salvare perche' si tratta dello stesso record, in 
caso contrario si tratta di due record
diversi, quindi blocco ilm tutto.
Spero di non aver fatto eccessiva confusione, il tutto funziona e, di certo, 
ci saranno altre strade piu' pulite e performanti della mia per fare questo 
tipo di controllo.
Grazie di tutto,
Ciao,
Daniele 


La tua domanda vale da sè come risposta.
E' evidente che tu ti stai cimentando con qualcosa di hobbistico, poco 
professionale, stai semplicemente utilizzando una tabella per inserirci 
dei dati (secondo te) ordinati secondo un criterio.
Creare una tabella non è sufficiente, perché tutt'attorno (se mi si può 
passare il riferimento) deve esistere un'architettura ben congegnata di 
gestgione e controllo della tabella stessa, anche con l'ausilio di altre 
tabelle: ecco creato un Database.
La tabella, di per sè, è soltanto un file che contiene alcune righe di 
testo; l'unica cosa che la distingue dagli altri file è che possiede, 
anche, dei campi di suddivisione delle righe ed un cursore che tu puoi 
posizionare a piacimento dove vuoi e leggere cosa c'è in quel punto.
Questo è quello che hai fatto tu fin'ora, null'altro.
Però esiste anche "il resto", nel senso che un record (insieme di campi) 
va estratto dalla tabella, gestito per singolo campo (cioè con controllo 
di congruità del contenuto con quanto era previsto dovesse essere 
inserito in quel campo) e poi reinserito al suo posto nel file; 
quest'ultima fase, poi, ne prevede altre, quali lo stabilire se si è 
deciso che la tabella debba contenere un campo principale dal quale 
dipendono gli altri, che questo campo sia indicizzato, che l'indice 
comprenda diversi campi, etc, ed in sede di registrazione è il codice 
(il programma, per intenderci) che deve farsi carico di tutti questi 
controlli, anche se la tabella prevede (es. Paradox) la possibilità di 
inserimento univoco di un campo indicizzato.
Per fare questi controlli, è necessario "costruirsi" una serie di 
routines, spezzoni di programma che verifichino se quello che vuoi fare 
(registrazione o inserimento di un nuovo record) possa erre fatto o 
meno, magari con l'ausilio di un'altra tabella parallela (es.: una 
TQueri aperta sullo stesso file agganciato a TTable, filtrata in modo 
tale da controllare se ci sono altri campi simili, etc.).
Anche se Delphi prevede la possibilità di tenere aperta una TTable per 
il tempo necessario alle variazioni del caso, sarebbe bene prelevare il 
record (inserimento di ogni campo in una TEdit), chiudere la tabella, 
gestire manualmente i dati e controllare quel che si scrive, chiedere la 
registrazione ed esperire i controlli del caso, indi aprire la tabella e 
registrare il record variato o inseriren uno nuovo.
Io personalmente gestisco progetti alquanto complicati, e ti garantisco 
che associare una descrizione (es. un cognome.nome, un Comune, la 
descrizione di una voce in busta paga, etc.) ad un numero è 
gratificante, perché devi semplicemente gestire numeri, che sono di per 
sè univoci.
Ovviamente, per il famoso "tutt'attorno", vi è un programma che gestisce 
una ragnatela di tabelle, ciascuna in funzione di una singola raccolta 
di dati (anagrafica dei nominativi, anagrafica del comuni, anagrafica 
dei titoli di studio, anagrafica...), tutti riportati con un semplice 
codice numerico nella tabella principale dei nomi; questi nomi, a loro 
volta, vengono elencati in una finestra (TDBGrid) secondo un ordine da 
me prestabilito; dalla finestra posso agevolmente stabilire quale riga 
mi serve e cosa è scritto dentro, quindi prelevare (findkey) il codice 
cliccato; in sede di registrazione registro il codice numerico: se 
esiste si sovrascrive il record, se non esiste lo crea.
Per questo ho detto all'inizio che mi sembra strano che un nome 
duplicato ("pasta e pesto" e "basta e pesto") possa creare subbuglio: 
sono due nomi diversi, le per la tabella sono record diversi: mi divi 
come fai a cercare "basta e pesto" se la tabnella contiene "pasta e 
pesto"? non la trova, e crea un nuovo record; avendo però il codice 12 
collegato a "pasta e pesto", cercherà 12 e vi trasfomderà "basta e 
pesto", che comparirà in elenco con tuto il suo errore di battitira 
(quanto meno, in ordine alfaberito ha cambiato posto...).
Scusa il dilungarsi, ma credo che la tua non sia una questione di 
comandi o strumenti, quanto di organizzazione del lavoro e creazione del 
codice necessario.


Antonio BIANCA ha scritto:
<cut>
Ma - scusa - DBMS, SQL, trigger, generator, ecc... che fine hanno fatto?
Ciao
ACSH


 registrare il record variato o inseriren uno nuovo.
Niente affatto, non è così che si gestiscono i dati in Delphi.
I tuoi "sarebbe bene" tienteli.
<snip su tutto il resto che ha poco senso e molto di trollistico>


 Ma - scusa - DBMS, SQL, trigger, generator, ecc... che fine hanno fatto?
In realtà, mi è venuto il dubbio che si tratti del solito troll.
Un mare di scemenze come quelle che ha scritto sono giustificabili solo in
questo modo. Comunque, per Daniele (l'OP): se vuoi controllare
l'inserimento di un valore univoco in un campo, crea un indice univoco
(puoi farlo anche in Paradox) e testa l'eventuale eccezione all'atto
dell'inserimento. Con Paradox la gestione degli indici non è granché, ma è
sicuramente meglio che fare controlli manuali.
