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

firebird trigger problem

[es] :: Firebird/Interbase :: firebird trigger problem

[ Pregleda: 3758 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

zoranrajkov

Član broj: 36741
Poruke: 32
*.satlynx.net.



Profil

icon firebird trigger problem27.11.2006. u 12:06 - pre 211 meseci
imam dve tabele
1. tabela1 (c3_new)sa podacima koji se upisuju i koja izaziva trigger
2. tabela2 (c3_prekid)u koju se upisuju podaci ako se desi dogadjaj
napravio sam sledeci trigger
SET TERM ^ ;

CREATE TRIGGER C3_PREKID FOR C3_NEW
ACTIVE BEFORE INSERT OR UPDATE
POSITION 0
AS
BEGIN
/* Trigger body */
if (new.SAKTIVNA > old.SAKTIVNA) THEN
INSERT INTO C3_PREKIDI (opis_prekida,vreme,AKTIVNA)
values ('poceo','now',old.SAKTIVNA);
END^

SET TERM ; ^

medjutim old.SAKTIVNA je uvek null.
Kako da iscitam stari podatak iz tabele1
 
Odgovor na temu

Mr. Rejn
Deki Karamatijević
Sremčica

Član broj: 2514
Poruke: 515
*.dynamic.sbb.co.yu.



+4 Profil

icon Re: firebird trigger problem27.11.2006. u 12:50 - pre 211 meseci
Koji je tip podatka u koloni SAKTIVNA u tabeli c3_new, da li koristi generator za inkrementiranje ID?
Ocigledno se nista ne upisuje u tu kolonu pri insertu.

Ag + Na -> Xe
 
Odgovor na temu

zoranrajkov

Član broj: 36741
Poruke: 32
*.satlynx.net.



Profil

icon Re: firebird trigger problem27.11.2006. u 12:59 - pre 211 meseci
ako nije dovoljno jasno opisacu drugacije.
hocu da kada se upise novi slog u prvu tabelu da ako je veci od poslednjeg izazove dogadjaj upisa u drugu tabelu.
ali stari podatak old.SAKTIVNA mi je uvek null tjs. ne iscita ga
 
Odgovor na temu

Mr. Rejn
Deki Karamatijević
Sremčica

Član broj: 2514
Poruke: 515
*.adsl.sezampro.yu.



+4 Profil

icon Re: firebird trigger problem27.11.2006. u 13:55 - pre 211 meseci
Citat:
zoranrajkov:
hocu da kada se upise novi slog u prvu tabelu da ako je veci od poslednjeg izazove dogadjaj upisa u drugu tabelu.
ali stari podatak old.SAKTIVNA mi je uvek null tjs. ne iscita ga

ja bih pogledao ono: POSITION 0, taj triger je prvi koji se okida u nizu,pa onda ACTIVE BEFORE INSERT okida se
PRE unosa u kolonu SAKTIVNA tabele C3_NEW,znači možda se u trigger-u ne vide nove vrenosti SAKTIVNA kolone
(jer još nisu ni unete).Probaj da staviš ACTIVE AFTER INSERT or update.
Ag + Na -> Xe
 
Odgovor na temu

zoranrajkov

Član broj: 36741
Poruke: 32
*.sksyu.net.



Profil

icon Re: firebird trigger problem27.11.2006. u 20:27 - pre 211 meseci
SAKTIVNA je tipa float i upisuje se obavezno (not null)
ne generisem id (cini mi se da je tu mozda problem, jako sam nov u ovom)
probao sam i before i after i da menjam position ali nista
evo kako izgleda tabela
CREATE TABLE C3_NEW (
NAPON NAPON NOT NULL,
STRUJA STRUJA NOT NULL,
SAKTIVNA SAKTIVNA NOT NULL,
SREAKTIVNA SREAKTIVNA NOT NULL,
SPRIVIDNA SPRIVIDNA NOT NULL,
COSFI COSFI NOT NULL,
EAKTIVNA EAKTIVNA NOT NULL,
EREAKTIVNA EREAKTIVNA NOT NULL,
VREME VREME NOT NULL);


SET TERM ^ ;

CREATE TRIGGER C3_PREKID FOR C3_NEW
ACTIVE BEFORE INSERT OR UPDATE
POSITION 1
AS
BEGIN
/* Trigger body */
if (new.SAKTIVNA > 1) THEN
INSERT INTO C3_PREKIDI (opis_prekida,vreme,AKTIVNA)
values ('poceo','now',old.SAKTIVNA);
END^
SET TERM ; ^
 
Odgovor na temu

Mr. Rejn
Deki Karamatijević
Sremčica

Član broj: 2514
Poruke: 515
*.adsl.sezampro.yu.



+4 Profil

icon Re: firebird trigger problem27.11.2006. u 23:04 - pre 211 meseci
Npr. napravi triger za generisanje ID-a jer moras imati ID. Mozes dodati ID kolonu kao
Integer not null,i proglasiti je za PK.Ova imena kolona koja se pojavljuju dvaput valjda
oznacavaju domene?
Ovo moze biti triger zagenerisanje id-a, uz pripadajuci generator GENER_ID, koji trazi max vrednost
kolone SAKTIVNA i vrsi insert:

Code:

CREATE GENERATOR GENER_ID;

CREATE TRIGGER C3_PREKID FOR C3_NEW
ACTIVE BEFORE INSERT POSITION 0

declare variable max_saktivna float; /* interna promenljiva-maximalna vrednost SAKTIVNA kolone */

AS
begin
  new.ID = gen_id(gener_id,1);/* povecava vrednost polja ID (koje je PK) za jedan */
  if (new.SAKTIVNA > 1) THEN
  begin 
   select max(SAKTIVNA) from C3_NEW into :max_saktivna; /* nadji max vrednost SAKTIVNA kolone */
   INSERT INTO C3_PREKIDI (opis_prekida,vreme,AKTIVNA) values ('poceo','now',:max_aktivna); /* unesi je u C3_PREKIDI */
  end
end

OLD privremena promenljiva se valjda ne moze korisiti za before i after insert, a NEW se ne moze
korisiti za before i after delete, iz Interbase dokumentacije DATADEF.pdf:

Triggers can use two context variables,OLD, and NEW. The OLD context variable refers to the current or previous values in a row being updated or deleted.OLD is not used for inserts.NEW refers to a new set of INSERT or UPDATE values for a row. NEW is not used for deletes. Context variables are often used to compare the values of a column before and after it is modified.

Mozda ovo pomaze
Deki.

[Ovu poruku je menjao Mr. Rejn dana 28.11.2006. u 00:16 GMT+1]
Ag + Na -> Xe
 
Odgovor na temu

zoranrajkov

Član broj: 36741
Poruke: 32
*.satlynx.net.



Profil

icon Re: firebird trigger problem28.11.2006. u 12:04 - pre 211 meseci
Prvo da odgovorim na pitanje za duple nazive
tacno je to su domeni

e sad, da preformulisem moje pitanje
ja hocu da ako je new.SAKTIVNA=0 da upisem u tabelu C3_PREKID da je prekid poceo.
pa dok god je ta vrednost nula da nista ne upisujem u tabelu C3_PREKID, nego kad vrednost SAKTIVNA ponovo ne bude
nula da upisem u tabelu C3_PREKID.
znaci moram da pratim staru vrednost SAKTIVNA da bi je uporedio sa novom pa kada SAKTIVNA postane 0 pisem u C3_PREKID
i kada SAKTIVNA prestaje da bude 0 pisem u C3_PREKID
 
Odgovor na temu

delalt

Član broj: 68360
Poruke: 198
*.teol.net.



Profil

icon Re: firebird trigger problem03.12.2006. u 10:33 - pre 210 meseci
Citat:
zoranrajkov: imam dve tabele
1. tabela1 (c3_new)sa podacima koji se upisuju i koja izaziva trigger
2. tabela2 (c3_prekid)u koju se upisuju podaci ako se desi dogadjaj

Probaj da napraviš još jednu pomoćnu tabelu tabela12 (c3_trenutno) u kojoj će
biti čuvana samo zadnja vrijednost iz tabele c3_new (znači, samo jedan red i
neće biti inserta, već samo update).
Kako sam ja shvatio, vrše se neka periodična očitavanja i upisuju u tabelu c3_new
recimo svake sekunde. Napraviš triger za tu tabelu AFTER INSERT koji će
napraviti update u c3_trenutno stare vrijednosti SAKTIVNA na novu.
Sad, za tu tabelu c3_trenutno napraviš triger BEFORE UPDATE u kome ćeš vršiti
provjeru da li je došlo do prekida (uporediš staru i novu vrijednost...)
i na osnovu toga uradiš ili ne uradiš insert u c3_prekidi.
Sve ostale trigere privremeno onemogući ili obriši.

Druga stvar, pošto kažeš da uvijek dobijaš NULL kod trigera, probaj da napisanim
SQL upitom vršiš insert ili update, a ne direktno u gridu, ako koristiš neki grafički alat
(a vjerovatno koristiš). Zavisi i koji alat i koju verziju Firebirda koristiš (verziju 2.0
u potpunosti ne podržavaju svi alati, pa probaj i sa verzijom 1.5.3).

Drugi način je da ako informacije o prekidima treba da dobiješ samo kao izvještaj,
onda u SQL upitu ili SP za izvještaj možeš da izbaciš vrijednosti koje ti ne trebaju,
samo ostaviš prekide, pa ti samo praktično treba tabela c3_new i nikakvi trigeri i
druge tabele.
 
Odgovor na temu

zoranrajkov

Član broj: 36741
Poruke: 32
*.satlynx.net.



Profil

icon Re: firebird trigger problem05.12.2006. u 09:07 - pre 210 meseci
da, sve si dobro razumeo.
Koristim Delphi 2006 i firebird 2.0.
Tacno tako kako si opisao sam i ja pre koji dan uradio, jedino sto ja imam 9 takvih tabela pa sam hteo da izbegnem pravljenje 9 pomocnih tabela. Isto tako posto sam jako nov u svemu ovome, mislio sam da ce mi okidaci pomoci i u sledecem mom problemu, a to je sto ja te podatke treba da sabiram tacno 1 sat i onda upisem u novu tabelu taj zbir.
Taj vremenski interval ne pocinje u neko odredjeno vreme, pa sam mislio da ga okidacem registrujem.
 
Odgovor na temu

delalt

Član broj: 68360
Poruke: 198
*.teol.net.



Profil

icon Re: firebird trigger problem05.12.2006. u 13:08 - pre 210 meseci
Citat:
zoranrajkov: da, sve si dobro razumeo.
Koristim Delphi 2006 i firebird 2.0.
Tacno tako kako si opisao sam i ja pre koji dan uradio, jedino sto ja imam 9 takvih tabela pa sam hteo da izbegnem pravljenje 9 pomocnih tabela. ...

Možda može i drugačije, bez tih pomoćnih, ali bi možda bilo i dosta komplikovanije.
Citat:
zoranrajkov:... Isto tako posto sam jako nov u svemu ovome, mislio sam da ce mi okidaci pomoci i u sledecem mom problemu, a to je sto ja te podatke treba da sabiram tacno 1 sat i onda upisem u novu tabelu taj zbir.
Taj vremenski interval ne pocinje u neko odredjeno vreme, pa sam mislio da ga okidacem registrujem.

Možeš da napraviš običnu proceduru "SELECT SUM(NEŠTO) ..." sa parametrima :vreme_od i :vreme_do
koju ćeš da pokrećeš po želji iz svog programa urađenog u Delphi-ju. Tu možeš da postaviš i tajmer...
Možda si mislio da praviš kumulativni zbir, poslije svakog upisa u c3_new tabelu?
Tu možeš da iskoristiš triger...

 
Odgovor na temu

zoranrajkov

Član broj: 36741
Poruke: 32
*.sksyu.net.



Profil

icon Re: firebird trigger problem05.12.2006. u 21:11 - pre 210 meseci
treba da posle svakog zapisa u svih 9 tabela saberem sve u tom intervalu koji pocinje na signal iz Delphija, a ako mi ta suma predje odredjenu vrednost posaljem informaciju Delphiju o tome. Znaci treba da imam jednu promenljivu koja ce cuvati informaciju o zbiru iz svih tabela.
Za signal iz Delphija mislim da koristim trigger upisa u neku novu tabelu , a za informaciju ka delphiju da je vrednost premasena koristio bi mozda events???
A ako neka vrednost SAKTIVNA padne na nulu da zapisem kad se to desilo i kad ponovo poraste da i to zapisem. Znaci u kojoj tabeli i kad je vrednost pala na nulu i kad je ponovo razlicita od nule.
Mozda mnogo hocu.
 
Odgovor na temu

delalt

Član broj: 68360
Poruke: 198
*.teol.net.



Profil

icon Re: firebird trigger problem14.12.2006. u 19:17 - pre 210 meseci
Vjerovatno si već riješio problem, ali evo jedan link za events.
Fajl se malo sporo skida sa neta (možda je to samo kod mene),
pa budi strpljiv.
http://www.flamerobin.org/events_paper.pdf
 
Odgovor na temu

[es] :: Firebird/Interbase :: firebird trigger problem

[ Pregleda: 3758 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

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