SQL de hesaplama işlemi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
tayipk
Üye
Mesajlar: 284
Kayıt: 27 Kas 2013 11:32

SQL de hesaplama işlemi

Mesaj gönderen tayipk »

merhaba arkadaşlar benim sorunum şudur. CARİHAR isminde cari hareketleri tuttuğum bir tablo mevcut. bu tabloda BORÇ , ALACAK ve islem_tarihi field larım mevcut. şimdi yapmak istediğim şu 01-01-2014 ile 31-12-2014 tarihleri arasında Dışarıya olan Borçlarım ve Dışarıdaki Alacaklarıma ait toplam tuıtarları almak istiyorum. şöyleki

Örn1 : A firmasından 1.000TL lik mal aldım 500TL ödeme yaptım dolayısıyla (alacak-borç=sonuç) yani -500TL buda benim borçlu olduğumu gösteriyor.
Örn2 : B Firması benden 2.000TL lik mal aldı 500TL ödedi dolayısıyla alacak-borç=1.500 TL alacaklıyım
Örn3 : C Firmasından 3.000 TL lik mal aldım 1.500 TL ödeme yaptım dolayısıyla alacak-borç=sonuç yani -1.500 TL
Örn 4 : D Firması benden 1.000TL lik mal aldı 500TL ödedi dolayısıyla alacak-borç=500 TL alacaklıyım

şimdi yukarıdaki 3 örneği hesaplarsak
A firması 1000 + C Firması 3000 = 4000 TL borç
A firması 500 + C Firması 1500 = 2000 TL alacak
Dışarı 2.000 TL Borcum var

B firması 2000 + D Firması 1000 = 3000 TL alacak
B firması 500 + D Firması 500 = 1000 TL borç
Dışarıdan 1.000 TL Alacağım var

şimdi bu durumda ben dışarıya 2000TL boçluyum dışarıdanda 1.000tL alacaklıyım bunu gösterecek SQL cümlesini bir türlü oluşturamadım. Mantık ne olmalı yani CARİHAR tablomdaki borç satırlarını ve alacak satırlarını toplayıp borç-alacak yapınca saçma bir sonuç çıkıyor ortaya. yani kısacası dışarıya belirli tarih aralıklarında ne kadar borcum var ne kadar alacağım var hesap mantığını bir türlü kuramadım. yardımcı olacak arkadaşlara şimdiden sonsuz teşekkürler.
Soru Sorarken yazmaya Üşenmeyen Parmaklar Sorunun Çözüldükten Sonra Teşekkür etmeye de Üşenmesin.
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: SQL de hesaplama işlemi

Mesaj gönderen xxxjedixxx »

Şöyle bir şey olabilir. SQL server ise,

select sum(CASE WHEN alacak>borc THEN (alacak-borc) ELSE 0 END) AS alacak, sum(CASE WHEN borc>alacak THEN (borc-alacak) ELSE 0 END) AS borc, sum(alacak-borc) as bakiye
from table where ....
tayipk
Üye
Mesajlar: 284
Kayıt: 27 Kas 2013 11:32

Re: SQL de hesaplama işlemi

Mesaj gönderen tayipk »

xxxjedixxx yazdı:Şöyle bir şey olabilir. SQL server ise,

select sum(CASE WHEN alacak>borc THEN (alacak-borc) ELSE 0 END) AS alacak, sum(CASE WHEN borc>alacak THEN (borc-alacak) ELSE 0 END) AS borc, sum(alacak-borc) as bakiye
from table where ....
hocam cevabın için teşekkürederim aşağıdaki gibi kodları düzenleyince aslında bir nebzede olsa istediğim sonuç çıkıyor ama bunların genel toplamını nasıl alacağımı bilemedim. kodlarımı ve bu kodla beraber çıkan sonuçların fotoğrafını ekliyorum. yardımınızı rica edecem.

Kod: Tümünü seç

set dateformat dmy select cari.cari_id, (SUM(carihar.Borc)-SUM(carihar.Alacak)) as tutar from TCari cari right join TCarihar carihar on Carihar.Cari_id=Cari.Cari_id where carihar.Islem_Tarihi between '01-01-2014' and '31-12-2014' group by cari.Cari_id HAVING (SUM(carihar.borc)-SUM(carihar.Alacak))<0 
set dateformat dmy select cari.Cari_id,(SUM(carihar.Borc)-SUM(carihar.Alacak)) as tutar from TCari cari right join TCarihar carihar on Carihar.Cari_id=Cari.Cari_id where carihar.Islem_Tarihi between '01-01-2014' and '31-12-2014' group by cari.Cari_id HAVING (SUM(carihar.borc)-SUM(carihar.Alacak))>0 
Resim
Soru Sorarken yazmaya Üşenmeyen Parmaklar Sorunun Çözüldükten Sonra Teşekkür etmeye de Üşenmesin.
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: SQL de hesaplama işlemi

Mesaj gönderen xxxjedixxx »

Verdiğim örnek tam da senin istediğin aslında. Ben yapmaya çalıştım ama yazım hatası yapmış olabilirim. Deneyip sonuca bir bakarsın.

Kod: Tümünü seç

select cari.cari_id, sum(CASE WHEN carihar.alacak>carihar.borc THEN (carihar.alacak-carihar.borc) ELSE 0 END) AS alacak,
                     sum(CASE WHEN carihar.borc>carihar.alacak THEN (carihar.borc-carihar.alacak) ELSE 0 END) AS borc,
                     sum(carihar.alacak-carihar.borc) as bakiye
from TCari cari right join TCarihar carihar on Carihar.Cari_id=Cari.Cari_id 
where carihar.Islem_Tarihi between '01-01-2014' and '31-12-2014' 
group by cari.Cari_id
Bakiye kısmınıdaki işlemi ters çevirebilirsin. Ben alacak-borc diye düşündüm sen borc-alacak yapabilirsin.
tayipk
Üye
Mesajlar: 284
Kayıt: 27 Kas 2013 11:32

Re: SQL de hesaplama işlemi

Mesaj gönderen tayipk »

xxxjedixxx yazdı:Verdiğim örnek tam da senin istediğin aslında. Ben yapmaya çalıştım ama yazım hatası yapmış olabilirim. Deneyip sonuca bir bakarsın.

Kod: Tümünü seç

select cari.cari_id, sum(CASE WHEN carihar.alacak>carihar.borc THEN (carihar.alacak-carihar.borc) ELSE 0 END) AS alacak,
                     sum(CASE WHEN carihar.borc>carihar.alacak THEN (carihar.borc-carihar.alacak) ELSE 0 END) AS borc,
                     sum(carihar.alacak-carihar.borc) as bakiye
from TCari cari right join TCarihar carihar on Carihar.Cari_id=Cari.Cari_id 
where carihar.Islem_Tarihi between '01-01-2014' and '31-12-2014' 
group by cari.Cari_id
Bakiye kısmınıdaki işlemi ters çevirebilirsin. Ben alacak-borc diye düşündüm sen borc-alacak yapabilirsin.
yardımın için teşekkürederim verdiğin örnekle birlikte sorunumu çözmüş bulunuyorum emeğine bilgine sağlık.
Soru Sorarken yazmaya Üşenmeyen Parmaklar Sorunun Çözüldükten Sonra Teşekkür etmeye de Üşenmesin.
Kullanıcı avatarı
ender_arslanturk
Kıdemli Üye
Mesajlar: 709
Kayıt: 18 Şub 2005 03:38
Konum: İstanbul

Re: SQL de hesaplama işlemi

Mesaj gönderen ender_arslanturk »

Selâmlar,

Hesapları Borç, Alacak, Bakiye listeleyebilmenin için en sağlam şekli için veritabanında bir bakiye alanı açmanızı öneririm. Cari hesabın veya stok tanımının ilgili formu açıldığında borç alacak / giren çıkan döngüsüyle bakiye/kalan alanlarını doldurabilirsiniz. Dolayısıyla yoğun bir işlemi bulunan cariler de veya stoklarda performans elde edilmiş olur. Query de calculaded olarak yapmak performansta ciddi bir düşüşe sebep olacaktır. !

İyi çalışmalar,
Cevapla