[ smjesko @ 19.05.2005. 17:44 ] @
| Imam jednu tabelu koja ima recimo dva polja, redni broj (generator) i vrijednost npr.
broj vrijednost
1 5
2 4
3 2
kada iz ove tabele izbrisem npr broj 2 ona izgleda ovako
broj vrijednost
1 5
3 2
ostaje broj 1 i 3, kako da uradim da mi to sve preslaze po redosljedu da nemam tih "supljina" vec da bude 1,2,3,4....
Koristim delphi i interbase |
[ Milos D @ 19.05.2005. 18:54 ] @
Sa Firebirdom moze ovako (valjda moze i sa IB):
Napravi AfterDelete trigger za tu tabelu:
CREATE TRIGGER ime_triggera FOR ime_tabele active after delete AS
update ime_tabele set broj=broj-1 where broj>old.broj
[ smjesko @ 19.05.2005. 20:39 ] @
pokusao sam da napisem: CREATE TRIGGER "brisanje" FOR "RACUN" ACTIVE after delete AS update RACUN set broj=broj-1 where broj>old.broj
ali neradi jbga imal jos tko kakvu ideju?
[ morlic @ 19.05.2005. 22:55 ] @
Ne javljam se sa idejom :) vec sa pitanjem koji smisao ima to polje, ako mu je vrednost tako promenjiva. Nije valjda da to koristis da bi prilikom prikaza u programu imao redne brojeve?
Ako zamislimo da tvoj program radi sa puno radnih stanica istovremeno, i da ima brisanja ovakog kako ti ljudi predlazu, dolazi do potencijalnog zakljucavanja dobrog dela slogova tabele koji ostaju blokirani (hard lock) do kraja transakcije, praveci problem drugim transakcijama koje istovremeno pokusavaju to isto da urade, dovodeci u pitanje performanse celog sistema. Da ne pominjemo sta se desava sa korisnicima koji su vec ucitali podatke i imaju pogresnu sliku o podacima, jer dok oni gledaju tabelu redni brojevi mozda vise nisu ni validni. Naravno ovo sve vazi za sistem gde vise korisnika pristupa istovremeno bazi, cega kod teba mozda i nema tako da mozes i da preskocis upozorenje. Ali mozda je korisno onima koji imaju pomenuto okruzenje (vise korisnika na jednoj bazi).
Znaci ako je za redne brojeve nadji drugo resenje. Recimo napravi InternalCalc polje (ClientDataSet) ako koristis troslojni princip (pa makar u 2-tier aplikaciji) pa u njemu drzi redni broj. Ima jos resenja.
[ smjesko @ 19.05.2005. 23:03 ] @
ako ces iskreno to polje je redni broj racuna, napravio sam pc kasu i svaki racun ima svoj redni broj, sada pravim programcic da bi mogao da obrisem "pokoji" racun al naravno da mi preslaze redne brojeve, nema radnih stanica vec je samo jedan racunar imas li kakvu ideu kako bi to mogao da rijesim?
[ morlic @ 19.05.2005. 23:12 ] @
Nadam se da si predvideo da racuni koji su izdati ne smeju menjati redni broj (bar koliko ja znam :)) Brisanje ima smisla mozda samo za zadnji racun, ali onda ne moras nista da preslazes samo uzmes ponovo taj broj. Mozes i da posle brisanja izvrsis upit koji radi izmene brojeva ili uradi trigger pa kud puklo :)
Code:
Set term ^;
CREATE TRIGGER brisanje FOR RACUN
ACTIVE AFTER DELETE POSITION 0
AS
BEGIN
update RACUN set RACUN.broj=RACUN.broj-1 where RACUN.broj>old.broj;
END^
[ staleks @ 20.05.2005. 00:01 ] @
Milos je u pravu, moras da znas da u finansijskom poslovanju nema brisanja ( DELETE zaboravi ), jedino je dozvoljeno storniranje a to je onda druga prica, imas dodatno polje storno u tabeli racuni i to je to, ako je 1 onda znas da je storniran i storniras sve stavke tog racuna, kraj price.
Pozdrav
[ smjesko @ 20.05.2005. 00:52 ] @
ma to je druga stvar kako cu ja zavrsiti sa FIN. nebitno :) uglavnom radi TNX Milos :)
[ obucina @ 20.05.2005. 15:32 ] @
U trigeru prvo povecaj sve brojeve za veliki broj (za vise redova velicina veci od njih),
npr milion, a zatim ih umanji za milion i jedan.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.