stored procedure'de anlamsız hata

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
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

stored procedure'de anlamsız hata

Mesaj gönderen nitro »

s.a
benim bir stokkart tablom var
bu kart tablosunda stokno,stokadı, miktarı, gelisfiyatı falan var
bir de urun giriş tablosu var
ürün giriş tablosunda giriş,değiştirme,silme yapıldığı zaman
stok tablosuna etkiyecek sp'yi yazdım. trigger ayarladım.
bu kodlar giriş yapıldığı zaman ürün tablosundan miktarı artırıyor,
gelişfiyatı da değiştiriyor.
ama bu ürün giriş tablosunda toplamfiyat kısmının sp tarafından hesaplanmasını istiyorum.
yani toplamfiyat := gelismiktar * birimfiyat
yazdığım kod şu.
derlerken hata vermiyor ama ürüngiriş tablosuna kayıt yapınca hata veriyor.
ibexpertin verdiği hata şu:
Too many concurrent executions of the same request.

Kod: Tümünü seç

CREATE PROCEDURE SPI_URUN_GIRIS (
    URUNNO INTEGER,
    GIRISMIKTARI INTEGER,
    BIRIMFIYAT NUMERIC(6,2))
AS
DECLARE VARIABLE KAYIT_SAYISI INTEGER;
begin
  select count(*) 
  from URUN where URUNNO = :URUNNO
  INTO KAYIT_SAYISI;
  if (KAYIT_SAYISI=0) then
    insert into URUN(URUNNO,MIKTAR) values(:URUNNO,0);
  update URUN set
    MIKTAR = MIKTAR+:GIRISMIKTARI,
    GELISFIYAT = :BIRIMFIYAT where
    URUNNO = :URUNNO;
  update URUN_GIRIS set
  TOPLAMFIYAT = :BIRIMFIYAT * :GIRISMIKTARI;
  suspend;

nerde hata yapmışım ki?
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

Kod: Tümünü seç

update URUN_GIRIS set 
  TOPLAMFIYAT = :BIRIMFIYAT * :GIRISMIKTARI; 
toplamfiyat alanının tipi nedir?
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

toplam fiyat tipi

Mesaj gönderen nitro »

TOPLAMFIYATIN tipi numeric (6,2)
ama anladığım kadarıyla şöyle bir durum var
kod hangi row'a etki edeceğini bilemiyor.
yani where condition yok.
onu nasıl sağlayacağım?
yada gerek var mı?
selm@n
Kıdemli Üye
Mesajlar: 442
Kayıt: 01 Oca 2004 11:52
Konum: Adapazarı
İletişim:

Mesaj gönderen selm@n »

evet hocam nasıl bilecekki hangi urun olduğunu bir şart olmalı..

Kod: Tümünü seç

suspend; 
gerek yok zannedersem;
;)
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

peki aktif satırı

Mesaj gönderen nitro »

peki aktif satırı ne diye ifade edebilirim.
yani where kısmına ne yazabilirim. bir de Selm@n abinin kastettiğini tam anlamadım.
suspend'e mi gerek yok?
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

SON DURUM ŞU

Mesaj gönderen nitro »

trigger'ı şu şekilde ayarladım:

Kod: Tümünü seç

execute procedure SPI_URUN_GIRIS NEW.URUNNO, NEW.GIRISMIKTARI, NEW.birimfiyat, new.fisno;
sp'yi de şu şekilde:

Kod: Tümünü seç

CREATE PROCEDURE SPI_URUN_GIRIS (
    URUNNO INTEGER,
    GIRISMIKTARI INTEGER,
    BIRIMFIYAT NUMERIC(6,2),
    FISNO INTEGER)
AS
DECLARE VARIABLE KAYIT_SAYISI INTEGER;
begin
  select count(*) 
  from URUN where URUNNO = :URUNNO
  INTO KAYIT_SAYISI;
  if (KAYIT_SAYISI=0) then
    insert into URUN(URUNNO,MIKTAR) values(:URUNNO,0);
  update URUN set
    MIKTAR = MIKTAR+:GIRISMIKTARI,
    GELISFIYAT = :BIRIMFIYAT where
    URUNNO = :URUNNO;
  update URUN_GIRIS set
  TOPLAMFIYAT = :BIRIMFIYAT * :GIRISMIKTARI where
  FISNO = :FISNO;
ama yine hata verdi
selm@n
Kıdemli Üye
Mesajlar: 442
Kayıt: 01 Oca 2004 11:52
Konum: Adapazarı
İletişim:

Mesaj gönderen selm@n »

çıkış parametreleri yani yazdığın SP bir değer döndürmediğinden suspend; gerek yok...

URUN_GIRIS tablondaki urun_no ile parametre ile gönderdiğin :URUNNO
ile yapabilirsin;

Kolay gelsin;
;)
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

hocam

Mesaj gönderen nitro »

hocam s.a
fisno dediğim bir autoinc alandır.
mevcut kayda konumlanmak için onu kullandım ama nafile.
en son gönderdiğim kodlar aslında muntazam ama
bir hata var. şöyle ki yeni bir giriş yapıldığı zaman o girişfişinin henüz bir autoinc numarası atanmamış oluyor.
o nedenle hata veriyor.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

S.A.
eğer fisno alanı trigerde null sa execute procedure den önce onu kontrol ettirin.

Kod: Tümünü seç

if (new.fisno is null) then new.fisno=gen_id(xxxxx,1);
Kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

Kod: Tümünü seç

CREATE TRIGGER URUN_GIRIS_BI FOR URUN_GIRIS
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.FISNO IS NULL) THEN
    NEW.FISNO = GEN_ID(GEN_URUN_GIRIS_ID,1);
END 
hocam zaten bu kod autoinc üretiyor.
ama en iyisi ben bu sevdadan vazgeçeyim.
artık toplamfiyat field'ını programda kendim hesaplatıp atayacağım.
ama update olaylarında sorun çıkaracaktır.
neyse cazgeçmekten vazgeçtim. bu olayı çözmem lazım.
isteyene gdb dosyasını göndereyim.
inceleyin. ya da buna benzer bir olayı illaki birileri yapmıştır.
örnek kodlama gönderirseniz minnettar oluruz. yardımlarınız için sonsuz teşekkürler.
allaha emanet olun.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

S.A.
Sanırım anlatamadım.
nitrokonat yazdı: şöyle ki yeni bir giriş yapıldığı zaman o girişfişinin henüz bir autoinc numarası atanmamış oluyor.
o nedenle hata veriyor.
bende diyorumki

Kod: Tümünü seç

execute procedure SPI_URUN_GIRIS NEW.URUNNO, NEW.GIRISMIKTARI, NEW.birimfiyat, new.fisno;
satırında önce fişno alnını kontrol edip null ise değer ver. böylelikler senin

Kod: Tümünü seç

CREATE TRIGGER URUN_GIRIS_BI FOR URUN_GIRIS
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.FISNO IS NULL) THEN
    NEW.FISNO = GEN_ID(GEN_URUN_GIRIS_ID,1);
END
trigerin fisno null olmadığı için değer vermiyecek.
yalnız fino foreign key ise sıkıntı olabilir.
Kolay gelsin.
[/quote]
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

s.a.
fişnonun null olması durumunda çalışacak kodu yazdım.
yani kodlar null fişnumarası gelirse yeni bi tane generate edip
gönderiyolar.
ben şu anda bir müşterimin bilgisayarındayım. kendi bilgisayarımda olmadığım için detaylı kodları gönderemiyorum.
ama bir önceki mesajımda söylediğim gibi denemek isteyene gdb dosyasını gönderebilirim.
buna benzer bir işlemi yapmış olan varsa örnek kodlarına da mümkünse göz atmak isterim. saygılarımla.
(ilgilerinden dolayı aslangeri,ve selm@n abilerime teşekkürler )
highmemo

Mesaj gönderen highmemo »

Selam ,
Yazdıklarını okudum anladım, fakat Hangi TRG veya SP ler var tablolarında bilmediğimden dolayı sana şunu öneririm.


Sanırım, tablolarına yaptğını işlemler sırasında Fonksiyonlar tekrar biribirini çağırıyor.. Ve hataya düşüyor..


Örneğin URUN_GIRIS tablosunun After insert teki TRG in ve SP içerisindeki komut Tekrar bir Olay oluşturup tekrar aynı SP'ler işini bitirmeden döngüye giriyoırlar..

birde Şu satırı

Kod: Tümünü seç

DECLARE VARIABLE KAYIT_SAYISI INTEGER; 
begin 
  select count(*) 
  from URUN where URUNNO = :URUNNO 
  INTO KAYIT_SAYISI; 
  if (KAYIT_SAYISI=0) then 
    insert into URUN(URUNNO,MIKTAR) values(:URUNNO,0); 
şöyle

Kod: Tümünü seç

  IF NOT(EXISTS(SELECT * FROM URUN WHERE URUNNO=:URUNNO))
  BEGIN
    insert into URUN(URUNNO,MIKTAR) values(:URUNNO,0); 
  END;
yazabilirsin..

Son olarak SP ye giren URUNNO yo IN_URUNNO olarak değiştirirsen kaışıklığa yol açmaz
Salih
Üye
Mesajlar: 250
Kayıt: 11 Mar 2004 05:36

Mesaj gönderen Salih »

nitrokonat yazdı:s.a.
ama bir önceki mesajımda söylediğim gibi denemek isteyene gdb dosyasını gönderebilirim.
buna benzer bir işlemi yapmış olan varsa örnek kodlarına da mümkünse göz atmak isterim. saygılarımla.
(ilgilerinden dolayı aslangeri,ve selm@n abilerime teşekkürler )
Merhaba,

Hocam bu sorunu aşabildiniz mi ?
Sevgi, Saygı.....
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

sorun çözüldü

Mesaj gönderen nitro »

kodlar şu anda yanımda olmadığı için tam çözümü veremiyorum.
ama daha sonradan tüm sorunları çözdüm.
olayın bir kısmını calculated fiels'e yıktım.
ama olayda recursive olarak fonksiyonların birbirini çağırma hatası da vardı.
Cevapla