[ Safet Susic @ 23.09.2006. 12:45 ] @
| Pozdrav svima,
Pokusavam da napravim formu koja ce dodavati nove narudzbe. Koristi se Interbase baza podataka. Kod generisanja forme, zelim da postavim ID narudzbe da generise slijedeci slobodan kljuc i koji korisnik ne bi mogao mijenjati. To sam uradio ovako:
procedure TAddOrderForm.FormCreate(Sender: TObject);
begin
ID_Edit.Text := IntToStr(DataModule1.Orders.RecordCount + 1);
end;
ili ovako
procedure TAddOrderForm.Timer1Timer(Sender: TObject);
begin
ID_Edit.Text := IntToStr(DataModule1.Orders.RecordCount + 1);
end;
Medjutim ovo neradi. Stalno mi prikazuje broj 2 (nekad 1). Uvidio sam kada na istu formu postavim DBGrid koji prikazuje Orders, i postavim svojstvo Visible na True (kada je False nema efekta) onda prethodi dio koda obavlja svoj posao.
Da li neko zna da li se radi o nekom bugu ili sta je vec?
Unaprijed zahvalan na pomoci.
|
[ Miloš Baić @ 23.09.2006. 13:17 ] @
Probaj ovako:
Code:
...
var rb:integer;
begin
with ADOQuery do begin
Close;
SQL.Clear;
SQL.Add('SELECT TOP 1 Naziv_Kolone FROM Tabela');
SQL.Add('ORDER BY Naziv_Kolone DESC');
Open;
if ADOQuery.RecordCount=0 then
rb := 1
else
rb:= StrToInt(ADOQuery.FieldByName('Naziv_Kolone').AsString)+1;
end;
Edit.Text:=IntToStr(rb);
...
Umesto TADOQuery odradi sa komponentama koje si koristio...
Pozdrav.
[ Safet Susic @ 23.09.2006. 13:55 ] @
Mislim da me nisi razumio. Meni treba samo broj kolona inkrementiran za 1.Probao sam tvoj kod u ovom obliku ali bezuspjesno:
procedure TDataModule1.IBDatabase1AfterConnect(Sender: TObject);
var
rb:integer;
begin
with Datamodule1.IBQuery do begin
Close;
SQL.Clear;
SQL.Add('SELECT ID_Narudzbe FROM Narudzbe');
Open;
if RecordCount=0 then
rb := 1
else
rb:= RecordCount +1;
end;
AddOrderForm.ID1.Text:=IntToStr(rb);
end;
[ Milos D @ 23.09.2006. 16:00 ] @
Pretpostavljam da Orders dataset u stvari ne zna ukupan broj redova (a ne kolona) sve dok ga ne "skrolujes" ili ne pozoves Orders.Last
To je verovatno zbog optimizacije (sto da se ucita ceo dataset ako ti treba samo jedan red)
Grid-u treba broj redova pa on verovatno pozove .Last i zato ti tada kod radi.
Znaci ili sam pozovi Orders.Last nakon otvaranja tog dataseta ili upotrebi neki Query tipa select count(*) from orders koji ce ti vratiti broj redova.
Naravno, sve ovo ima smisla samo ako nikada ne brises recorde iz orders tabele, i ako je u pitanju softver koji nece raditi na vise racunara istovremeno...
[ savkic @ 23.09.2006. 16:25 ] @
> Pokusavam da napravim formu koja ce dodavati nove narudzbe. Koristi se Interbase baza podataka. Kod generisanja forme, zelim da postavim
> ID narudzbe da generise slijedeci slobodan kljuc i koji korisnik ne bi mogao mijenjati. To sam uradio ovako:
> ID_Edit.Text := IntToStr(DataModule1.Orders.RecordCount + 1);
> Medjutim ovo neradi. Stalno mi prikazuje broj 2 (nekad 1). Uvidio sam kada na istu formu postavim DBGrid koji prikazuje Orders,
> i postavim svojstvo Visible na True (kada je False nema efekta) onda prethodi dio koda obavlja svoj posao.
> Da li neko zna da li se radi o nekom bugu ili sta je vec?
Ne smeš tako raditi, pre ili kasnije će doći do dupliranja ključeva, konflikata ili usporenja. Ako već koristiš IB onda treba da iskoristiš generatore, koji su i napravljeni za tu svrhu. Takođe iz tvog koda imam utisak da koristiš TTable odnosno neku njegovu varijantu, to je takođe loše rešenje, treba da koristiš kveri komponente (za IBX komponente su to TIBDataSet, TIBQuery, TIBSql).
[ Safet Susic @ 23.09.2006. 18:40 ] @
Da, Orders dataset u stvari ne zna ukupan broj redova, sve dok se ne skroluje. Nisam probao ovo sa Orders.Last. Vec sam probavao Query tipa select count(*) from orders, ali nema rezultata.
Sto se tice dupliranja kljuceva, zato i radim DataModule1.Orders.RecordCount + 1 svaki put kad se unosi nova narudzba i taj kljuc korisnik ne moze promijeniti.
Generatore nisam koristio, pa cu pogledati. Ne koristim TTable.
Puno vam hvala na savjetima
[ Safet Susic @ 23.09.2006. 18:45 ] @
E ljudi radi ovo:
procedure TAddOrderForm.FormShow(Sender: TObject);
begin
Datamodule1.Orders.Last;
ID1.Text := IntToStr(Datamodule1.Orders.RecordCount + 1);
end;
Hvala jos jednom!!!
[ savkic @ 23.09.2006. 21:09 ] @
> Sto se tice dupliranja kljuceva, zato i radim DataModule1.Orders.RecordCount + 1 svaki put kad se unosi nova narudzba i taj
> kljuc korisnik ne moze promijeniti.
Startuj program sa dva računara (ili sa istog) i pokušaj da u oba istovremeno pokreneš unos nove narudžbenice, koje ćeš IDeve dobiti?
[ Safet Susic @ 25.09.2006. 14:18 ] @
Program je planiran da se izvrsava na jednom racunaru, te zbog toga mislim da je ovo rjesenje dovoljno. U svakom slucaju probacu Generatore.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.