Null alanları sorguya dahil etmek

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
NewMember
Üye
Mesajlar: 990
Kayıt: 29 Haz 2005 06:57
Konum: Bursa

Null alanları sorguya dahil etmek

Mesaj gönderen NewMember »

Arkadaşlar aşağıdaki gibi bir SQL komutum var

Kod: Tümünü seç

procedure TFrmCariHesaplari.YekunHesapla;
var MyQuerySQLCumlesi: widestring;
     MyQuery: TIBQuery;
    aramaparametre3, MyGroupBySQL: string;
begin
  aramaparametre3 := TurkceKarakterAyarla(CMBCariler.Text);
  MyQuerySQLCumlesi := 'SELECT '
    + 'SUM(BORC) AS BORCTOPLAMI'
    + ',SUM(ALACAK) AS ALACAKTOPLAMI'
    + ' FROM CARIHESAPLAR';
  MyGroupBySQL := ' GROUP BY '
    + 'CARIHESAPLAR.GONDERENCARI,CARIHESAPLAR.TAKIPDURUMU';
  MyQuery := TIBQuery.Create(Self);
  MyQuery.Database := dm.IBDatabase1;
try
   MyQuery.SQL.Clear;
  MyQuery.SQL.Text := MyQuerySQLCumlesi
    + ' WHERE GONDERENCARI=:PARGONDERENCARI AND TAKIPDURUMU<>:MYYITIK'
    + MyGroupBySQL;
  MyQuery.ParamByName('MYYITIK').AsSTRING := TurkceKarakterAyarla('YİTİK HESAP');
  MyQuery.ParamByName('PARGONDERENCARI').AsString := aramaparametre3;
  MyQuery.Open;
finally
MyQuery.free;
end;
end;
Şimdi şöyle bir sorun oluyor.Eğer takipdurumu adlı alan null değer içeriyorsa burada hesaplamaya dahil olmuyor.

örnekle açıklayacak olursak

Hatalı hesaplama
GONDERENCARI TAKIPDURUMU BORC ALACAK
ABC HOLDING BEKLEMEDE 200 0
ABC HOLDING NULL 0 200


SONUÇ------>

GONDERENCARI BORCTOPLAMI ALACAKTOPLAMI
ABC HOLDING 200 0

Doğru hesaplama
GONDERENCARI TAKIPDURUMU BORC ALACAK
ABC HOLDING BEKLEMEDE 200 0
ABC HOLDING ODENDI 0 200


SONUÇ------>

GONDERENCARI BORCTOPLAMI ALACAKTOPLAMI
ABC HOLDING 200 200
Bunu aşmak için ne yapmalıyız.Şimdi şöyle söyleebilirsiniz.Veritabanında önemli alanların null kalmasına izin verme.
Genelde bunu apmaya çalışıorum ama şu halde bu sorunu yapmak için ne gibi bir kod kullanmalıyız.Bilgisi olan arkadaşların yardımlarını bekliyorum.Teşekkürler....
Ertugrul
Üye
Mesajlar: 136
Kayıt: 09 May 2009 12:05

Re: Null alanları sorguya dahil etmek

Mesaj gönderen Ertugrul »

Bu sekilde bir deneyin, yalniz isnull fonksiyonu SQL Server icin. Kullandiginiz veritabaninda farkli isme sahip olabilir.

Kod: Tümünü seç

 SELECT SUM(ISNULL(BORC,0)) AS BORCTOPLAMI  ,SUM(ISNULL(ALACAK,0)) AS ALACAKTOPLAMI   FROM CARIHESAPLAR
   GROUP BY CARIHESAPLAR.GONDERENCARI,CARIHESAPLAR.TAKIPDURUMU
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: Null alanları sorguya dahil etmek

Mesaj gönderen sabanakman »

SQL sorgularda Null değerler dikkate alınmıyor ve where şartı verirken daima Null yerine geçecek varsayılan bir değer belirmelisin. Bu isNull (coalesce) ile yapılabilir.

Kod: Tümünü seç

procedure TFrmCariHesaplari.YekunHesapla;
var MyQuerySQLCumlesi: widestring;
     MyQuery: TIBQuery;
    aramaparametre3, MyGroupBySQL: string;
begin
  aramaparametre3 := TurkceKarakterAyarla(CMBCariler.Text);
  MyQuerySQLCumlesi := 'SELECT '
    + 'SUM(BORC) AS BORCTOPLAMI'
    + ',SUM(ALACAK) AS ALACAKTOPLAMI'
    + ' FROM CARIHESAPLAR';
  MyGroupBySQL := ' GROUP BY '
    + 'CARIHESAPLAR.GONDERENCARI,CARIHESAPLAR.TAKIPDURUMU';
  MyQuery := TIBQuery.Create(Self);
  MyQuery.Database := dm.IBDatabase1;
try
   MyQuery.SQL.Clear;
  MyQuery.SQL.Text := MyQuerySQLCumlesi
    + ' WHERE isNull(GONDERENCARI,'''')=:PARGONDERENCARI AND isNull(TAKIPDURUMU,'''')<>:MYYITIK'
    + MyGroupBySQL;
  MyQuery.ParamByName('MYYITIK').AsSTRING := TurkceKarakterAyarla('YİTİK HESAP');
  MyQuery.ParamByName('PARGONDERENCARI').AsString := aramaparametre3;
  MyQuery.Open;
finally
MyQuery.free;
end;
end;
gibi. Sonucu istediğin hale getirene kadar çeşitli şekillerde düzenlemeler yapabilirsin.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Cevapla