birden fazla alan için SP

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ı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

birden fazla alan için SP

Mesaj gönderen bobasturk »

Merhaba ustalarım,

başlığı tam atabildimmi bilmiyorum ama firebird ve ibexpert kullanıyorum.
bir tane binayönetimi için takip programcığı yapmak istiyoum.

burada aidat takipleri için oluşturduğum tablolar var. aidatödeme tablomda beş tane float alan var. bu alanlara girilen değerlerin durum adındaki tabloda bulunan iki alanımda toplamasını veya çıkarmasını yapmasını istiyorum bu yüzden SP ler kullanıcam ama

ben bu sp leri her alan için ayrı ayrı mı yazmalıyım yoksa tek sp editöründe hepsini birden yazabilirmiyim.

örnek verilmek istenirse

Kod: Tümünü seç

tabloaidatödeme

daireno
aidattutarı
sıcaksututarı
ödenenaidat
ödenensıcaksu
kalan 

tablodurum

daireno
ödenmesigereken
ödenen
borcu

burada sp ler ile yapmak istediğim
ödenmesigeren=aidattutarı,sıcsututarı
ödenen=ödenenaidat,ödenensıcaksu
borcu=kalan
proje sadece aidat takibi ile kalmayacağı için (bütçe hazırlama, kasa takibi) sp ler pek çok olacak. bunun için her alanın sp sini tek olarak yazmalıyım yoksa yukarıdaki örnekte ki alanların sp lerini bir seferde yazabilirmiyim.

teşekkür ve saygılarımla
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

SP'ler yerine otomatik güncellemeler için Trigger'ları kullanmanız gerekecektir diye düşünüyorum. Zira SP'leri sizin bilinçli olarak çağırmanız gerekecek. Eğer Trigger kullanırsanız, Table'a herhangi bir kayıt INSERT, UPDATE veya DELETE edildiğinde otomatik tetikleneceği için sizin başka bir şeyi kontrol etmenize gerek kalmadan DB kendi kendine bu işler halledecektir ve siz de RDBMS kullanmanın tadına varacaksınız (Tabi daha önceden kullanmadığınız varsayarak söylüyorum)

Kullanımlarla ilgili olarak makaleler bölümünde Fahrettin beyin makaleleri yeterince aydınlatıcı olacaktır, ayrıca Zannedersem 8. Seminer konusu da bu idi, bu seminer CD'lerini de izlerseniz faydalı olur.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

ustam,

cevabın ve öğretin için teşekkür ederim. aslında sp ve trigger konusunda sıfırım diyebilirim. bu yapacağım uygulamada esin kaynağım yine fahrettin bey idi. onun makale kısmında verdiği stok takibinden yola çıkmıştım ve bende bu örneği yapacağım projeye uygulamak istedim. yani veri girilince toplayacak, yanlışlık olup silerse toplanan veri eksilecek gibi uzayıp gidiyor. bu çalışmayı daha önce denedim ve hazırladığım sp ve trigger sayıları 100 ü geçmişti. buda haliyle takibi zorlaştırıyordu.

sizin söylemek istediğinizden bu gibi işlerin sadece trigger ilede olabildiğini anlıyorum. yani sp yazmaya gerek yok olarak anlıyorum. örnekleri, makaleleri ve seminer cd sini inceleyeceğim. takıldığım yerde yine sizlere döneceğimi bilmenizi isterim.

teşekkür ve saygılarımla
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Estağfurullah,

Buradaki herkes yardımcı olmak ister. Siz söylediklerimi yaparsanız zaten soru soracak daha derin konular olacaktır :)

Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Otomatik çalışan kodlar trigger'lar olduğu için SP yazdığımızda bu SP yi triggerdan cagirmak durumundayız zaten... Yani hic SP kullanmadan da isi halledebiliriz aslında... Fakat olayı SP ile yapıp trigger'dan SP leri cagirmanin avantaji var. Mesela sadece trigger yazarsanız insert update ve delete triggerlarinin ucune de gerekli butun kodları yazmalısınız. Oysa sadece insert ve delete triggerlarindan cagirilacak SP2leri yazarsanız. update trigger'indan once Delete sonra da insert SP'sini cagirmak yeterli olacaktir. Yani hem daha az kodla işi halletmiş olacaksınız hem de yapısal olması sebebiyle çok daha anlaşılır olacaktir. Zira aynı trigger'dan farkli farkli isleri yapan bir cok SP cagiriyor da olabilirsiniz... Butun kodlari trigger'a gomerseniz takibi ve anlasilmasi epey zor kodlar olur....

Mesela su an calistigim bir projede bir trigger içinden 6-7 tane SP cagiriliyor. Her bir SP de ortalama 80-100 satir kod içeriyor.... Tabi bu 6-7 SP belirli koşullar dahilinde çağırılıyor veya çağırılmıyor.... Böyle bir yapıda butun kodu trigger içine topladığınızı ve bununla başetmeye çalıştığınızı bir düşünün yeni bir satır kod eklemek çok zor olurdu açıkcası.....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

ustam,

teşekkür ederim. 8. semineri dün akşam izledim, anlamaya çalıştım. down. ettiğim için tekrar tekrar izleyeceğim ve makalelerinizi okuyup anlamaya çalışacağım.

burada sp yazmam ve bu sp yi trigger ile çağırmam gerektiğini anladım ve öğrendim. yukarıda karışacağını söylemişsiniz.

buradan anladığım sp yapım tek alanın insert veya deletini oluşturmalı. her alan için sp yazmalıyım olarak anladım.

misal verirsem yukarıda verdiğim tablo biçimlerinde aidattutarı için bir spi, sıcaksututarı için bir spi gibi her bir alan için sp yazmalıyım ve bunları trigger ile çağırıp tetiklemeliyim.

öğrenmek istediğim bu yapı idi. önce aynı uygulama için bi deneme yapmıştım ve sp ler ile trigger lerimin sayısı 100 ü geçmişti. spu, spi, spd diye diye 100 ü aşkın sp yazmıştım ve bunların bi okadarda trigger leri olmuştu.

kısacası misalen ürüngiriş tablosunda 5 alan var, stok takip alanında 5 alan var buda demek ki 5 spi, 5 spd

saygılarımla kolay gelsin.
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

olc yazdı:.....
buradan anladığım sp yapım tek alanın insert veya deletini oluşturmalı. her alan için sp yazmalıyım olarak anladım.

misal verirsem yukarıda verdiğim tablo biçimlerinde aidattutarı için bir spi, sıcaksututarı için bir spi gibi her bir alan için sp yazmalıyım ve bunları trigger ile çağırıp tetiklemeliyim.

öğrenmek istediğim bu yapı idi. önce aynı uygulama için bi deneme yapmıştım ve sp ler ile trigger lerimin sayısı 100 ü geçmişti. spu, spi, spd diye diye 100 ü aşkın sp yazmıştım ve bunların bi okadarda trigger leri olmuştu.

kısacası misalen ürüngiriş tablosunda 5 alan var, stok takip alanında 5 alan var buda demek ki 5 spi, 5 spd

saygılarımla kolay gelsin.
Aman aman durun.....
bir yanlış anlaşılma var....
Her tablo icin insert trigger'inden cagirilacak bir stored procedure ile ki ben bunlara SPI_ on eki ile isim veriyorum. Bir de delete trigger'inden cagirilacak bir stored procedure yazmanız yeterli ki ben bunlara da SPD_ on eki ile isim veriyorum. Yani temel işlemler için tablo başına 2 stored procedure den bahsediyoruz.... Benim bahsettigim bir tablo icin 6-7 SP meselesei çok nadir, kompleks ve de özel bir durum.

Makaleyi dikkatli incelerseniz zaten oa makalede gerekli tabloları oluşturma kodlarından tutun da bütün trigger ve SP lerin kodları da var... Dolayısıyla sadece bu kodları sırası ile çalıştırıp anlatımları okumanız yeterli.... Ustune de semineri tekrar izlemek ile mesele pekişecek kanaatindeyim.....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

evet fahrettin abi can alıcı noktama bastın. yukarıdan beri asıl öğrenmek istediğim bu idi ama bu işi bilmediğimiz gibi soru sormayıda bilmiyorus.

şimdi yapmak istediğim çalışmada duruma göre tablolardaki alanlar yani sp yazılacak alan sayıları değişiyor. misalen gider tablosunda yakıt, asansör, temizlik...... gibi alanlar 10 veya üstü alan oluşbiliyor. bunları sp ile arttırıp eksiltmek istiyorum.

verdiğin örneğe uygun olarak her alan için sp ve trig yazdığımda işlemler tıkır tıkır çalışıyor buda zaman ve emek sarfettiriyor. bazı denemeler yaptım başaramadım o tablonun sp sini yazarken tüm alanları içinde barındıran ve işlemlerini yaptıran soruyu bu yüzden sormuştum.

Kod: Tümünü seç

CREATE PROCEDURE SPI_AIDATODEME_ODENEN (
    DAIRENO INTEGER,
    AIDATODENEN FLOAT,
    SICSUODENEN FLOAT)
AS
DECLARE VARIABLE DLR_KAYIT_SAYISI INTEGER;
begin 
  select count(*) 
  from DURUM where DAIRENO = :DAIRENO
  INTO DLR_KAYIT_SAYISI; 
  if (DLR_KAYIT_SAYISI=0) then 
    insert into DURUM(DAIRENO,TPLODENEN) values(:DAIRENO,0);
  update DURUM set
    TPLODENEN = TPLODENEN+(:AIDATODENEN+:SICSUODENEN)
  where DAIRENO = :DAIRENO;
END

CREATE TRIGGER TI_AIDATODEME FOR AIDATODEME
ACTIVE AFTER INSERT POSITION 0
AS
DECLARE VARIABLE numrows INTEGER; 
BEGIN 
    select count(*) 
      from DAIRESAKINLERI
      where      NEW.DAIRENO = DAIRESAKINLERI.DAIRENO into numrows;
    IF (      numrows = 0    ) THEN 
    BEGIN 
      EXCEPTION ERWIN_CHILD_INSERT_RESTRICT; 
    END
    execute procedure SPI_AIDATODEME_TUTAR NEW.DAIRENO, NEW.aidattutari, NEW.SICSUTUTARI;
    execute procedure SPI_AIDATODEME_ODENEN NEW.DAIRENO, NEW.AIDATODENEN, new.SICSUODENEN;
    execute procedure SPI_AIDATODEME_KALAN NEW.DAIRENO, NEW.KALAN;

END
yaptığım çalışma bu triggerde bütün sp leri (o tabloya ait insert veya delet) tetikleyebiliyorum bunu bi nebze başardım.

ama sp leri kafam almadı.

AIDATODEME tablomda
aidattutarı
sıcsututarı
aidatödenen
sıcsuödenen
kalan

durum tablomda
odenmesigereken
toplamödenen
borcu

diye alanlar var ben burda yukarıdaki sp de anlaşıldığı gibi aidattutarı+sıcaksututarı+odenmesigereken=ödenmesigereken şeklinde yazıp çalıştırmayı başardım.

tablolarımdaki sp leri bu şekil oluşturmak istiyorum ve tek sp içinde tüm alanların insert veya delet işlemini yaptırmak istiyorum ama birinci alanın sp sini yaptıktan sonra kodun altına devam olarak ikinci alanın sp sini oluşturamıyorum ve hata veriyor.

iki ayrı alan diğer tabloda iki ayrı alana toplanacak veya çıkarılacak aradaki bağlantı nasıl oluşturulacak
update set tablo dan sonra toplama veya çıkarmayı belittikten sonra altına ikinci satır olarak diğer alanın değerlerini giriyorum ama hata veriyor. Aralara virgil mü konmalı, noktalı virgülmü, yoksa tek sql sayfasında hepsini tam kod olarak alt alta mı yazıp compile etmeli beceremedim

teşekkür ve saygılarımla
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

Kod: Tümünü seç

CREATE PROCEDURE SPI_AIDATODEME (
    DAIRENO INTEGER,
    AIDATODENEN FLOAT,
    SICSUODENEN FLOAT,
    AIDATTUTARI FLOAT,
    SICSUTUTARI FLOAT,
    KALAN FLOAT)
AS
DECLARE VARIABLE DLR_KAYIT_SAYISI INTEGER;
begin 
  select count(*) 
  from DURUM where DAIRENO = :DAIRENO
  INTO DLR_KAYIT_SAYISI; 
  if (DLR_KAYIT_SAYISI=0) then 
    insert into DURUM(DAIRENO,TPLODENEN) values(:DAIRENO,0);
  update DURUM set
    TPLODENEN = TPLODENEN+(:AIDATODENEN+:SICSUODENEN)
  where DAIRENO = :DAIRENO;

   select count(*) 
  from DURUM where DAIRENO = :DAIRENO
  INTO DLR_KAYIT_SAYISI; 
  if (DLR_KAYIT_SAYISI=0) then 
    insert into DURUM(DAIRENO,ODMGEREKEN) values(:DAIRENO,0);
  update DURUM set
    ODMGEREKEN = ODMGEREKEN+(:AIDATTUTARI+:SICSUTUTARI)
  where DAIRENO = :DAIRENO;

  select count(*) 
  from DURUM where DAIRENO = :DAIRENO
  INTO DLR_KAYIT_SAYISI; 
  if (DLR_KAYIT_SAYISI=0) then 
    insert into DURUM(DAIRENO,ODMGEREKEN) values(:DAIRENO,0);
  update DURUM set
    BORCU = BORCU+:KALAN
  where DAIRENO = :DAIRENO;
END


CREATE TRIGGER TI_AIDATODEME FOR AIDATODEME
ACTIVE AFTER INSERT POSITION 0
AS
DECLARE VARIABLE numrows INTEGER; 
BEGIN 
    select count(*) 
      from DAIRESAKINLERI
      where      NEW.DAIRENO = DAIRESAKINLERI.DAIRENO into numrows;
    IF (      numrows = 0    ) THEN 
    BEGIN 
      EXCEPTION ERWIN_CHILD_INSERT_RESTRICT; 
    END
    execute PROCEDURE spi_aidatodeme NEW.daireno, NEW.aidattutari, NEW.sicsututari, NEW.aidatodenen, NEW.sicsuodenen, NEW.KALAN;
END
ustam, şu şekil yaptım ve işlemi yapıyor yani aidat ödeme tablosuna veri girdiğimde durum tablosunda işlemi otomatik yazıyor. sizce yapı doğrumu

teşekkür ve saygılarımla
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Ustunde uzun uzun dusunmedim ama ilk bakısta yapı dogru gorunuyor....
Dedigim gibi makalenin uzerinden ornek kodları proje uzerinde calistirarak giderseniz bilgiler yerine oturacaktr....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

ustam,

öncelikle cevabımın gecikmesinden dolayı özür dilerim. Gece mesaisine gittim ve bunun yanında bilgi. virüs bulaştı int. giremedim.

önceki mesajımda yazdığım kodları denediğimde sorunsuz giriş ve çıkışları gerçekleştiriyor. zaten temel olarak makalenizden yola çıkarak bu işi gerçekleştirmeye çalışıyorum. yardımlarınız için teşekkür eder saygılar sunarım.

kolay gelsin
Cevapla