Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Sprecavnje brisanja rekorda,dok se edituje

[es] :: Pascal / Delphi / Kylix :: Sprecavnje brisanja rekorda,dok se edituje

[ Pregleda: 3363 | Odgovora: 18 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
77.46.173.*



+2 Profil

icon Sprecavnje brisanja rekorda,dok se edituje31.10.2008. u 12:35 - pre 188 meseci
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]
Don't worry be happy
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Sprecavnje brisanja rekorda,dok se edituje31.10.2008. u 21:05 - pre 188 meseci
> 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.

 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
77.46.173.*



+2 Profil

icon Re: Sprecavnje brisanja rekorda,dok se edituje31.10.2008. u 23:04 - pre 188 meseci
@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?
Don't worry be happy
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Sprecavnje brisanja rekorda,dok se edituje01.11.2008. u 08:14 - pre 188 meseci
> 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.
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
79.101.75.*



+2 Profil

icon Re: Sprecavnje brisanja rekorda,dok se edituje01.11.2008. u 09:49 - pre 188 meseci
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?
Don't worry be happy
 
Odgovor na temu

Bojan Kopanja
Bojan Kopanja
Senior Web Developer, ZeusSoftware
Stara Pazova

Član broj: 6155
Poruke: 507
79.101.215.*

ICQ: 346697685
Sajt: www.zeussoftware.rs


Profil

icon Re: Sprecavnje brisanja rekorda,dok se edituje01.11.2008. u 10:03 - pre 188 meseci
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...
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
79.101.75.*



+2 Profil

icon Re: Sprecavnje brisanja rekorda,dok se edituje01.11.2008. u 10:22 - pre 188 meseci
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"?
Don't worry be happy
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Sprecavnje brisanja rekorda,dok se edituje01.11.2008. u 10:54 - pre 188 meseci
> 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.

 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
93.86.48.*



+2 Profil

icon Re: Sprecavnje brisanja rekorda,dok se edituje01.11.2008. u 11:37 - pre 188 meseci
>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?
Don't worry be happy
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Sprecavnje brisanja rekorda,dok se edituje01.11.2008. u 13:03 - pre 188 meseci
> 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.
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
93.86.132.*



+2 Profil

icon Re: Sprecavnje brisanja rekorda,dok se edituje03.11.2008. u 15:47 - pre 188 meseci
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?
Don't worry be happy
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Sprecavnje brisanja rekorda,dok se edituje03.11.2008. u 23:13 - pre 188 meseci
Pokušaš da uradiš fake update, ako dobiješ grešku znači da neko drugi radi na njemu.
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
93.86.19.*



+2 Profil

icon Re: Sprecavnje brisanja rekorda,dok se edituje04.11.2008. u 15:47 - pre 188 meseci
Kako znati ko menja podatke?
Svaki korisnk iima svoj username i pasword,ali kako da znma da npr:pera petrovic menja podatke?
Don't worry be happy
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Sprecavnje brisanja rekorda,dok se edituje04.11.2008. u 17:38 - pre 188 meseci
> 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.
 
Odgovor na temu

_deran_

Član broj: 69493
Poruke: 252
77.46.156.*



+1 Profil

icon Re: Sprecavnje brisanja rekorda,dok se edituje04.11.2008. u 21:49 - pre 188 meseci
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...
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
93.86.19.*



+2 Profil

icon Re: Sprecavnje brisanja rekorda,dok se edituje04.11.2008. u 22:26 - pre 188 meseci
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?
Don't worry be happy
 
Odgovor na temu

schild
Dejan Šild
TopCode Software
Subotica

Član broj: 59888
Poruke: 138
213.240.53.*

Sajt: www.topcode.rs


+2 Profil

icon Re: Sprecavnje brisanja rekorda,dok se edituje05.11.2008. u 06:40 - pre 188 meseci
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!
 
Odgovor na temu

_deran_

Član broj: 69493
Poruke: 252
77.46.156.*



+1 Profil

icon Re: Sprecavnje brisanja rekorda,dok se edituje05.11.2008. u 10:45 - pre 188 meseci
---- 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
 
Odgovor na temu

mr.zhile
Ivan ZHILE
C# developer

Član broj: 185721
Poruke: 249
79.101.150.*



+2 Profil

icon Re: Sprecavnje brisanja rekorda,dok se edituje05.11.2008. u 11:19 - pre 188 meseci
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!!!
Don't worry be happy
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Sprecavnje brisanja rekorda,dok se edituje

[ Pregleda: 3363 | Odgovora: 18 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.