Trigger de sıralama yapmak

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Trigger de sıralama yapmak

Mesaj gönderen Berdem »

Merhaba,
Örnek olarak detail olark bağlı
ID....DEGER.......SIRA
1........A.............1
2........B.............2
3........C.............3
4........D.............4
5........E.............5
benzer bir tablom var.
Burda E degerindeki sıra 2 verdiğimde sıralamada B,C,D kaydırma yapmak istiyorum.
ID....DEGER.......SIRA
1........A.............1
2........B.............3
3........C.............4
4........D.............5
5........E.............2
Veya tersi bir durumda B degerine 5 verdiğimde ise,
ID....DEGER.......SIRA
1........A.............1
2........B.............5
3........C.............2
4........D.............3
5........E.............4
sıralama güncellemesi yaptırmak istiyorum.
Bunu trggerle halletmek istiyorum.
Mantık olarak döngü kurup büyük değerler 1 artırma küçülenlerde bir eksiltme olarak düşündüm.

Kod: Tümünü seç

CREATE TRIGGER T_BU0 FOR TABLO
ACTIVE BEFORE UPDATE POSITION 0
AS
DECLARE variable SIRANO integer;
DECLARE variable IDNOSU integer;
begin
 for select SIRA,ID  from TABLO where (detay=new.detay) and  (SIRA>=new.SIRA)  into :SIRANO,:IDNOSU do
 begin
  update TABLO set SIRA=:SIRA+1 where ID=:IDNOSU;
 end
 for select SIRA,ID  from TABLO where (detay=new.detay) and  (SIRA<=new.SIRA)  into :SIRANO,:IDNOSU do
 begin
  update TABLO set SIRA=:SIRA-1 where ID=:IDNOSU;
 end
end
Bu kod denememde yalnış atamalar yapıyor.Farklı düşüncesi ve önerisi olan var mı?
Yardımlarınızı bekliyorum.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Trigger de sıralama yapmak

Mesaj gönderen aslangeri »

s.a.
güzel bir soru.
önce ne yapmak istediğinizi tam olarak idrak edemedim.
eğer trigger ile yapmak istiyorsan aşağıdaki yapı işini görecektir.
syntaxda ufak hatalar olabilir.
kolay gelsin.
öncelikle işlemimizi trigerda yapacağız. bu yüzden yapacağımız işlem trigerin tekrar tetiklenmesine neden olacak.
bu durumda sonsuz bir döngüye girebilir. bunun için kullanacağımız bir generator ü, triger içinden tabloyu update ettiğizi anlamak için kullanacağız.
ikinci bir generatorude sıranumarasını takip etmek için kullanacağız.

Kod: Tümünü seç

create generator gen_triggerden_update ;
set generator gen_triggerden_update to 0;
create generator gen_yeni_sirano;
Not: dediğim gibi syntaxda hata olabilir.
sonra triger içinde bu generatoru kontrol ve set ederek trigerimizi yazalım.

Kod: Tümünü seç

if gen_id(gen_triggerden_update,0)=0 then
begin
  sen generator gen_triggerden_update to 1;
  //burda aldığımız değere göre yeni_sirano generatorunu set edip tablomuzu update edeceğiz.
  set generator gen_yeni_sirano to new.sirano;
  update tablo set sirano=gen_id(gen_yeni_sirano,1) where sirano>new.sirano and id<>new.id
  //işimiz bitti artık triggerden update generatorunu tekrar eski haline getirelim.
  sen generator gen_triggerden_update to 0;
end;
yaklaşık olarak yukardaki kodlar ile istediğin işlemi yapabilmen lazım.
yazım yanlışları vs olabilir. onlarıda kendin düzeltirsin artık.
kolay gelsn.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Trigger de sıralama yapmak

Mesaj gönderen sabanakman »

Mantık olarak o değerden küçük olanlara dokunmaman gerekmektedir. Mesela bir araba yarışındasın ve önündeki araç 5. sırada. Sen onu geçersen ilk 4 sırayı değiştirmezsin ;) . Burada iki aşamalı bir mantıkla çözüme kavuşabilirsin.

örnek seçilen E değerinin 2. sırası için..:
-update TABLO set SIRA=SIRA+1 where SIRA>=2

-update TABLO set SIRA=2 where DEGER='E'

gibi bir mantık yürütülebilir.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Re: Trigger de sıralama yapmak

Mesaj gönderen Berdem »

A.S
aslageri kardeşim genaratörü set etmiyor..
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
hatası veriyor...
sanırım set..generatör işlemi trigerda olmuyor...
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Trigger de sıralama yapmak

Mesaj gönderen aslangeri »

yanlış yazmışsındır. biryerde noktalı vürgül unutulmuş olabilir.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Re: Trigger de sıralama yapmak

Mesaj gönderen Berdem »

:oops: Malesef olmuyor...Sanırım FB özelliği.Başka triggerlarda da denedim olmuyor.

Kod: Tümünü seç

CREATE PROCEDURE NEW_PROCEDURE (
    deger integer)
as
begin
  set generator gen_Tablo_id update deger;
end
bundada aynı hatayı veriyor.

Sanırım başka procedure içinde yapmamız lazım.

Kod: Tümünü seç

CREATE PROCEDURE SETGEN_TRIGGERDEN_UPDATE (
    val integer)
as
BEGIN
  val = GEN_ID (GEN_TRIGGERDEN_UPDATE, val - GEN_ID (GEN_TRIGGERDEN_UPDATE,0) );
END
iki genaratör için düzenledim.

Kod: Tümünü seç

 if (gen_id(gen_triggerden_update,0)=0) then
begin
  EXECUTE PROCEDURE setgen_triggerden_update(1);
  EXECUTE PROCEDURE setgen_yeni_sirano(new.sirano);
  update tablo set sirano=gen_id(gen_yeni_sirano,1) where sirano>=new.sirano and (detay_id=new.detay_id) and (tablo_id<>new.tablo_id);
  EXECUTE PROCEDURE setgen_triggerden_update(1);
malesef tabloda bir hareket veya değişim olmadı....
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Trigger de sıralama yapmak

Mesaj gönderen aslangeri »

s.a.
şu şekilde halledebilirsiniz.

Kod: Tümünü seç

CREATE OR ALTER trigger xxxxxx_bi for xxxxx
active before insert position 0
AS
declare variable trgr varchar(200);
BEGIN
  trgr='SET GENERATOR GEN_xxxxxx_ID TO 999';
  execute statement trgr;
END
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Berdem
Üye
Mesajlar: 431
Kayıt: 28 Tem 2003 12:28

Re: Trigger de sıralama yapmak

Mesaj gönderen Berdem »

@aslangeri kardeşim,
Aynen dediğiniz gibi yaptım.. :bravo: :bravo: :bravo: :bravo:
Elinize sağlık çok teşekkür ediyorum.
Cevapla