stored procedure de şart null ise sorgu dışı bırakma

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
yusuf simsek
Üye
Mesajlar: 330
Kayıt: 09 Mar 2004 11:18
Konum: Konya
İletişim:

stored procedure de şart null ise sorgu dışı bırakma

Mesaj gönderen yusuf simsek »

iyi çalışmalar.

Kod: Tümünü seç

FOR
        SELECT sh.islemtur, sk.ukod, sk.uad, sk.barkod, sk.umarka, sk.ugrup, sk.usinif, sk.ubirim, sh.tarih, sh.aadet, sh.afiyat, sh.sadet,  sh.ukdv
        FROM skart sk INNER JOIN shareket sh
        ON  (sk.ukod = sh.ukod)

        WHERE  islemtur =:iislemtur  AND sh.ukod =:iurunkod AND sk.barkod =:ibarkod AND sk.uad =:iurunad AND sk.umarka =:iumarka AND sk.ugrup =:iugrup AND sk.usinif =:iusinif

        into :oislemtur, :oukod, :ouad, :obarkod, :omarka, :ogrup, :osinif, :obirim, :otarih,   :oaadet, :oafiyat, :oukdv
    do
      begin
        suspend;
      end


SP içerisinde sorgulama şartları bazen NULL olabiliyor.

delphi üzerinde

Kod: Tümünü seç

          if EUkod.Text <> '' then
            begin
              SQL.Add('AND UKOD =:UKOD ');
              ParamByName('UKOD').AsString := EUkod.Text;
            end;
          if Ebarkod.Text <> '' then
            begin
              SQL.Add('AND BARKOD =:BARKOD ');
              ParamByName('BARKOD').AsInteger := StrToInt(Ebarkod.Text);
            end;
bu şekilde sorunsuz bir şekilde çözebiliyorum...

SP içerisinde NULL olan parametreleri sorgulama kriterleri dışında bırakabilirmiyiz?
Bugün bir kez daha,
Hiç Birşey Bilmediğimi Öğrendim!!!

https://extrayazilim.com
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Kod: Tümünü seç

...
where degisken is null ...
veya

Kod: Tümünü seç

...
where degisken is not null ...
şeklinde kullanabilirsin. Ayrıca SP içinde de;

Kod: Tümünü seç

 if (Degisken is null) then sayi = sayi + 1 else sayi = sayi - 1;
if (Degisken is not null) then sayi = sayi + 1 else sayi = sayi - 1;
şeklinde kullanabilirsin :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
yusuf simsek
Üye
Mesajlar: 330
Kayıt: 09 Mar 2004 11:18
Konum: Konya
İletişim:

Mesaj gönderen yusuf simsek »

hocam teşekkür ederim.

ancak where sorgulaması içerisinde IF...THEN şartı kullanamıyorum.

başka bir yol yokmu acaba... :oops:
Bugün bir kez daha,
Hiç Birşey Bilmediğimi Öğrendim!!!

https://extrayazilim.com
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

COALESCE ve/veya CASE WHEN ... ELSE ... END işinizi görecektir.

Her ikisini de her yerde kullanabiliyorsunuz.

İyi çalışmalar.
yusuf simsek
Üye
Mesajlar: 330
Kayıt: 09 Mar 2004 11:18
Konum: Konya
İletişim:

Mesaj gönderen yusuf simsek »

sorunu yanlış dile getirdim.

NULL olan alanlar SORGU ŞARTLARI,

Kod: Tümünü seç

WHERE  islemtur =:iislemtur  
if iurunkod <> null then
AND sh.ukod =:iurunkod 
if ibarkod <> null then
AND sk.barkod =:ibarkod 
if iurunad <> null then
AND sk.uad =:iurunad .... 
bu şekilde bir kodlama yapmam gerekiyor ama IF...THEN veya CASE WHEN.. gibi bir kodlama olmuyor...

bu gibi bir işlem yapabilirmiyim?
Bugün bir kez daha,
Hiç Birşey Bilmediğimi Öğrendim!!!

https://extrayazilim.com
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Şu şekilde işinizi görmesi gerek :wink:

Kod: Tümünü seç

WHERE islemtur =:iislemtur 
  AND (iurunkod IS NULL OR sh.ukod =:iurunkod)
  AND (ibarkod IS NULL OR sk.barkod =:ibarkod)
  AND (iurunad IS NULL OR sk.uad =:iurunad) ...
Dikkat edilirse burada ;

Kod: Tümünü seç

  AND (iurunkod IS NULL OR sh.ukod =:iurunkod)
IS NULL demek NULL değilse satırı yapmak istediğinizdeki gibi;

Kod: Tümünü seç

AND sh.ukod =:iurunkod
şekline getiriyor :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

yusuf simsek yazdı:sorunu yanlış dile getirdim.

NULL olan alanlar SORGU ŞARTLARI,

Kod: Tümünü seç

WHERE  islemtur =:iislemtur  
if iurunkod <> null then
AND sh.ukod =:iurunkod 
if ibarkod <> null then
AND sk.barkod =:ibarkod 
if iurunad <> null then
AND sk.uad =:iurunad .... 
bu şekilde bir kodlama yapmam gerekiyor ama IF...THEN veya CASE WHEN.. gibi bir kodlama olmuyor...

bu gibi bir işlem yapabilirmiyim?
CASE WHEN kullanmasını bilmezsen olmaz tabiki. Şöyle kullanmalısın:

Kod: Tümünü seç

WHERE  islemtur =:iislemtur
AND sh.ukod = CASE WHEN iurunkod IS NULL THEN sh.ukod ELSE :iurunkod END
AND sk.barkod = CASE WHEN iurunkod IS NULL THEN sk.barkod ELSE :ibarkod END
AND sk.uad = CASE WHEN iurunkod IS NULL THEN sk.uad ELSE :iurunad END
İyi çalışmalar.
yusuf simsek
Üye
Mesajlar: 330
Kayıt: 09 Mar 2004 11:18
Konum: Konya
İletişim:

Mesaj gönderen yusuf simsek »

RECEP Hocam ve Hakan arkadaşım. Çok teşekkür ederim.

IS NULL ve CASE WHEN yapısını ve kullanım şeklini öğrenmiş oldum :D

her iki yoluda denedim ama her iki yolda da sorun çözülmedi, kendi denemelerimde hezimetle sonuçlandı...

Her iki yolda da
Column does not belong to referenced table.
hatasını veriyor.

AND sk.ukod = CASE WHEN iurunkod IS NULL THEN sk.ukod ELSE :iurunkod END

AND (iurunkod IS NULL OR sh.ukod =:iurunkod)

her iki işlemde de burada takılıyor.
input değişkenler ile tablo field yapıları aynı... sıkıntıyı anlayamadım ama AND satırı içerisinde tek başına INPUT değerleri kullanamıyorum :(
Bugün bir kez daha,
Hiç Birşey Bilmediğimi Öğrendim!!!

https://extrayazilim.com
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

İlk yazdığından kopyalayıp yaptığımdan iki noktası eksik olmuş.

Kod: Tümünü seç

AND (iurunkod IS NULL OR sh.ukod =:iurunkod) 
yerine;

Kod: Tümünü seç

AND (:iurunkod IS NULL OR sh.ukod = :iurunkod) 
şeklinde dene :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
yusuf simsek
Üye
Mesajlar: 330
Kayıt: 09 Mar 2004 11:18
Konum: Konya
İletişim:

Mesaj gönderen yusuf simsek »

:lol: :lol:

RECEP HOCAM bi yerde bişeylerin eksik olduğunu biliyordum.

Siz yazarsınısda çalışmasmı hiç :lol:

Kod: Tümünü seç

    FOR
        SELECT sh.islemtur, sk.ukod, sk.uad, sk.barkod, sk.umarka, sk.ugrup, sk.usinif, sk.ubirim, sh.tarih,
            sh.aadet, sh.afiyat, sh.sadet, sh.sfiyat, sh.isk1, sh.isk2, sh.isk3, sh.isk4, sh.isk5, sh.ukdv, sh.toplam
        FROM skart sk INNER JOIN shareket sh
        ON  (sk.ukod = sh.ukod)


        WHERE islemtur =:iislemtur
        AND (:iurunkod IS NULL OR sk.ukod =:iurunkod)
        AND (:ibarkod IS NULL OR sk.barkod =:ibarkod)
        AND (:iurunad IS NULL OR sk.uad =:iurunad)
        AND (:iumarka IS NULL OR sk.umarka =:iumarka)
        AND (:iugrup IS NULL OR sk.ugrup =:iugrup )
        AND (:iusinif IS NULL OR  sk.usinif =:iusinif)

          /*  WHERE islemtur =:iislemtur AND sh.ukod =:iurunkod AND sk.barkod =:ibarkod
            AND sk.uad =:iurunad AND sk.umarka =:iumarka AND sk.ugrup =:iugrup AND sk.usinif =:iusinif
        */
        into :oislemtur, :oukod, :ouad, :obarkod, :omarka, :ogrup, :osinif, :obirim, :otarih,
        :oaadet, :oafiyat, :osadet, :osfiyat, :oisk1,:oisk2,:oisk3,:oisk4,:oisk5, :oukdv, :otoplam
    do
      begin
        suspend;
      end
bu şekilde delphiden eksik bilgi ile istenildiği gibi rapor alınabiliyor.

Yardımlarından dolayı özellikle RECEP HOCAMA ve HAKAN arkadaşıma çok teşekkür ederim.
Bugün bir kez daha,
Hiç Birşey Bilmediğimi Öğrendim!!!

https://extrayazilim.com
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Kolay gelsin :)
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
yusuf simsek
Üye
Mesajlar: 330
Kayıt: 09 Mar 2004 11:18
Konum: Konya
İletişim:

Mesaj gönderen yusuf simsek »

s.a.

yukarıda belirtmemiştim, yolu bulunca sıkıntıyı çözeriz diye ama işin içinden gebe çıkamadım :oops:

gene kullanıcı seçimine göre TEK TARİH için veya İKİ TARİH ARALIĞI için değer döndermesi gerekiyor

Kod: Tümünü seç

WHERE islemtur =:iislemtur
AND (:itarih1 IS NOT NULL AND :itarih2 IS NOT NULL AND sh.tarih between :itarih1 and :itarih2 )
AND (:itarih1 IS NOT NULL AND :itarih2 IS NULL OR sh.tarih =:itarih1 )

Aklıma gelen ve olabilecekleri denedim.

AND terine OR kullanıtsam tüm TARIH ARALIĞINA göre değer döndermiyor, Tek tarih için değer döndermiyor ama 2 tarih için sorgulama yaptığımda BİRİNCİ TARİH PARAMETRESİ içindeki değeri dönderiyor...

ayrıca CASE WHEN ile denediğimde de iki tarih aralığı için parametreleri kabul etmiyor.

bu işin doğru yolu nasıldır acaba :?:
Bugün bir kez daha,
Hiç Birşey Bilmediğimi Öğrendim!!!

https://extrayazilim.com
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Kardeş anladığım kadarıyla sorguya iki tarih parametresi gönderiyorsun. Ve tarihler null olabiliyor. Ben şahsen NULL ise o parametreyi kale alma diye aşağıdaki gibi yazıyorum :wink:

Kod: Tümünü seç

WHERE islemtur =:iislemtur
  AND (:itarih1 IS NOT NULL OR sh.tarih >= :itarih1)
  AND (:itarih2 IS NOT NULL OR sh.tarih <= :itarih2)
Açıklamasını da karalayalım bari :wink: İlk satırda birinci parametre null ise veya bir değer/tarih verilmişse tablodaki tarih o tarihten büyük veya eşit olma durumunda. Ve ikinci tarih null ise veya ikinci tarih verilmiş ise tablodaki tarih o tarihten küçük eşit olma durumunda kayıt döndür.
Kusura bakılmasın, basitte olsa bazen insanın kafasını karıştırabiliyor. Bu, aralıklı sorgulamada çok işe yarayan bir kalıptır :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
yusuf simsek
Üye
Mesajlar: 330
Kayıt: 09 Mar 2004 11:18
Konum: Konya
İletişim:

Mesaj gönderen yusuf simsek »

Kod: Tümünü seç

 
WHERE islemtur =:iislemtur 
  AND (:itarih1 IS NOT NULL OR sh.tarih = :itarih1) 
  AND (:itarih2 IS NOT NULL OR sh.tarih <= :itarih2) 
hocam birinci satırdan " > " şartını kaldırdım ve tam istediğim oldu :lol: :lol:

sabahtan beri kasıyom, ve zor olanı aramaktan basit PÜF NOKTALARINI göremiyorz :oops:

Recep Hocam çok teşekkür ettim. ELİNİZE SAĞLIK :D
Bugün bir kez daha,
Hiç Birşey Bilmediğimi Öğrendim!!!

https://extrayazilim.com
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Rica ederim de bir yanlışlık olmasın. İki tarih arasındaki kayıtları arıyorsan büyük eşit durumunda kalmalı :idea: Yoksa ilk tarihten küçük olanlar da sh.tarih <= :itarih2 işlemine bağlı olarak gözükecektir :!:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Cevapla