Koşul

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
m_ekici
Kıdemli Üye
Mesajlar: 563
Kayıt: 11 Haz 2003 06:49
Konum: Adana
İletişim:

Koşul

Mesaj gönderen m_ekici »

s.a.

Kod: Tümünü seç

CREATE FUNCTION [dbo].[INFO_F_IRS_ACKAL] ( @SofID int, @Plk Varchar(12), @Gun int, @Ay int, @Yil int, @GY int, @CY int)   
RETURNS VARCHAR(400)
AS  
BEGIN  
    DECLARE @OzlAck varchar(400)   
    SELECT @OzlAck=COALESCE(@OzlAck + ' ', '') + ISNULL(I.ACK,'') FROM INFO_IRSALIYE I WITH (NOLOCK)
	LEFT JOIN INFO_BOLUM B1 ON B1.AKNO=I.DOLMYERI
	LEFT JOIN INFO_BOLUM B2 ON B2.AKNO=I.SEVKYERI	
    WHERE I.ASOFOR=@SofID AND I.PLAKA=@Plk AND DAY(I.TARIH)=@Gun AND MONTH(I.TARIH)=@Ay AND YEAR(I.TARIH)=@Yil
    RETURN ISNULL(@OzlAck,'')
END  
yukarıdaki fonksiyona @GY veya @CY değer alabilir. sıfır da olabilir. eğer değer alırsa WHERE de işleme girmesi lazım (AND I.GYER=@GY) eğer değer yok ise WHERE koşulu etkilemesi lazım. Kafam durdu. 1 saattir uğraşıyorum olmadı. değer varsa nasıl eklerim? tşk.
Kullanıcı avatarı
m_ekici
Kıdemli Üye
Mesajlar: 563
Kayıt: 11 Haz 2003 06:49
Konum: Adana
İletişim:

Re: Koşul

Mesaj gönderen m_ekici »

yaptım ama eski usul. bunun daha kısa yolu yokmudur?

Kod: Tümünü seç

ALTER FUNCTION [dbo].[INFO_F_IRS_NAKAL] ( @SofID int, @Plk Varchar(12), @Gun int, @Ay int, @Yil int, @CY int, @VY int)   
RETURNS VARCHAR(400)
AS  
BEGIN  
    DECLARE @OzlAck varchar(400) 
    if (@CY>0)
       BEGIN
       IF (@VY>0) 
          BEGIN  	    
			SELECT @OzlAck=COALESCE(@OzlAck + ',', '') + ISNULL(B1.KADI,'')+'_'+ISNULL(B2.KADI,'')+' '+CAST(COUNT(*) AS VARCHAR(2)) FROM INFO_IRSALIYE I WITH (NOLOCK)
			LEFT JOIN INFO_BOLUM B1 ON B1.AKNO=I.DOLMYERI
			LEFT JOIN INFO_BOLUM B2 ON B2.AKNO=I.SEVKYERI	
			WHERE I.ASOFOR=@SofID AND I.PLAKA=@Plk AND DAY(I.TARIH)=@Gun AND MONTH(I.TARIH)=@Ay AND YEAR(I.TARIH)=@Yil AND @CY=I.DOLMYERI AND @VY=I.SEVKYERI
			GROUP BY B1.KADI, B2.KADI
			ORDER BY B1.KADI, B2.KADI 
          END 
          ELSE 
          BEGIN
			SELECT @OzlAck=COALESCE(@OzlAck + ',', '') + ISNULL(B1.KADI,'')+'_'+ISNULL(B2.KADI,'')+' '+CAST(COUNT(*) AS VARCHAR(2)) FROM INFO_IRSALIYE I WITH (NOLOCK)
			LEFT JOIN INFO_BOLUM B1 ON B1.AKNO=I.DOLMYERI
			LEFT JOIN INFO_BOLUM B2 ON B2.AKNO=I.SEVKYERI	
			WHERE I.ASOFOR=@SofID AND I.PLAKA=@Plk AND DAY(I.TARIH)=@Gun AND MONTH(I.TARIH)=@Ay AND YEAR(I.TARIH)=@Yil AND @CY=I.DOLMYERI 
			GROUP BY B1.KADI, B2.KADI
			ORDER BY B1.KADI, B2.KADI 
          END
       END
     ELSE 
       BEGIN
       if (@VY>0) 
          BEGIN 
			SELECT @OzlAck=COALESCE(@OzlAck + ',', '') + ISNULL(B1.KADI,'')+'_'+ISNULL(B2.KADI,'')+' '+CAST(COUNT(*) AS VARCHAR(2)) FROM INFO_IRSALIYE I WITH (NOLOCK)
			LEFT JOIN INFO_BOLUM B1 ON B1.AKNO=I.DOLMYERI
			LEFT JOIN INFO_BOLUM B2 ON B2.AKNO=I.SEVKYERI	
			WHERE I.ASOFOR=@SofID AND I.PLAKA=@Plk AND DAY(I.TARIH)=@Gun AND MONTH(I.TARIH)=@Ay AND YEAR(I.TARIH)=@Yil AND @VY=I.SEVKYERI
			GROUP BY B1.KADI, B2.KADI
			ORDER BY B1.KADI, B2.KADI 
          END
			ELSE
          BEGIN
			SELECT @OzlAck=COALESCE(@OzlAck + ',', '') + ISNULL(B1.KADI,'')+'_'+ISNULL(B2.KADI,'')+' '+CAST(COUNT(*) AS VARCHAR(2)) FROM INFO_IRSALIYE I WITH (NOLOCK)
			LEFT JOIN INFO_BOLUM B1 ON B1.AKNO=I.DOLMYERI
			LEFT JOIN INFO_BOLUM B2 ON B2.AKNO=I.SEVKYERI	
			WHERE I.ASOFOR=@SofID AND I.PLAKA=@Plk AND DAY(I.TARIH)=@Gun AND MONTH(I.TARIH)=@Ay AND YEAR(I.TARIH)=@Yil
			GROUP BY B1.KADI, B2.KADI
			ORDER BY B1.KADI, B2.KADI 
          END		
      END 
    RETURN ISNULL(@OzlAck,'')
END  
Kullanıcı avatarı
unicorn64
Üye
Mesajlar: 919
Kayıt: 04 Nis 2006 08:56
Konum: yine yeniden Ankara ^_^

Re: Koşul

Mesaj gönderen unicorn64 »

aklıma gelen 2 yöntem var...
1. sql i delphide oluşturur gibi varchar bir değişken üzerinden oluşturup parametreleri gelen değere göre sqle ekleyip kullanmak,

Kod: Tümünü seç

DECLARE @sql varchar(max); 

execute statement @sql;

//yada

execute sp_exec_sql(@sql);
gibi bir kullanımı vardı...

2. where şartında parametre 0 ken or kullanarak bypass etme...

Kod: Tümünü seç

SELECT @OzlAck=COALESCE(@OzlAck + ',', '') + ISNULL(B1.KADI,'')+'_'+ISNULL(B2.KADI,'')+' '+CAST(COUNT(*) AS VARCHAR(2)) FROM INFO_IRSALIYE I WITH (NOLOCK)
LEFT JOIN INFO_BOLUM B1 ON B1.AKNO=I.DOLMYERI
LEFT JOIN INFO_BOLUM B2 ON B2.AKNO=I.SEVKYERI   
WHERE I.ASOFOR=@SofID AND I.PLAKA=@Plk AND DAY(I.TARIH)=@Gun AND MONTH(I.TARIH)=@Ay AND YEAR(I.TARIH)=@Yil AND 

--@CY 0 sa I.DOLMYERI ne kısıt vermemiş olursunuz, farklı bir değer varsa kısıtlanmış olur
((@CY=I.DOLMYERI) or (@CY=0)) AND 
--@VY 0 sa I.SEVKYERI ne kısıt vermemiş olursunuz, farklı bir değer varsa kısıtlanmış olur
((@VY=I.SEVKYERI) or (@VY=0))

GROUP BY B1.KADI, B2.KADI
ORDER BY B1.KADI, B2.KADI 


bazen yükselmek için önce dibi görmek gerekir...

forumda soru sormadan önce bakılmalı bence
daha fazlası için...

yürümeyi öğrenmeden koşmaya çalışanlar için, tökezleyip düşmek kaçınılmazdır...

Resim
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Koşul

Mesaj gönderen sabanakman »

Fonksiyonlarda yanlış hatırlamıyorsam string bilgiden sorgu çalıştırmıyor hata veriyordu. Zaten en temizi or ile şart verilmesidir :mrgreen: Mesela

Kod: Tümünü seç

...AND @CY=I.DOLMYERI AND @VY=I.SEVKYERI
şartı yerine

Kod: Tümünü seç

AND (COALESCE(@CY,0)=0 or @CY=I.DOLMYERI) AND (COALESCE(@VY,0)=0 or @VY=I.SEVKYERI)
şartı vermek yeterli olacaktır..
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
Rew33
Üye
Mesajlar: 70
Kayıt: 10 Tem 2009 02:28

Re: Koşul

Mesaj gönderen Rew33 »

şaban beyin söylediklerine ek olarak
where cümleciğini şu şekilde yazarsan işini görür
where (:Param1 IS NULL OR LTRIM(RTRIM(:param1))='' OR param1=:param1) and (:Param2 IS NULL OR LTRIM(RTRIM(:param2))='' OR param2=:param2)and .....

burda delphi den gönderdiğin parametre NULL ise parantez içerisindeki diğer koşullara bakmadan ikinci paranteze geçer,eğer delphi den gönderdiğin değer NULL değilse
bu sefer de boş olma ihtimali var onu da kontrol ediyor,eğer delphi den gelen parametre boş ta değil ise o zaman tablodaki ilgili field ile eşleşiyor
bu işlemi istediğin kadar field' e uygulayabilirsin.
Kimseye hiçbir şey öğretemem, sadece onların düşünmelerini sağlayabilirim.
SOKRATES
Cevapla