[ mr.zhile @ 31.10.2008. 12:35 ] @
Imam firebird bazu.Kada se edituje rekord,moguce je ponovnim otvarnajem aplikacije izbrisati ga...
Moje 1.pitanje je kako to spreciti?
Probao sam sa ovakvim kodom,ali nije upalilo..
Code:

   Inc(broj)
   parametar := dmBiblioteka.sdsKnjige.FieldByName('Sifra_knjige').AsInteger;
   if dmBiblioteka.sdsKnjige.Locate('SIFRA_KNJIGE',parametar,[]) then
      begin
         frmPrikazIzmenaKnjiga := TfrmPrikazIzmenaKnjiga.Create(Application);
         frmPrikazIzmenaKnjiga.OtvoriSifru( parametar, PNivo>1 );
         frmPrikazIzmenaKnjiga.Name := frmPrikazIzmenaKnjiga.Name + IntToStr( Broj );
         frmPrikazIzmenaKnjiga.Show
      end


2.pitnaje je:Da li je efikasnije spreeciti brisanje dok se rekord edituje ili je bolje da se korisnik koji edituje rekoord obavesti da je rekord,dok ga je on menjao izbrisan?
kako ga obavestiti?

U stvari....mislim da bi trebla nekko DataSet zakljucati ,kada se vrsi edit rekorda,ali kako?

Ako nesto nisam razjasnio,rado cu uciniti?
Unapred se zahvaljujem na svim savetima

[Ovu poruku je menjao mr.zhile dana 31.10.2008. u 16:23 GMT+1]
[ savkic @ 31.10.2008. 21:05 ] @
> Imam firebird bazu.Kada se edituje rekord,moguce je ponovnim otvarnajem aplikacije izbrisati ga...
> Moje 1.pitanje je kako to spreciti?

Potrebno je nekako označiti da je izmena sloga u toku, tu ima nekoliko mogućnosti:

1) Koristiti FB transkacije, npr. kada prikažeš formu za izmenu (otpočneš izmenu) uradiš jedan fake update nekog polja iz tog sloga, recimo
UPDATE TABELA SET FIELD1 = FIELD1, i tu transakciju držiš otvorenu sve dok se ne završi izmena, u tom slučaju kada neko drugi pokuša brisanje ili izmenu istog tog sloga dobiće lock error. Takođe dobiće error i ako pokuša brisanje nekog od child recorda tog sloga (recimo menjaš fakturu a neko pokuša da obriše stavke fakture). Prednost ovog pristupa je što time faktički onemogućavaš izmenu tog sloga (i child slogova) iz bilo kog programa, mana je što fake update pravi record versione (kopije) sloga i svih child slogova i ne dozvoljava garbage collection dok traje transakcija/izmena.

2) Dodaš jedno dodatno polje u tabelu IZMENA_U_TOKU koje ćeš podesiti pre izmene a posle izmene resetovati.

3) Napraviš posebnu tabelu semafori gde ćeš upisati šta se menja (recimo FAK_ID_1234), pre brisanja proveriš postoji li taj slog, ako postoji ne dozvoliš brisanje, i na kraju izmene samo obrišeš slog iz semafora. Prednost je što ne utiče na performanse nema pravljena kopija recorda a mana je što se izmena i brisanje sprečava samo iz tvoje aplikacije ne i iz drugih.

> 2.pitnaje je:Da li je efikasnije spreeciti brisanje dok se rekord edituje ili je bolje da se korisnik koji edituje rekoord obavesti da je rekord,dok
> ga je on menjao izbrisan? kako ga obavestiti?

Hoćeš li dozvoliti brisanje sloga dok se menja ili ne zavisi od tvoje aplikacije, u principu mislim da ne treba dozvoliti.
[ mr.zhile @ 31.10.2008. 23:04 ] @
@savkic
Mnogo si podrobno objasnio,mnogo mi je jasnje ..HVALA!!
Imam jos jedno pitanje
Kada napisem sledeci kod puca
Code:

         sdsClanovi.Close;
         sdsClanovi.DataSet.CommandText :='update clan set id = ' + IntToStr(FID);
         sdsClanovi.Open;\\ovu liniju koda ne prolazi
         SQLConn.StartTransaction(STD);

mislim da mi je greska na open jer se ne otvara dataset kada se vrsi update upit
Kako spreciti gresku : Duplicate transaction ID?Iz ovog koda pocinje druga transkcija kojom se vrse neke provere,e sad kaoda radim sa dve transakcije?
[ savkic @ 01.11.2008. 08:14 ] @
> sdsClanovi.DataSet.CommandText :='update clan set id = ' + IntToStr(FID);

Koristi 'UPDATE CLAN SET ID = ID'.

> sdsClanovi.Open;\\ovu liniju koda ne prolazi

Neke komponente razlikuju izvršavanje upita (ExecSQL) i vraćanje rezultata (Open), proveri da li ti imaš ExecSQL ili sličnu metodu.

> SQLConn.StartTransaction(STD);

Šta je STD?

> Kako spreciti gresku : Duplicate transaction ID?Iz ovog koda pocinje druga transkcija kojom se vrse neke provere,
> e sad kaoda radim sa dve transakcije?

Možda jednu istu transakciju (komponentu) koristiš na više mesta. Koristi jednu transakciju za fake update i pravu izmenu sloga, ako budeš koristio dve, takođe nećeš uspeti.
[ mr.zhile @ 01.11.2008. 09:49 ] @
STD je promenljiva tipa TTransactionDesc

fake transakcije se prave na serveru ili u Delphiju?
Kako se mogu napraviti Delphiju?
Ako ima neki primer koda?Mislim da mi nisu najjasnije?
[ Bojan Kopanja @ 01.11.2008. 10:03 ] @
Citat:
savkic: > Imam firebird bazu.Kada se edituje rekord,moguce je ponovnim otvarnajem aplikacije izbrisati ga...
> Moje 1.pitanje je kako to spreciti?

Potrebno je nekako označiti da je izmena sloga u toku, tu ima nekoliko mogućnosti:

1) Koristiti FB transkacije, npr. kada prikažeš formu za izmenu (otpočneš izmenu) uradiš jedan fake update nekog polja iz tog sloga, recimo
UPDATE TABELA SET FIELD1 = FIELD1, i tu transakciju držiš otvorenu sve dok se ne završi izmena, u tom slučaju kada neko drugi pokuša brisanje ili izmenu istog tog sloga dobiće lock error. Takođe dobiće error i ako pokuša brisanje nekog od child recorda tog sloga (recimo menjaš fakturu a neko pokuša da obriše stavke fakture). Prednost ovog pristupa je što time faktički onemogućavaš izmenu tog sloga (i child slogova) iz bilo kog programa, mana je što fake update pravi record versione (kopije) sloga i svih child slogova i ne dozvoljava garbage collection dok traje transakcija/izmena.

2) Dodaš jedno dodatno polje u tabelu IZMENA_U_TOKU koje ćeš podesiti pre izmene a posle izmene resetovati.

3) Napraviš posebnu tabelu semafori gde ćeš upisati šta se menja (recimo FAK_ID_1234), pre brisanja proveriš postoji li taj slog, ako postoji ne dozvoliš brisanje, i na kraju izmene samo obrišeš slog iz semafora. Prednost je što ne utiče na performanse nema pravljena kopija recorda a mana je što se izmena i brisanje sprečava samo iz tvoje aplikacije ne i iz drugih.

> 2.pitnaje je:Da li je efikasnije spreeciti brisanje dok se rekord edituje ili je bolje da se korisnik koji edituje rekoord obavesti da je rekord,dok
> ga je on menjao izbrisan? kako ga obavestiti?

Hoćeš li dozvoliti brisanje sloga dok se menja ili ne zavisi od tvoje aplikacije, u principu mislim da ne treba dozvoliti.


Ja sam u jednoj svojoj aplikaciji imao slican problem i takodje sam dosao na ideju sva 3 resenja i moram priznati da je resenje broj 1 verovatno najbolje, a razlog je to sto za varijantu broj 2 i 3 postoji realna opasnost od nestanka struje u trenutku kada se neki slog menjao i u bazu ce biti zabelezeno da je slog u procesu izmene, a to vise nece biti slucaj pa tako vise niko nece moci da pristupi tom slogu jer je i onaj ko je menjao slog ostao bez tog sloga koji je ovakvim pristupom ostao zauvek zakljucan i cini mi se da je jedini nacin da se ovo resi ulazak u admin program za bazu i rucno menjanje vrednosti tabela ili da se radi dodatno programce ( ili opcija unutar istog programa ) za recovery baze koji ce da posle nestanka struje oznaci sve slogove kao da nisu u izmeni ili da obrise tabelu semafor i da se onda nastavi dalji rad.

U sustini ni ovo nije preveliki problem, ali nije bas ni najsrecnije resenje...
[ mr.zhile @ 01.11.2008. 10:22 ] @
Da napomenem da radim u Delphiju 7 i da za rad koristim DBExpreds komponente!!!!

@bojan
Sve ja to razumem da je 1.nacin extra dobar,ali mi nije najjasnije kako bi se mogao uraditi?
Posto kazes da si radio slican poslic...pitanjce:dal bi mogao okkaciti kod kojim si to uradio,tako bih razumeo i uspeo da modifikujem na moj primer?Ako ne diram u "sluzbenu tajnu"?
[ savkic @ 01.11.2008. 10:54 ] @
> STD je promenljiva tipa TTransactionDesc

Nisam radio sa tim komponentama, uglavnom ako hoćeš dve nezavisne transakcije onda koristiš dve različite instance transaction komponente.

> fake transakcije se prave na serveru ili u Delphiju?

Ne fake transakcije već fake update.

> Kako se mogu napraviti Delphiju?
> Ako ima neki primer koda?Mislim da mi nisu najjasnije?

Dobio si ga, doduše zaboravio sam WHERE klauzulu ranije.

Code:

Tran.Begin;                   // Otpocinjemo transakciju
Qry.Transaction := Tran; // Dodeljujemo kveri komponenti transakciju

// FakturaID je integer promenljiva, koja sadrzi ID fakture koji se menja
Qry.Sql := 'UPDATE TABELA SET ID_FIELD = ID_FIELD WHERE ID_FIELD = ' + IntToStr(FakturaID); 
Qry.ExecSql; // Izvrsavamo fake update, posle tog trenutka taj slog je zakljucan

// Prikazujemo formu za izmenu FakturaID sloga, potrebno je da se izmena obavi u kontekstu startovane  Tran transakcije, sto znaci da 
// svim kveri komponentama treba dodeliti Tran
ShowEditForm(Tran); 
Tran.Commit; // Na kraju zavrsavamo transakciju i oslobadjamo slog.
[ mr.zhile @ 01.11.2008. 11:37 ] @
>Tran.Begin;

Tran je objekat?Kakvog tipa?

Jel bi mogao da mi pomognes kako to da uradiim sa DbExpress?Jer samo a tim komponentama znam da radim transakcije?
[ savkic @ 01.11.2008. 13:03 ] @
> Tran je objekat?Kakvog tipa?

To je komponenta za transakciju.

> Jel bi mogao da mi pomognes kako to da uradiim sa DbExpress?Jer samo a tim komponentama znam da radim transakcije?

Ne koristim dbExpress tako da ne mogu ništa preciznije, ali trebalo bi da sve to bude primenljivo, transakcije i kveri komponente moraju postojati.
[ mr.zhile @ 03.11.2008. 15:47 ] @
Ok razumeio sam transakciju,uspeo sam da je napravim,i sade dolazim do drugog problema..
Kako procitai da li je selektovani rekord zakljucan?Odnosno da li ga menja drugi korisnik?
Kako bi trebalo da izgleda funkcija?
[ savkic @ 03.11.2008. 23:13 ] @
Pokušaš da uradiš fake update, ako dobiješ grešku znači da neko drugi radi na njemu.
[ mr.zhile @ 04.11.2008. 15:47 ] @
Kako znati ko menja podatke?
Svaki korisnk iima svoj username i pasword,ali kako da znma da npr:pera petrovic menja podatke?
[ savkic @ 04.11.2008. 17:38 ] @
> Kako znati ko menja podatke?
> Svaki korisnk iima svoj username i pasword,ali kako da znma da npr:pera petrovic menja podatke?

Po meni to nije bitna informacija, ako ti treba onda taj podatak moraš upisati u posebnu tabelu.
[ _deran_ @ 04.11.2008. 21:49 ] @
Citat:
mr.zhile: Kako znati ko menja podatke?
Svaki korisnk iima svoj username i pasword,ali kako da znma da npr:pera petrovic menja podatke?


u firebirdu 2.1 imas sve zapisano u sistemskim tabelama. mozes da vidis koji user radi select nad nekom tabelom itd...
[ mr.zhile @ 04.11.2008. 22:26 ] @
Citat:
_deran_: u firebirdu 2.1 imas sve zapisano u sistemskim tabelama. mozes da vidis koji user radi select nad nekom tabelom itd...


A kako da vidim u sistemskim tabelama?

Ako moze nekio da mi kaze kakav je kod za pesimisticko,a kakv za optimisticko zakljucavanje?
Primercic neki?
[ schild @ 05.11.2008. 06:40 ] @
Citat:
mr.zhile: A kako da vidim u sistemskim tabelama?
Ako moze nekio da mi kaze kakav je kod za pesimisticko,a kakv za optimisticko zakljucavanje?
Primercic neki?

e Zhile, ti ko da si pao sa Marsa
Pa malo probaj i sam nesto da saznas,.... procitaj nesto... pun internet svega!
[ _deran_ @ 05.11.2008. 10:45 ] @
---- da dobijes sql-ove i attachment id
Code:
SELECT  a.MON$ATTACHMENT_ID,  a.MON$SQL_TEXT
FROM MON$STATEMENTS a


---- da dobijes user-a i njegov ip
Code:
SELECT a.MON$ATTACHMENT_ID,  a.MON$USER,  a.MON$REMOTE_ADDRESS
FROM MON$ATTACHMENTS a           // where a.MON$ATTACHMENT_ID = [id koji hoces iz prvog upita]

ili spoji sve u 1 upit
[ mr.zhile @ 05.11.2008. 11:19 ] @
Citat:
schild: Pa malo probaj i sam nesto da saznas,.... procitaj nesto... pun internet svega!

Znam da ima dosta pametnih stvari na netu!Nasao sam opste neke odgovore razlike izmedju nacina zakljucavanja,i primere,ali se sve to odnosi na ADO,a mene interesuje kako se to primenjuje na FireBird,pretpostavljam da ima razlike,samim tim sto ado ima svojstvo LockType koji u DbExpress_u nisam nasao,pa me interesuje kako da se to svojstvo nadoknadi sql kodom?
@deraan
HVALA puno,snacicu se nekako!!!