Ne ljuti se, to ne pomaze resavanju problema.
Shvatio sam da tvoja aplikacija ima jednu tabelu u kojoj cuvas podatke o racunima
Citat:
U jednoj smjestam sve podatke o racunu (primarni kljuc mi je slozenog tipa=BrojRacuna,RedniBrojStavke,SifraObjekta),
Ako temp tabela ima istu strukturu (a trebalo bi) onda se Brojracuna ponavlja u svim rekordima temp. I tebi treba da svaka kasa kad pocne da puni temp tabelu izabere nesto da bude BrojRacuna. Problem nastaje kad dve kase rade u istom momentu. Funkcije tipa 1+MAx(Brojracuna) nisu tliko spore ako je tabela uredno indeksirana i baza lepo dizajnirana. Medjutim, sasvim je lako moguce da dve kase posalju upit u priblizno isto vreme i da se dobije isti rezultat. Posto svaki tvoj racun ima vise stavki, pretrazujes mnogo vise rekorda nego sto bi morao.
Evo kako bi to trebalo postvaiti:
Racuni i prodata roba se uglavnom cuvaju u dve tabele.
Jedna tabela je obicno tblRacun i tu se cuva jedinstveni broj racuna, kao PK i recimo Datum i sta jos treba, zavisi od aplikacije. U tvom slucaju verovatno samo BrojRacuna, Datum i ja bih stavio KasID, da se zna koja je kasa koji racun napravila (mozda i ObjektID?).
Druga tabela se obicno zove tblRacunDetalji ili tblProdataRoba ili slicno i ima polja (BrojRacuna, RedniBrojStavke, ArtiklID, Kolicina, Cena). PK je obicno kombinacija (BrojRacuna, RedniBrojStavke). RedniBrojStavke ide od 1 do N za svaki racun. Polje BrojRacuna je FK na tabelu tblRacun.
Kad ti treba novi racun, radi ovako:
- Napravi tblRacuni i tblRacunDetalji
- Temp tabela treba da ima strukturu kao tblRacunDetalji
Sta se desava u produkciji:
- Korisnik Popuni temp tabelu, kao i do sada, samo BEZ broja racuna.
kad je sve spremno, kasir otkuca ENTER neka se desi ovo:
Begin Transaction
- izracunaj novi broj racuna, kao NoviBrojRacuna = 1+MAx(Brojracuna)
- Insert novi rekord u tblRacun
- dodeli NoviBrojRacuna svim rekordima u temp tabeli
- Append from temp tabela to tblRacunDetalji
- radi sta si zamislio sa otpremnicama, izdatnicama itd
Commit
Posledice:
- Funkcija 1+MAx(Brojracuna) bice brza jer je BrojRacuna PK i nema toliko rekorda kao tvoja trenutna tabela.
- tesko ce se desiti da dve kase izracunaju isti NoviBrojRacuna , jer transakcija traje samo trenutak
- cak i ako se desi da dve kase izracnaju identican NoviBrojRacuna , referential integrity (PK) na tabeli tblRacun ce spreciti unos i cela transakcija ce da padne. Ovo se moze uhvatiti error handlerom i jednostavno ponoviti proracun NoviBrojRacuna
Ovo stoga sto ti BrojRacuna i ne treba sve do momenta upisivanja u bazu niti te interesuje koliki je.
Eto, ispade da je problem u dizajnu baze - jedna tabela za racune umesto dve. Eto, ako se problem resi na potpuno drugi (ne bas potpuno eh?) nacin, onda se tvoj problem i ne moze javiti - znaci - problema nema. Korektan dizajn baze obicno znaci mnogo manje programiranja i mnogo manje nepotrebnih glavobolja.
U zdravlje i srecan rad.
:-)