FireBird+Delphi+Where problemi

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Kilitli
habilkader
Üye
Mesajlar: 61
Kayıt: 14 Eki 2006 11:11

FireBird+Delphi+Where problemi

Mesaj gönderen habilkader »

S.A şöyle bi problemim var

şimdi firebirdde SP_SORGU adında SP yazalım

Kod: Tümünü seç

Select StokKodu, miktar, SatısFiyatı From Stokhareketi 
daha sonra delphi tarafında bu SP yi şu şekilde çağırabiliyorum

Kod: Tümünü seç

IBQuery.SQL.Text:='Select * from SP_Sorgu'; 
IBQuery.open; 
burda sorun yok şimdi aynı SP yi birde şöyle çağırayım

Kod: Tümünü seç

IBQuery.SQL.Text:='Select * from SP_Sorgu Where StokKodu='ST001''; 
IBQuery.open; 
where ifadesindeki STOKKODU alanı SP içinde seçili olduğu için Stokkodu alanını delphi tarafında sorgulayabiliyorum bundada sorun yok.

şimdi SP yi biraz değiştireyim ve yeni SP aşağıdaki gibi olsun
her stoğun ayrı ayrı satış tutarlarını bulsun

Kod: Tümünü seç

Select StokKodu, Sum(Miktar*Fiyatı) as Tutar From Stokhareketi 
group by StokKodu 
şimdi delphi tarafında SP mi çağırıyorum

Kod: Tümünü seç

IBQuery.SQL.Text:='Select * from SP_Sorgu '; 
IBQuery.open; 
burda da sorun yok herşey güzel.
Ancak form üzerinde bir Checkbox ve 2 adette Maskedit var, kullanıcı isterse Checboxı işaretleyerek maskeditlere 2 tarih girip bu 2 tarih arasındaki hareketlerin tutarlarını görmek isteyebilir. bu durumda delphi tarafından SP yi şöyle çağıyorum

Kod: Tümünü seç

IBQuery.SQL.Text:='Select * from SP_Sorgu where Tarih between :Tar1 and :tar2'; 
IBQuery.open; 
ancak SP içinde Tarih alanı seçilmemiş olduğundan hata alıyorum.
SP içinde Tarih alanını seçersem bu kezde tarihe görede Group by ile Tarih alanını gruplama yapmam gerekecek ki bu sefer yanlış sonuç kümesi dönecek.

Sonuç:
SP de Select ile seçilmemiş bir alan Delphi tarafından Where ile karşılaştırlamıyor.
SP tarafında eğer o alanı seçersem ki SUM kullnıyorsam o alanı gruplamam da gerekecek, gruplarsam yanlış bir sonuç kümesi dönüyor.

Tarih bilgilerini parametre olarak SP ye aktararak yapmaya kalkarsam bu kez de kullnıcı tarih seçimi yapmaz kayıtların tamamını görmek isterse tarih değerleri SP ye null olarak döner ve ve yine hata alırım.

geriye tek bir çözüm kalıyor SP yi çöpe atıp delphi tarafından SQL kodlarla yapmak.
bu durumda da SP kullanmayarak performansı düşürmüş olacağız
bir türlü işin içinden çıkamadım lütfen yardım.
Kullanıcı avatarı
cihan
Üye
Mesajlar: 65
Kayıt: 02 Ağu 2005 03:34

Re: FireBird+Delphi+Where problemi

Mesaj gönderen cihan »

habilkader yazdı:S.A şöyle bi problemim var

şimdi firebirdde SP_SORGU adında SP yazalım

Kod: Tümünü seç

Select StokKodu, miktar, SatısFiyatı From Stokhareketi 
daha sonra delphi tarafında bu SP yi şu şekilde çağırabiliyorum

Kod: Tümünü seç

IBQuery.SQL.Text:='Select * from SP_Sorgu'; 
IBQuery.open; 
burda sorun yok şimdi aynı SP yi birde şöyle çağırayım

Kod: Tümünü seç

IBQuery.SQL.Text:='Select * from SP_Sorgu Where StokKodu='ST001''; 
IBQuery.open; 
where ifadesindeki STOKKODU alanı SP içinde seçili olduğu için Stokkodu alanını delphi tarafında sorgulayabiliyorum bundada sorun yok.

şimdi SP yi biraz değiştireyim ve yeni SP aşağıdaki gibi olsun
her stoğun ayrı ayrı satış tutarlarını bulsun

Kod: Tümünü seç

Select StokKodu, Sum(Miktar*Fiyatı) as Tutar From Stokhareketi 
group by StokKodu 
şimdi delphi tarafında SP mi çağırıyorum

Kod: Tümünü seç

IBQuery.SQL.Text:='Select * from SP_Sorgu '; 
IBQuery.open; 
burda da sorun yok herşey güzel.
Ancak form üzerinde bir Checkbox ve 2 adette Maskedit var, kullanıcı isterse Checboxı işaretleyerek maskeditlere 2 tarih girip bu 2 tarih arasındaki hareketlerin tutarlarını görmek isteyebilir. bu durumda delphi tarafından SP yi şöyle çağıyorum

Kod: Tümünü seç

IBQuery.SQL.Text:='Select * from SP_Sorgu where Tarih between :Tar1 and :tar2'; 
IBQuery.open; 
ancak SP içinde Tarih alanı seçilmemiş olduğundan hata alıyorum.
SP içinde Tarih alanını seçersem bu kezde tarihe görede Group by ile Tarih alanını gruplama yapmam gerekecek ki bu sefer yanlış sonuç kümesi dönecek.

Sonuç:
SP de Select ile seçilmemiş bir alan Delphi tarafından Where ile karşılaştırlamıyor.
SP tarafında eğer o alanı seçersem ki SUM kullnıyorsam o alanı gruplamam da gerekecek, gruplarsam yanlış bir sonuç kümesi dönüyor.

Tarih bilgilerini parametre olarak SP ye aktararak yapmaya kalkarsam bu kez de kullnıcı tarih seçimi yapmaz kayıtların tamamını görmek isterse tarih değerleri SP ye null olarak döner ve ve yine hata alırım.

geriye tek bir çözüm kalıyor SP yi çöpe atıp delphi tarafından SQL kodlarla yapmak.
bu durumda da SP kullanmayarak performansı düşürmüş olacağız
bir türlü işin içinden çıkamadım lütfen yardım.
sp içinde yapabilirsin

3 tane parametre tanımlarsın
stokkodu,tar1,ve tar2 diye

if dersin stokkodu,tar1ve tar2 null ise genel selecti çalıştırırsın
if dersin stokkodu not null ise ve tar1,tar2 nul ise stok kodu ile ilgili selecti çalıştırırsın
if dersin stokkodu null ve tar1,tar2 not null ise tarih aralığına göre selecti çalıştırırsın
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

O prosedürden elde ettiğin sonucu bir tabloymuş gibi farzedersen gelen hata normal olacaktır. Bu tıpkı bir tablonun olmayan alanına şart vermek gibi bir durum olsa gerek.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
madem stored procedure kullanıyorsun o zaman koşullarını input parametresi olarak gönder.
o zaman select sql in şu şekilde olacak

Kod: Tümünü seç

select * from benim_sp(:param1,:param2...:paramN)
sp nin içinde select sql kısmında ise where input parametrelerini koyacaksın.

Kod: Tümünü seç

where 
((tarih>=:ip_tarih1) or (:ip_tarih1 is null)) and
((tarih<=:ip_tarih2) or (:ip_tarih2 is null)) and
((stokkodu=:ip_stokkodu) or (:ip_stokkodu='')) and
((birimid=:ip_birimid) or (:ip_birimid=-1))
.....
umarım anlatabilmişimdir.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Aynı soruya iki başlık açmayalım :idea:
viewtopic.php?t=22006
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kilitli