[ prginfo @ 04.12.2009. 08:54 ] @
Koristim FB 2.0 (2.1 release) i D2007.

Želeo bi malo bolje da naučim pisanje procedura u FB (imam iskustva sa procedurama pod drugim server okruženjem).
Hteo bih da započnem jedan jednostavan primer i da ga uz pomoć foruma uradim (napišemo proceduru).
Ideja (problematika) je sledeća:

Postoje tabele u sledećoj formi:

TABELA

ID Integer
NAZIV Varchar(20)
MIN Integer
MAX Integer
PN Varchar(2)
BROJ1 Varchar(3)
BROJ2 Varchar(3)

TABELA_ST

ID Integer
NAZIV Varchar(20)
MINMAX Varchar(3)
BROJ1 Varchar(3)
BROJ2 Varchar(3)

Želeo bih da napišem proceduru koja će se izvršavati pri svakom insertu u tabelu TABELA na sledeći način:

TABELA_ST.ID je Autoincreament polje koje služi kao primary
TABELA_ST.NAZIV = TABELA.NAZIV
TABELA_ST.BROJ1 = TABELA.BROJ1
TABELA_ST.BROJ2 = TABELA.BROJ2

i sada ono što je ključno, a to je kako se dobija polje TABELA_ST.MINMAX

Potrebno je da prilikom inserta u tabelu TABELA procedura uzima parametre MIN, MAX i PN, gde je MIN minimalni broj, MAX maksimalni broj a PN može da ima vrednosti P,N ili S

Kada se uradi insert u tabelu TABELA, procedura radi n upisa u TABELA_ST po principu

TABELA_ST.ID je Autoincreament polje koje služi kao primary
TABELA_ST.NAZIV = TABELA.NAZIV
TABELA_ST.BROJ1 = TABELA.BROJ1
TABELA_ST.BROJ2 = TABELA.BROJ2

MINMAX se određuje na sledeći način

Uzima se TABELA.MIN i TABELA.MAX i to je raspon (npr. MIN=1 MAX=10)
Uzima se TABELA.PN, koje može imati vrednosti P (parni), N(neparni), S(svi)

Ako je MIN=1, MAX=10 i PN=S onda se uradi 10 upisa u tabelu TABELA_ST gde se ID normalno povećava za 1, NAZIV se upisuje iz tabele TABELA.NAZIV za taj upis (isto važi i za polja BROJ1 i BROJ2), a MINMAX ide za svaki upis od 1 do 10.

Ako je npr. vrednost TABELA.PN=P onda će se po istom principu upisivati podaci u tabelu TABELA_ST, samo što će se gledati parni brojevi u nizu od 1 do 10, pa će biti 5 upisa (2,4,6,8,10)

Ako je npr. vrednost TABELA.PN=N onda će se po istom principu upisivati podaci u tabelu TABELA_ST, samo što će se gledati neparni brojevi u nizu od 1 do 10, pa će biti 5 upisa (1,3,5,7,9)

Nadam se da sam bio jasan i ne suvise konfuzan.

Unapred se zahvaljujem na pomoci.
[ savkic @ 04.12.2009. 13:05 ] @
> Želeo bih da napišem proceduru koja će se izvršavati pri svakom insertu u tabelu TABELA na sledeći način:

Treba da napišeš trigger, sad vidi sam da li ti treba pre unosa sloga (BEFORE INSERT) ili posle unosa (AFTER INSERT).
Pogledaj http://www.destructor.de/firebird/trigger.htm za sintaksu i nekolko primera, takođe pogledaj i stare poruke u ovoj grupi, bilo je primera.

> TABELA_ST.ID je Autoincreament polje koje služi kao primary

FB nema autoincrement polja, možeš da koristiš generatore za dobijanje vrednosti (potraži prethodne poruke za "autoincrement"), dodelu IDa možeš raditi iz programa ili iz BEFORE INSERT triggera.

Ovaj drugi deo poruke šta treba raditi po insertu nisam shvatio, u svakom slučaju u triggeru možeš koristiti SELECT ili FOR SELECT, možeš raditi i INSERT ili pozivati neku stored proceduru (koja će uraditi insert) i slično.
[ prginfo @ 04.12.2009. 14:14 ] @
Savkicu, hvala na odgovoru. Kao i uvek.

Znam da FB koristi trigere i generatore, i ja ih koristim u radu, mada moram da priznam da mi ne rade uvek iz D2007.

Nisu mi problem trigeri koji su vezani za generatore i upise podataka u tabelu.

Krenuo sam da radim sa procedurama u FB.
Radim sa procedurama u informix-u.

Mene zanima sintaksa za proceduru u varijanti u kojoj sam napisao.

Klijent unosi nesto u tabelu TABELA
okida se triger after insert
puni se tabela TABELA_ST koja uzima podatke iz TABELA koje je klijent uneo i... nastavak primera koji sam se trudio detaljno da objasnim
[ prginfo @ 04.12.2009. 23:29 ] @
Resio sam tako sto sam kreirao insert SP, a u aplikaciji sam napravio sve racunice i petlje u kojima sam pozivao SP koja insertuje podatke u TABELA_ST.
U aplikaciji sam ubacio ovaj deo da se poziva na AfterInsert TABELA.

Verovatno postoji i elegantnije resenje, ali ovo meni radi radnju.