iki tarih arasında 0 dan büyük değer alan alanları toplama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

Yok recep abi estağfurullah haddimiz değil. Daha emekleme çağındayız. Hatta onu bile yapamıyoruz. Bizimkisi çocukça bir sevinç işte. Paylaşmak istedim. Bir şey yapabiliyorsak sizlerin eseri, yok beceremiyorsak bizim beceriksizliğimizdir.

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

Mesaj gönderen bobasturk »

Acemiliğime verin bu sp yi tek alan için önceki verdiğim şekilde yazdım. ama acemilikle dokuz sp yazdım. bu gün tekrar üzerine düştüm ve tek sp ile bu dokuz alanı sorguluyor ve sonuç alıyorum. her hangi bir sakıncası varmı?

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ı
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_ISTOLYTURU_SAY (
    TARIH1 DATE,
    TARIH2 DATE)
RETURNS (
    EVDEN_ADET INTEGER,
    ISYERI_ADET INTEGER,
    OTODAN_ADET INTEGER,
    OTOHIR_ADET INTEGER,
    CINAYET_ADET INTEGER,
    YARALAMA_ADET INTEGER,
    MOLOTOF_ADET INTEGER,
    INTIHAR_ADET INTEGER,
    SUPOLUM_ADET INTEGER,
    GASP_ADET INTEGER,
    DIGER_ADET INTEGER)
AS
begin
  /* Procedure Text */
  SELECT COUNT(ISTOLYTURU) from raporlar
  WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='EVDEN HIRSIZLIK'
  into :evden_adet;

  SELECT COUNT(ISTOLYTURU) from raporlar
  WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='İŞYERİNDEN HIRSIZLIK'
  into :isyeri_adet;

  SELECT COUNT(ISTOLYTURU) from raporlar
  WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='OTODAN HIRSIZLIK'
  into :otodan_adet;

  SELECT COUNT(ISTOLYTURU) from raporlar
  WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='OTO HIRSIZLIĞI (TERK OTO)'
  into :otohir_adet;

  SELECT COUNT(ISTOLYTURU) from raporlar
  WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='CİNAYET'
  into :cinayet_adet;

  SELECT COUNT(ISTOLYTURU) from raporlar
  WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='YARALAMA'
  into :yaralama_adet;

  SELECT COUNT(ISTOLYTURU) from raporlar
  WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='MOLOTOF'
  into :molotof_adet;

  SELECT COUNT(ISTOLYTURU) from raporlar
  WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='İNTİHAR'
  into :intihar_adet;

  SELECT COUNT(ISTOLYTURU) from raporlar
  WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='ŞÜPHELİ ÖLÜM'
  into :supolum_adet;

  SELECT COUNT(ISTOLYTURU) from raporlar
  WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='GASP'
  into :gasp_adet;

  SELECT COUNT(ISTOLYTURU) from raporlar
  WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='DİĞER'
  into :diger_adet;

  suspend;
end
delphi tarafı ise

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
  ibquery1.Close;
  ibquery1.ParamByName('TARIH1').AsDate:=datetimepicker1.Date;
  ibquery1.ParamByName('TARIH2').AsDate:=datetimepicker2.Date;
  ibquery1.Open;
end;
aslında sp kullanımı açısından konu veri tabanı forumunu ilgilendiriyor ama konu burada geçtiği için devam ediyorum. yukarıdaki gibi on bir alan sonucunu tek sp ile alıyorum. delphi tarafında ise bir query içinde sql satırına sp yi yazdıktan sonra button ile parametre verip açıyorum sonucu veriyor.

ustalarımın tavsiyelerinde sp ile yap 9 query ile delphi tarafında göster tavsiyeleri üzerine kafam karıştı. tek query ile olursa sorunmu olur ilerde veriler çoğaldıkça yoksa bir sorun olmazmı. modul ler içine beleşen doldurmak istemiyorum açıkçası. 1 query=9 query

kola 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ı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Hocam güzel olmuş.

Kod: Tümünü seç

  SELECT COUNT(ISTOLYTURU) from raporlar
  WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU='EVDEN HIRSIZLIK'
  into :evden_adet; 
burada hiç kayıt dönmez ise;

Kod: Tümünü seç

IF (evden_adet IS NULL) THEN evden_adet = 0; -- yada işi uzatmadan select içinde COALESCE(COUNT(ISTOLYTURU), 0) from ... şeklinde 
şeklinde her sorgunun altına ekleyebilirsin. Bir de ISTOLYTURU='EVDEN HIRSIZLIK' dediğin yerde yazım farkından dolayı hatalar çıkabilir. Bu ibareleri bir tabloya bağlayıp, bunlara 10,20, 30 ... diye numara versen hem yoğun kayıtlarda hız artar hem de hata oranı düşer :idea:

Kod: Tümünü seç

SELECT COUNT(ISTOLYTURU) FROM RAPORLAR
WHERE INCTARIHI BETWEEN :TARIH1 AND :TARIH2 AND ISTOLYTURU = 10 -- 'EVDEN HIRSIZLIK'
INTO :EVDEN_ADET;
şeklinde :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

Merhaba,

@Recep ustam tavsiyene katılıyorum bilgisayarlar rakamı sever. Ben bu evden, işyerinden.... gibi isimleri bir tabloda tutuyorum ve kullanıcı lookupcombo dan benim veya yöneticinin yazdığı şekilden başka giremiyor. yani bu suç türleri önceden belirlenip tabloya yazılıyor. ilgili formdada lookup ile kayıt çekilerek kullanıcının seçmesi sağlanıyor. Ama sizin fikriniz hoşuma gitti ve bunu uygulayacağım.

Teşekkür ederim.
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
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Aslında problem çözüldü gibi görünüyor ama ben çözümün normalin biraz dışında olduğunu düşünüyor ve farklı iki bakış açısı getirmek istiyorum.

Öncelikle başlangıçta PARMAK_IZI sayısal bir alan, NOT NULL tanımlanmış ve 0' dan farklı olanlarının COUNT' ları alınıyordu.
Eğer bu ve diğer COUNT' ları alınacak alanları NOT NULL tanımlamamış olsaydınız, basit bir SELECT komutu ile istediğinizi elde edebilirdiniz:

SELECT COUNT(PARMAK_IZI) AS PARMAK, COUNT(AYAK_IZI) AS AYAK, ... FROM RAPORLAR WHERE ...

Burada 0 girmenize gerek kalmayacak ve NULL bırakacaktınız. Sonuçta COUNT() fonksiyonu NULL' ları dikkate almıyor. Adamdan saymıyor :lol:.


İkinci olarak da niye tek bir Query ile yapabileceğiniz bir işi veritabanında STORED PROCEDURE yazarak yapıyorsunuz?

Örneğin şuna benzer bir Query ile istediğiniz sonuca ulaşabilirsiniz:

Kod: Tümünü seç

SELECT
  SUM(CASE WHEN PARMAK_IZI > 0 THEN 1.0 ELSE 0.0 END) AS PARMAK,
  SUM(CASE WHEN AYAK_IZI > 0 THEN 1.0 ELSE 0.0 END) AS AYAK,
  .
  .
  .
FROM RAPORLAR
WHERE ...
Bu mantığı en son yapılan STORED PROCEDURE de uygulayabilirsiniz.

İyi çalışmalar.
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

merhaba,

@Hakan ustam, birinci önerinde haklısın ve count işleminde not null alanları hesaba katmadığını öğrenmiş oldum teşekkürler.

İkinci önerinde @Mege ustamın önerisi ile önce query tarafında işlemi çözmüştüm. Önceki yazılarda bunun kodunu vermiştim. Ustalarımın ve daha önce vt tarafında okuduğum yazı ve makalelerde raporlama işlemlerinin vt tarafında sp ile yapılmasının daha faydalı olacağı vurgulanması üzerine sp seçimini yaptım. Dediğiniz gibi delphi tarafında bir query ile sonuç alınabiliyor.

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
Cevapla