stored procedure hakkında

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

stored procedure hakkında

Mesaj gönderen bobasturk »

selam,

Ustalarım forumda aramalar sonucu elde ettiğim bilgiler doğrultusunda ve birazda kopya çekerek aşağıda bulunan sp yi yazdım ve sonuç dönüyor fakat tam istediğim değil.

sp şöyle

Kod: Tümünü seç

CREATE PROCEDURE SP_OLAYTURU_TOPLAM (
    BASLANGIC_TARIHI DATE,
    BITIS_TARIHI DATE)
RETURNS (
    TARIH DATE,
    OLAY_TURU CHAR(25),
    ADET INTEGER)
AS
begin 
for 
  select INCTARIHI,ISTOLYTURU,COUNT(ISTOLYTURU)  from
    RAPORLAR  where INCTARIHI between :BASLANGIC_TARIHI    and :BITIS_TARIHI
    AND ISTOLYTURU='EVDEN HIRSIZLIK'
    GROUP BY
    INCTARIHI, ISTOLYTURU
INTO :tarih, :OLAY_TURU, :ADET
  DO 
  SUSPEND; 
end
bu sp ile verilen tarih aralığındaki olay türü sonuçlarını gün bazında döndürüyor. Yani her gün için o olay türünden kaç tane olmuş o sayıyı veriyor. daha doğrusu önceki sp öyle veriyordu bir iki değişiklik yaparak şimdi tek olay türünü yukarıda yazan EVDEN HIRSIZLIK olay türünü gün bazında veriyor.

bu işteki asıl amacım her ay düzenli olarak verdiğimiz istatistiği sp ile yaparak tek tuş ile çıkarmak. düne kadar hiç yapamıyordum ama yukarıdaki sonucu bile almak beni sevindirdi.

soruma gelince. dediğim gibi yukarıdaki sp gün bazında sonuç veriyor. bunu ay bazında nasıl sonuç verdirebilirim? tablomda 11 ayrı olay türü var. bunları sp ile ayda kaç tane olduğunu yaptırmaya çalışıyorum.

şimdiden teşekkür ve saygılarımla
kolay gelsin
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Hocam Ay olarak demişsiniz ama ben tam olarak anlayamadım. Aradığınız When Case SQL de if yapısı olabilirmi?

Biraz verisel örnek oluşturabilirmisiniz? şu şu verilerimiz var şu verileri nasıl alabilirim gibi.


Kolay Gelsin...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

Evet ustam,

tablomuzda

RAPORLAR
Raporno
inctarihi
istolyturu
mahallead
.......

şeklinde alanlar var. burada yapmak istediğim tarih aralığında (inctarihi) istolyturu(bu olay türleri 11 çeşit) sayılarını bulmak

yani 01.01.2005 ile 31.01.2005 tarihleri arasında
evden hırsızlık=30
işyerinden hırsızlık=10
otodan hırsızlık=5
........

gibi. verdiğim sp de tarih aralığını giriyorum ve sp içinde evden hırsızlık sabit verili olduğu için sp burada kayıt döndürüyor fakat 01.01.2005 ile 31.01.2005 tarihleri arasında

01.01.2005 evden hırsızlık 3
03.01.2005 evden hırsızlık 2
10.01.2005 evden hırsızlık 1
..........
31.01.2005 evden hırsızlık 5

şeklinde sonuç döndürüyor.

asıl yapmak istediğim

Ustam aslında lazım olan 12 ayın içinde bu 11 çeşit olay türünün ay ay kaçar tane olduğunu bulmak ama yavaş yavaş olayı çözmeye çalışıyorum şimdilik bir aylığı bulmaya çalışıyorum.

Veri Tabanım Frebird1.5

kolay gelsin teşekkür ederim
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Where deki

Kod: Tümünü seç

 AND ISTOLYTURU='EVDEN HIRSIZLIK' 
ifadesini kaldırınca hepsi için çalışmıyor mu o select :roll:
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

evet naile abla dediğini kaldırınca hepsini döndürüyor fakat dediğim gibi bir ay içindeki ISTOLYTUR lerinin toplamlarını vereceğine gün gün sayılarını veriyor.

ben toplamını istiyorum. bir ay içindeki gün gün olanları değil.

Kod: Tümünü seç

CREATE PROCEDURE SP_OLAYTURU_TOPLAM ( 
    BASLANGIC_TARIHI DATE, 
    BITIS_TARIHI DATE) 
RETURNS ( 
    TARIH DATE, 
    OLAY_TURU CHAR(25), 
    ADET INTEGER) 
AS 
begin 
for 
  select INCTARIHI,ISTOLYTURU,COUNT(ISTOLYTURU)  from 
    RAPORLAR  where INCTARIHI between :BASLANGIC_TARIHI    and :BITIS_TARIHI 
     
    GROUP BY 
    INCTARIHI, ISTOLYTURU 
INTO :tarih, :OLAY_TURU, :ADET 
  DO 
  SUSPEND; 
end

bu koda

 TARIH	                OLAY_TURU	        ADET
01.04.2005	DİĞER	                                1
01.04.2005	İŞYERİNDEN HIRSIZLIK	2
02.04.2005	EVDEN HIRSIZLIK	                1
02.04.2005	OTODAN HIRSIZLIK	                1
02.04.2005	İŞYERİNDEN HIRSIZLIK	1
03.04.2005	EVDEN HIRSIZLIK	                1
04.04.2005	EVDEN HIRSIZLIK	                2
05.04.2005	DİĞER	                                1
05.04.2005	EVDEN HIRSIZLIK	                2
06.04.2005	OTO HIRSIZLIĞI (TERK OTO)	1
07.04.2005	EVDEN HIRSIZLIK	                1
08.04.2005	OTO HIRSIZLIĞI (TERK OTO)	1
10.04.2005	EVDEN HIRSIZLIK	                1
10.04.2005	OTODAN HIRSIZLIK	                4
11.04.2005	EVDEN HIRSIZLIK	                1
11.04.2005	İŞYERİNDEN HIRSIZLIK	1
12.04.2005	EVDEN HIRSIZLIK	                2
12.04.2005	İŞYERİNDEN HIRSIZLIK	1
13.04.2005	İŞYERİNDEN HIRSIZLIK	1
14.04.2005	OTODAN HIRSIZLIK	                1
14.04.2005	ŞÜPHELİ ÖLÜM	                1
15.04.2005	EVDEN HIRSIZLIK	                1
15.04.2005	OTO HIRSIZLIĞI (TERK OTO)	1
15.04.2005	İŞYERİNDEN HIRSIZLIK	1
16.04.2005	EVDEN HIRSIZLIK	                1
17.04.2005	DİĞER	                                1
17.04.2005	EVDEN HIRSIZLIK	                1
18.04.2005	OTO HIRSIZLIĞI (TERK OTO)	1
18.04.2005	İŞYERİNDEN HIRSIZLIK	1
19.04.2005	OTODAN HIRSIZLIK	                1
20.04.2005	EVDEN HIRSIZLIK	                3

Bu sonuç dönüyor

bu koda ise

CREATE PROCEDURE SP_OLAYTURU_TOPLAM ( 
    BASLANGIC_TARIHI DATE, 
    BITIS_TARIHI DATE) 
RETURNS ( 
    TARIH DATE, 
    OLAY_TURU CHAR(25), 
    ADET INTEGER) 
AS 
begin 
for 
  select INCTARIHI,ISTOLYTURU,COUNT(ISTOLYTURU)  from 
    RAPORLAR  where INCTARIHI between :BASLANGIC_TARIHI    and :BITIS_TARIHI 
    AND ISTOLYTURU='EVDEN HIRSIZLIK' //burası dahil
    GROUP BY 
    INCTARIHI, ISTOLYTURU 
INTO :tarih, :OLAY_TURU, :ADET 
  DO 
  SUSPEND; 
end 


TARIH	               OLAY_TURU            ADET
02.04.2005	EVDEN HIRSIZLIK	1
03.04.2005	EVDEN HIRSIZLIK	1
04.04.2005	EVDEN HIRSIZLIK	2
05.04.2005	EVDEN HIRSIZLIK	2
07.04.2005	EVDEN HIRSIZLIK	1
10.04.2005	EVDEN HIRSIZLIK	1
11.04.2005	EVDEN HIRSIZLIK	1
12.04.2005	EVDEN HIRSIZLIK	2
15.04.2005	EVDEN HIRSIZLIK	1
16.04.2005	EVDEN HIRSIZLIK	1
17.04.2005	EVDEN HIRSIZLIK	1
20.04.2005	EVDEN HIRSIZLIK	3

bu sonuç dönüyor.


demek istediğimi anlatabilmişimdir. bu da güzel bi sonuç ama ben toplamlarını istiyorum 01.04.2005 ile 30.01.2005 tarihi arası EVDEN HIRSIZLIK toplamı gibi.

bu işi delphi tarafında query ile yapabiliyorum ama VT tarafında sp ile yapmak istedim. bu kodu genişleterek tüm olay türlerinin 12 ay içinde ay ay toplamlarını hesaplattırıp istatistik çıkarmak. çabalarım bu yönde ne kadar başarırım bilmiyorum.

yardımlarınız için teşekkürler
kolay gelsin

not:yazarken düzgün görünüyor ama gönderince bozuluyor rakamların karışıklığından dolayı özür
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Month kullan ;)

Kod: Tümünü seç

  select MONTH (INCTARIHI),ISTOLYTURU,COUNT(ISTOLYTURU)  
  from   RAPORLAR  
  where INCTARIHI between :BASLANGIC_TARIHI    and    :BITIS_TARIHI
  GROUP BY  MONTH (INCTARIHI), ISTOLYTURU 
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

Naile abla verdiğin kodu aynen kullandım, aklımın erdiği kadarı ile değişik şekillerde kullandım ama olmadı Hata olarak MONTH hatası dönüyor. VT Frebird kullanıyorum MONTH kabul ettiremedim.

kolay gelsin
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

ms sql servera göre yazmıştım ben firebirdde farklı oluyordu unutmuşum. Onu şöyle kullanabilirsin:

Kod: Tümünü seç

EXTRACT(MONTH FROM TARIH)
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 SP_OLAYTURU_TOPLAM ( 
    BASLANGIC_TARIHI DATE, 
    BITIS_TARIHI DATE) 
RETURNS ( 
    OLAY_TURU CHAR(25), 
    ADET INTEGER) 
AS 
begin 
for 
  select ISTOLYTURU,COUNT(ISTOLYTURU)  from 
    RAPORLAR  where INCTARIHI between :BASLANGIC_TARIHI    and :BITIS_TARIHI 
    AND ISTOLYTURU='EVDEN HIRSIZLIK' 
    GROUP BY 
    ISTOLYTURU 
INTO :OLAY_TURU, :ADET 
  DO 
  SUSPEND; 
end
 
ustalarım ilk verdiğim sp de değişiklikler yaparak (returns dan tarih dönüşünü kaldırarak ve select te INCTARIHI alanını kaldırarak) ISTOLYTURU alanında bulunan EVDEN HIRSIZLIK kayıtlarının 01.04.2005 ile 27.04.2005 tarihleri arasındaki toplamlarını bulmayı başardım. Başardım diyorum sizin için belki kolay ama iki günden buyana bilgisayar başına oturma fırsatı buldukça bununla uğraşıyorum.

daha önceki yazılarımda dediğim gibi ISTOLYTURU alanına 11 farklı olay türü girişi yapılıyor. Bunlardan yazdığım sp ile Evden Hırsızlık olanlarının toplamını bulduk verilen tarih aralığında. Ama lazım olan 11 ayrı tür olayın her birinin verilen tarih aralığındaki sayısını bulmak. Select içinde select uygulamaya kalktım hatalar verdi ve çalışmadı, uğraşmaya devam edicem inşeallah başarırım. Sanıyorum kolay olmayacak

kolay gelsin teşekkürler
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

Sorunu çözmüşsüm ana sanırım biraz ezbere olmuş

Kod: Tümünü seç

for
  select INCTARIHI,
           ISTOLYTURU,COUNT(ISTOLYTURU)  
  from RAPORLAR  
  where INCTARIHI between :BASLANGIC_TARIHI and :BITIS_TARIHI
  GROUP BY INCTARIHI, 
                  ISTOLYTURU
INTO :tarih, 
        :OLAY_TURU, 
        :ADET
  DO
  SUSPEND;
end 
Bu senin istemediğin gibi çalışan kodun, şimdi: sum,count vs gibi komutlar kullandığında, select ifadesinde kullandığın normal bir field olursa(INCTARIHI gibi) bunu GORUP BY ile gruplandırmak zorundasın, bu yazdığın kodda bu yüzden her aynı tarih olan kayıtları döndürüyor. Burda bir alicangiz oyunu yapılabilinirdi mesela bu sadece fikir versin diye bir örnek
MAX(INCTARIHI) as ENSON_OLAN_OLAY_TARIHI ayda MIN(INCTARIHI) as ILK_OLAN_OLAY_TARIHI group tanda INCTARIHI field ını kaldırdığınızda where ile limitlenmiş sonuçlar döner.

Bir diğer konuda, ben sizin yerinizde olsam OLAY_TURU tiye bir table açar, bunu kullanıcıya açardımki istediği gibi olay türlerini detaylandırsın, daha sonra sonuç alırkende

Kod: Tümünü seç

CREATE PROCEDURE SP_OLAYTURU_TOPLAM (
    BASLANGIC_TARIHI DATE,
    BITIS_TARIHI DATE)
RETURNS (
    OLAY_TURU CHAR(25),
    ADET INTEGER)
AS
begin
for
   select  OLAY_TURU_ID, OLAYTURU
   from OLAY_TURU
   INTO :OLAY_TURU_ID,
            :OLAY_TURU
  DO
  select COUNT(ISTOLYTURU)  
   from RAPORLAR  
   where INCTARIHI between :BASLANGIC_TARIHI and :BITIS_TARIHI
         AND 
            ISTOLYTURU_ID= :OLAY_TURU_ID
    GROUP BY  ISTOLYTURU
    INTO :ADET

  SUSPEND;
end 
bu kod size daha doğrusu kullanıcıya kısıtlama getirmez. Kod yazarken yada tasarım yaparken kullanıcıyı nekadar az limitlerseniz sizin programınız okadar kullanışlı ve insanlar tarafından okadar çok beğenilen program olur, ayrıca yazdığınız program paket program halinede dönüştürülmüş olur.

Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

freeman ustam, açıklamaların için teşekkür edirim gayet güzel ve işin mantığını öğretir şekilde açıklama yaptığın içinde teşekkürler.

evet sorunumu çözdüm yazdığım sp ile artık girilen tarih aralığı içinde olay türlerinden kaç tane olduğu liste halinde dökülüyor. Ustam baştada söylemiştim aramalar sonucu gördüğüm sp lerin uyarlaması diye. inşeallah mantığını da kapmak istiyorum ve kapacağımı umuyorum.

programda önceleri dediğin gibi olay türleri gibi pekçok alanda kısıtlama vardı ve dbcombobox items lerine seçenekler girili idi. sonra söylemiş olduğun gibi baktım kısıtlıyor ve prg. setup haline dönüştürünce yapılacak değişikliklerde veya başka illerdeki başka kullanıcılar sıkıntı çekecek. bende dediğin gibi ayrı bi tablo yaparak olay türlerini oraya yazdım ve kullanıcı için bi form oluşturup dilediğinde veya veriler değiştiğinde gerekli değişikliği yapmasını sağladım. Veri giriş formlarında ise dblookupcombobox ile tablodan çekerek seçimini yapmasını ve ilgili tabloya yazmasını sağladım. böyle pek çok alanım var ayrı tablodan çekilen. burada ISTOLYTURU denilen alana girilecek veriler belli neden dersen şubece istenen aylık istatistik verilerinde bu veriler bulunuyor. yani şubeciler bu işi olayları şimdilik 11 ana başlıkta toplamışlar ve ona göre istatistik tutuyorlar. ileride değişirse kullanıcı için tablo oluşturulmuş o da güncellemesini yapabilir.

çok önce bu işe kalkışmıştım hatta soruda sormuştum ama baya kafamı karıştırmıştı ve bırakmıştım. şimdi yine yapmak istiyorum ve bir yerinden tutmalıyım bu sp leri çünki programım vt üzerine. ne kadar veri girilirse o kadar istatistiki sonuç.

yukarıda pekçok kere bahsettim. hergün olay oluyor ve biz inceliyoruz. d önüşte programa giriyoruz. ve şubece her ay istatistik isteniyor evden kaçtane oldu, işyerinde kaç tane oldu, cinayet kaçtane gibi 11 çeşit(şimdilik). bu standart olarak her ay gönderiliyor. bende her ay tek tek toplama yapacağıma tek tuşla bana sonucu versin ve formda göstersin ayrıca çıktı alabileyim. mesela 4. aydayız 5-6-7....12 aylar boş. 4 aylığı göstersin gerisini 0 göstersin veya hiç göstermesin.

aslında karmaşık bi sp yazılacak heralde. bu kadar iyisini yazamayacağım şimdiki bilgilerimle bir yerinden tutmak hasebiyle şimdilik bu kadarını yaptım

asıl amacım şu şekli elde edebilmek

Kod: Tümünü seç

aylar    evden hırsızlık   işyerinden hırsızık .....diğer    toplam
ocak            10                    10                       5         20
şubat           5                      2                         0         7
mart            3                      8                         2         13
......
aralık          2                        2                        4          8
toplam        20                      22                      11        48

sp yazarak bu tabloyu verebilecek bi sonuç almak istiyorum. inşeallah yapabilirim tabiki işin mantığını kavramak kaydı ile.

şimdiden hepinize teşekkür ederim
kolaylıklar dilerim
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
Cevapla