Evo jednog od rjesenja koje se moze koristiti da se sprijece greske poput:
"Row cannot be updated for updating. Some values may have been changed...."
koje se dogadaju pri viseklijentkom radu sa bazom podataka (ADO komponente).
Da bi ovo radilo potrebno je da vasa tablica ima nekakav podatak tipa autonumber.
U ovom slucaju u bazi postoji tablica sljedeceg sadrzaja:
ID (autonumber, primary key)
Ime (Text)
Prezime (Text)
Code:
void __fastcall TForm1::T1BeforePost(TDataSet *DataSet)
{
// zapamti sve podatke koji trebaju biti spremljeni
long id = T1ID->Value;
AnsiString Ime = T1Ime->Value;
AnsiString Prezime = T1Prezime->Value;
// odspoji se i ponovo spoji na bazu da dobijes "friske" podatke
T1->Active = false;
T1->Active = true;
// provjeri da li je jedan od klijenata vec izbrisao taj zapis
TLocateOptions SearchOptions;
SearchOptions.Clear();
if(T1->Locate("ID", id, SearchOptions) == false && id != 0){
Application->MessageBox("Zapis je u medjuvremenu izbrisan!", "Baza", 0);
T1->Last();
Abort(); // obustavi post
}
if(id == 0) // id je uvijek 0 kada se dodaje novi zapis
T1->Append();
else // ukoliko se editira postojeci zapis
T1->Edit();
// zamijeni podatke
T1Ime->Value = Ime;
T1Prezime->Value = Prezime;
// post se izvrsava automatski nakon ovoga
}
E sad... ovo bi sve moglo biti i puno ljepse da postoji neki nacin da se odjednom kompletan aktivni zapis spremi u jednu varijablu, te na isti nacin zamjeniti dva zapisa.Zasto? U ovom slucaju samo su dva podatka: Ime i prezime, no sto ako ih je npr. 20? To je vec puno deklaracija varijabli...
...sukladno gore napisanome, potrebno je, eventualno, dodati i dio koda iz gornje funkcije u funkciju BeforeDelete da se sprijeci greska kada neki klijent pokusava izbrisati vec izbrisani zapis.
[Ovu poruku je menjao itf dana 23.11.2005. u 14:17 GMT+1]