Trigger hata mesaji

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
mrtblt
Üye
Mesajlar: 222
Kayıt: 02 Tem 2007 05:13

Trigger hata mesaji

Mesaj gönderen mrtblt »

Merhaba LKS_CS tablosu icin bir trigger olusturmak istiyorum asagidaki gibi.

Kod: Tümünü seç

CREATE trigger lks_cs_ai0 for lks_cs
active after insert position 0
AS
begin
    select count(*) as kaysay from omegahsp where omegahsp.ozel_kod = cast(lks_cs.logref as varchar(3));
end
ama soyle bir hata mesaji aliyorum
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 5, column 104.
;.
Buradaki lks_cs.logref alani bir integer tiptedir ve ben bunu stringe donusturup omegahsp tablosu icerisindeki ozel_kod alaninda kriter deger olarak kullanmak istiyorum

Buradaki hata mesajinin sebebi nedir?
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
en sondaki ; (noktalı virgül) ü tanımadığını söylüyor.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
mrtblt
Üye
Mesajlar: 222
Kayıt: 02 Tem 2007 05:13

Mesaj gönderen mrtblt »

Kesinlikle seninle ayni fikirdeyim :lol:
Aslinda soruyu yazarken de lutfen noktali virgul diye cevap yazmayin diye not alacaktim. :lol:

Bunun noktali virgulle alakali oldugunu zannetmiyorum. Noktali virgule gelene kadar birtakim yerlerde belki sorgulama mantiginda hata var. Bu tarz seyler daha oncede basima geldi ve sorgulamada dogru yolu bulunca bu ';' hatasida direkt ortadan kalkti.

Simdi bu mesaja ekledigim sorgulama kodunda nasil bir hatanin olabilecegini bilmiyorum. Bu yuzden mesaji buraya yazdim.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

evet haklısın.
select ile çektiğin değer into ile bir değişkene atman lazım
sp lerde olduğu begin den önce declare variable ile değişken tanımlayabilirsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
mrtblt
Üye
Mesajlar: 222
Kayıt: 02 Tem 2007 05:13

Mesaj gönderen mrtblt »

Dedigini yapacagim. Ama

select count(*) as kaysay from


burada zaten degeri bir degiskene (kaysay) aktardim. Delphide de boyle yapabiliyoruz.
Sanirim delphi icinde yaptigimiz sorgular daki mantik veritabaninin icerisinde yaptigimiz sorgulardan biraz farkli
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

orda değişkene aktarmıyorsun. orda column için bir alan veriyorsun.
sqleditorden yazdığn sql çalıştırdığın zaman
alan adı olarak kaysay geldiğini görürsün. as kaysay yazmasan count*** gibisinden bir adı olur. orda column için alias veriyorsun. değişken ataması değil.
Bu triger ile senin amacın nedir.
geriye kayıt sayısını döndürmek istiyorsan yanlış yapıyorsun. trigerda geriye değer dönmez. (ancak başka bir tabloya insert update vs. işlemleri yapabilirsin).
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
mrtblt
Üye
Mesajlar: 222
Kayıt: 02 Tem 2007 05:13

Mesaj gönderen mrtblt »

Burada yapmak istedigim sey LKS_CS tablosuna bir kayit girildiginde bu trigger omegahsp tablosunda ozel_kod degeri yeni girilen lks_cs.logref alanina esit bir kayit olup olmadigini arastiracak eger kayit yoksa burada tkay=0 degeri dondurulecek dogal olarak ve trigger tkay=0 durumunda omegahsp tablosuna yeni bir kayit girecek.

Kodu senin dedigin sekilde duzelttim

Kod: Tümünü seç

CREATE trigger lks_cs_ai0 for lks_cs
active after insert position 0
AS
declare variable tkay integer;
begin
  select count(*) from omegahsp where ozel_kod = lks_cs.logref into tkay;
end
Bu seferde soyle bir hata aldim
Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
LKS_CS.LOGREF.
At line 6, column 57.
Burada benim referans tablom lks_cs degilmi zaten!!!
lks_cs de logref diye bir alan mevcut.
Neden bu hata mesajini aldim?
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

o kodu query editore koyduğun zaman gen aynı mesajı verecektir.
çünkü lks_cs tablosunu bir yerde tanımlamamışsın.
trigeri o tablo için hazırlıyorsun ama tabloya o şekilde erişemezsin.
tablolar erişmek için new ve old deyimlerini kullanman lazım.
old eski değerler new yeni değerler için kullanılır.
burda

Kod: Tümünü seç

lks_cs.logref 
yerine
new.logref
dersen onuda halledersin.
trigerin kodu şöyle birşey olmalı.

Kod: Tümünü seç

CREATE trigger lks_cs_ai0 for lks_cs
active after insert position 0
AS
declare variable tkay integer;
begin
  select count(*) from omegahsp where ozel_kod = new.logref into :tkay;
  if (tkay=0) then
  begin
     insert into omegashp(alanlar)values(degerler)
  end
end
kodları kafamdan yazdım. derlerken syntax ile ilgili hata alabilirsin, burdan hareketle yaparsın :wink:
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
mrtblt
Üye
Mesajlar: 222
Kayıt: 02 Tem 2007 05:13

Mesaj gönderen mrtblt »

Yardimlarin icin tesekkur ederim simdi iyi calisiyor. Fakat soyle bir sorun var

Kod: Tümünü seç

        insert into omegahsp(tarih,kod,giris_cikis,evrak_turu,aciklama)
        values(new.vade,11,'GIRIS','BANKA',new.client+' TAHSILAT');
Burada en sondaki aciklama alani icin soyle bir deger atamak istiyorum
new.client+' TAHSILAT'

Ama bunu kabul etmiyor. Yani iki bilesenden bir string deger cikartmak istiyorum. Belkide + da sorun var.
Burada 2 string i birlestirerek nasil bir alana atayabilirim

Belki donguye girmeden bunlari daha once tanimladigim bir bilesene atayarak sorun cozulebilinir ama sanirim bundan daha kolay ve kisa bir yol olmali. Yani direkt orada parantezlerin icerisinde hallledilebilinecek bir yol
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

Belkide + da sorun var.
Burada 2 string i birlestirerek nasil bir alana atayabilirim
string toplama diye aratırsan detaylı bilgiye ulaşabilirsin. sitringleri toplamak için (+) değil (||) işaretini kullanmalısın.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
mrtblt
Üye
Mesajlar: 222
Kayıt: 02 Tem 2007 05:13

Mesaj gönderen mrtblt »

tesekkurler. Arama noktasinda cok haklisin.
Ama bugun bahanemiz var.
Hava burada bugun 40 derece 8)
mrtblt
Üye
Mesajlar: 222
Kayıt: 02 Tem 2007 05:13

Mesaj gönderen mrtblt »

Peki hocam soyle bir sorum daha var.
Bu sefer aradim ama bulamadim :)

Kod: Tümünü seç

begin
    select count(*) from omegahsp where ozel_kod = cast(new.logref as varchar(10)) into :tkay;
    if (tkay=0) then
    begin
        insert into omegahsp(tarih,kod,giris_cikis,evrak_turu,aciklama,odeme_turu,miktar,ozel_kod)
        values(new.vade,11,'GIRIS','BANKA',new.client||' TAHSILAT','CASH',new.miktar,'CS'||new.logref);
    end
end
IBexpert te derleyince bunda bi sorun yok. Yani yazim dogru.

Ama program calistiginda yani trigger tetiklendiginde soyle bir hata mesaji aliyorum


arithmetic exception, numeric overflow or string truncation
At trigger 'LKS_CS_AI0'
Sanirim bu surasi ile alakli bir sorun

where ozel_kod = cast(new.logref as varchar(10))

Tablolardaki alan ozellikleri soyledir :

Ozel_Kod : Varchar (10);
logref : integer;

Alanlar farkli turden fakat ben bu karsilastirmayi yaparken CAST ile zaten donusum yapiyorum.

Acaba baska bir sorun mu var?
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

select ile ilgili bir sıkıntı olduğunu zannetmiyorum.
select cümlesini sql editorde ayrıca bi çalıştırın. new.logref yerine de herhangi bir rakam yazın. orda sıkıntı olmazsa (ki benim tahminim o yönde) insert cümlesinde bir sıkıntı var.
alanların uzunlukları ve/veya tipleri birbiri ile uyumsuz.
insert deki alanların ve values deki alanların tiplerini kontrol edin.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
mrtblt
Üye
Mesajlar: 222
Kayıt: 02 Tem 2007 05:13

Mesaj gönderen mrtblt »

Senin dedigin gibi sorun alan uzunluklarinin uyusmamasi ile alakali imis.
Sanirim sql de truncate trim yada copy gibi direkt stringden karakter atmaya yonelik komutlar yok.
Yani 40 karakter uzunlugundaki bir alanin degerinin mesela ilk 30 karakterini almak icin nasil bir yol izleyebiliriz.
copy (s,0,30) gibi
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

eğer udf leri yüklediysen onların içinde substr gibi bi udf olması lazım.
aynı şekilde ltrim ve rtirm komutları da olacaktır.
udf leri yüklemediysen firebird/interbase in içinde udf dizini var. dll dosyasının yanıda birde script dosyası olması lazım.
scripti çalıştırdığın zaman udfleri kullanabilirsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Cevapla