Newsgroup: it.comp.lang.delphi
Titolo: Copiare record con la stessa chiave

Salve a tutti. Devo copiare dei record da un database paradox a un' altro
database ( sempre paradox). Faccio una ricerca per nome nel db, trovo il
record che gli corrisponde e cerco di copiarlo nell' altro db. Dato pero'
che hanno la stessa chiave, il programma da' key violation durante la
copia. Come si puo 'fare a sistemarlo ?
-------------------------------------------------------
Messaggio inviato da 
http://www.sandlab.org/newsgroup/
Accesso gratuito via web ai Newsgroup

 copia. Come si puo 'fare a sistemarlo ?
Non vedo altra soluzione che rimuovere la chiave primaria, o modificare 
il contenuto del campo. :-|
-- 
MARCO «Alka» BREVEGLIERI
   (
http://www.marco.breveglieri.name
)
Leggi le FAQ di ICLD: 
http://icld.altervista.org

Marco Breveglieri wrote:




Ups, scusate il messaggio di prima, ma ho sbagliato ^^  se mettessi un
campo che si aumenta di uno ogni operazione credi che vada bene ?


Marco Breveglieri wrote:




-------------------------------------------------------


 se mettessi un campo che si aumenta di uno ogni operazione credi che vada bene ?
Non saprei. Non so cosa contiene quel campo... se si tratta di un dato 
significativo ed è importante che non sia duplicato poichè chiave primaria?
Aggiungi magari qualche dettaglio in più...
Ciao,
   Marco.


 Leggi le FAQ di ICLD: 
http://icld.altervista.org
Il campo che e' chaive primaria e' il codice di un oggetto e come tale non
deve essere modificato. Poi ci sono alcuni campi come prezzo e
descrizione, a cui pensavo si aggiungere un campo + in base al discorso di
cui sopra


cui sopra
il problema che stai affrontando credo che rientri
nella classe dei problemi di riconciliazione dei dati,
Tali problemi ti aiuta a risolverli il ClientDataset.
Fai delle ricerche sul metodo OnReconcileError del
TClientDataSet.
La realizzazione del tutto non è semplicissima ma
potresti riuscire ad automatizzare elegantemente il
tutto.
Un'altra via è eseguire la riconciliazione a manina.
Esegui un ciclo su tutti i record nuovi e per ogni
record nuovo, esegui un locate sui dati vecchi in base
alla chiave. Si potranno presentare due situazioni: il
locate trova il vecchio record, allora mandi il vecchio
record in edit, sostituisci i dati vecchi con i nuovi e
dai il post; il locate non trova il vecchio record,
allora chiami un insert inserisci i nuovi dati e dai un
post. Finito il ciclo di modifica e inserimento esegui
un ciclo, questa volta, sui record vecchi, chiami il
locate del dataset dei nuovi record, se trova il record
vai avanti, se non lo trova lo elimini dai vecchi.
In questa maniera alla fine di tutto il lavoro dovresti
avere nel dataset (e quindi nella dabella del DB
relativa) dei vecchi record solo i nuovi record senza
duplicazione di chiavi.
Spero di essermi spiegato in tutto sto casino e
soprattutto di aver capito il problema ;)
	Ciao
	MassimoB
 
---------------------------------
http://www.massimobeschi.it/
---------------------------------
Se tu pagare come dici tu ...
Io lavorare come dico io ...
Se tu pagare come dico io ...
Io lavorare come dici tu ...
---------------------------------

 copia. Come si puo 'fare a sistemarlo ?
Non capisco dove sia il problema.  Questo non è un problema.  E' normale
che se due record hanno la stessa chiave, il software vada in "key
violation".
Come comportarti, di conseguenza, dipende da quello che devi fare.  Se si
tratta di "copiare" i record, allora controlli che nel secondo DB non
esista già il record e, nel caso già esista, non lo copi, oppure aggiorni
i dati tra un record e l'altro, ... dipende, appunto, da ciò che devi fare.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ha scritto nel messaggio
news:5hire.4751$bc....@tornado.fastwebnet.it...


Ok, ho fatto un programma di esempio fatto cosi': ho creato due tabelle
paradox di nome 1 e 2 : nella tabella 1 ho messo un campo di
autoincremento come chiave e poi un campo cod come string. Nella tabella 2
invece c'e' solo cod, ed e' chiave primaria. Se provo a copiare una prima
volta i dati da un db all' altro tutto ok, mentre se ci provo mentre nella
tabella 2 c'e' gia' un dato, ecco che ritorna la key violation. Il codice
attualmente e' questo :
procedure TForm4.BitBtn1Click(Sender: TObject);
var codice:string[10];
begin
codice:=Edit1.Text;
if table1.locate('Num',codice,[]) = true then
   begin
  table1.Close;
  table1.open;
  table2.Close;
  table2.open;
  table2.append;
  table2Cod.value:=table1Cod.Value;
  table2.Post;
  table2.Close;
  table1.Close;
  end;


Ok, ragazzi, bene o male il problema del key violation e' risolto. Ora
pero', con un ciclo if gli dico che se quello che c'e' scritto nella edit
di turno e' uguale al campo del database, lui in teoria dovrebbe copiare i
dati di quel record, mentre invece copia il primo record che c'e' in
memoria. In pratica, qualsiasi record io voglia copiare, mi copia sempre
il primo


 il primo
C'è sicuramente un errore logico nel tuo codice...ma *ce lo devi far 
vedere* (e non capire male...) per poterlo correggere. :-D


    Marco.


E' identico a quell oche avevo postato prima ;) comunque lo riposto, con
la soluzione ultramaccheronica cui sono giunto XD (tanto non da fastidio
uno spazio in piu' :p ) 
procedure TFrmScarico.BitBtn1Click(Sender: TObject);
 var codice:string;
  begin
 codice:=Edit1.text;
 if Data.text='' then
  begin
  FrmScarico.Hint:='Devi inserire anche la data prima' ;
  FrmScarico.ShowHint:=true;
  end
 else
 begin
 if table1.locate('Codice articolo',codice,[]) = true then
  begin
  table1.Close;
  table1.open;
  table2.Close;
  table2.open;
  table2.append;
  table2Codicearticolo.value:=table1Codicearticolo.Value+'';
  table2Descrizione.value:=table1Descrizione.Value+'';
  table2Quantita.value:=table1Quantita.Value+0;
  table2Costo.value:=table1Costo.Value+'';
  table2Prezzoalpubblico.value:=table1Prezzoalpubblico.Value+'';
  table2Data.Value:=Data.Text;
  table2.Post;
  table2.Close;
  table1.Close;
  table1.open;
  table2.Open;
  end;
end;
end;
end.


[...]
non mi soffermerò troppo a commentare tale codice ma ho
una domanda: perchè quando valorizzi i campi sommi,
sempre, al valore da assegnare l'equivalente del tipo
vuoto, '' per le stringhe e 0 per i numerici? forse per
evitare i null? non fai prima a impostare un valore
predefinito sul DB o da qualche altra parte?


 	MassimoB

Hai ragione, era proprio cosi' ;) con questo ho risolto tutto, grazie a
tutti per la disponibilita' :* il perche' degli spazi e' presto detto :
quando uno e' noob inside, lo sara' per sempre ^^'
