Bakiyelerin Bulunması [Archive] - Excel Forum

PDA

Tüm Versiyonu Göster : Bakiyelerin Bulunması


erkankamilonas
11-07-2008, 13:36
Ekte sunmuş olduğum veritabanında DövizBakiye ve YTLBakiye sütunlarına ilgili firmaların bakiyelerini nasıl yazdırabilirim?

Yani Firma adı değiştikçe bakiyelerde diğer firmaya bağlı olarak değişecek. Bunu nasıl bir sorgu ile yapabilirim?

Taruz
11-07-2008, 13:51
Merhaba..

Firmaların toplma ytl-döviz bakiyelerini mi görmek istiyorsunuz?


SELECT CariHesaplar.FirmaAdı, Sum(CariHesaplar.DövizBakiye) AS ToplaDövizBakiye, Sum(CariHesaplar.YTLBakiye) AS ToplaYTLBakiye
FROM CariHesaplar
GROUP BY CariHesaplar.FirmaAdı;



Yoksa yürüyen bakiye türünde bir şey mi?

erkankamilonas
11-07-2008, 14:06
Her satırda sonuç görünmeli, birde bu sorgunun ilgili satırları güncelleşltirmesi gerekiyor.
Mesela yazılan sorguda TREDA firması YTL bakiyesi 0 olması gerekirken 19.132,04 görünüyor.
Yani işlem şöyle olmalı;
YTLBorç + YTLAlacak = sonuç firma adı değişirse işlem baştan başlamalı.
DövizBorç + DövizAlacak = Sonuç
Benim yazdığım bakiyeler tamamen güncellenmeli
Teşekkürler

Bu şekilde sadece son bakiyeler göründü; Yürüyen bakiye lazım
SELECT CariHesaplar.FirmaAdı, Sum(CariHesaplar.DövizBorç) + Sum(CariHesaplar.DövizAlacak) AS ToplaDövizBakiye, Sum(CariHesaplar.YTLBorç)+Sum(CariHesaplar.YTLAlac ak) AS ToplaYTLBakiye
FROM CariHesaplar
GROUP BY CariHesaplar.FirmaAdı;

Taruz
11-07-2008, 16:15
Merhaba..

SELECT ttt.[No], ttt.İşlemTarihi, ttt.FirmaAdı, ttt.YTLBorç, ttt.YTLAlacak, ttt.kalanytl, ttt.DövizBorç, ttt.DövizAlacak, ttt.KalanDöviz, (select sum(kalanytl) from tt where [no]<=ttt.[no] and firmaadı=ttt.FirmaAdı) AS [Ytl Bakiye], (select sum(kalandöviz) from tt where [no]<=ttt.[no] and firmaadı=ttt.FirmaAdı) AS [Döviz Bakiye]
FROM tt AS ttt;



Firmaya göre filtrelediğinizde sıralı olarak bakiyeyi alabilirsiniz.. Ytl ve döviz ayrı ayrı olarak..

Çıkan sonuçlar istediğinizle örtüşecek sanırım..

erkankamilonas
12-07-2008, 08:40
Sayın Taruz ilginiz için teşekkürler. Ancak şöyle olmalı

Borç Alacak Bakiye
100 +++++++++100
++++(-)50+++++50
250++++++++++300
++++(-)30+++++270

Sizin verdiğiniz sorguyu biraz değiştirdim ve istediğimi neredeyse elde ettim, ancak bakiyeler yürüyen bakiye değiller, sadece son bakiye göründü.

SELECT CariHesaplar.FirmaAdı, Sum(CariHesaplar.DövizBorç) + Sum(CariHesaplar.DövizAlacak) AS ToplaDövizBakiye, Sum(CariHesaplar.YTLBorç)+Sum(CariHesaplar.YTLAlac ak) AS ToplaYTLBakiye
FROM CariHesaplar
GROUP BY CariHesaplar.FirmaAdı;

Birde yukarıda eklemeler yapmış olduğum kodun, Update sorgusuna dönüştürülmesi nasıl olur?

Taruz
12-07-2008, 11:46
Sorgu o şekilde çalışıyor zaten??

Siz bir firmanın hesap hareketlerini yürüyen bakiye olarak istemiyor musunuz?

Hesaplanarak ortay çıkan verileri tabloya UPDATE etmeniz veritabanı mantığına aykırı ayrıca.. Gereksiz veri depolayacaksınız..

erkankamilonas
23-07-2008, 15:19
Teşekkürler.

seruz
24-07-2008, 12:39
Öncelikle mesajı geç farkettim ve belki de çoktan çözmüşsünüzdür sorunu ama
sizin işinize yaramasa bile belki başka ihtiyacı olan arkadaşların işine yarar diye bir bakayım dedim. Sn. Taruz uğraşmış ama istenilen sonuç olmamış.

Access'te Yürüyen Bakiye hesabı raporlarda çok rahat çözülüyor ama
sorgulardaki çözümünü bende henüz bulamadım. Raporlarda işimi hallettiğim için çok da üstüne düşmedim.

Belki işinize yarar diye Rapor Çözümünü yaptım ve ekte gönderdim.
Ekteki raporda sadece Bakiye alanlarında RunningSum (Türkçesini tam bilmiyorum ama YürüyenToplam gibi birşey olmalı) özelliğini aktif ettim.

Eğer veritabanınız Access değilde SQL ise View veya Stored Procedure'da
aşağıdaki script ile yürüyen bakiyeyi hesaplatabilirsiniz.

Select FirmaAdı, İşlemTarihi, No, Döviz, DövizBorç, DövizAlacak,
DövizBakiye=(Select Sum(DövizBorç + DövizAlacak)
From CariHesaplar
Where FirmaAdı=CH.FirmaAdı And (İşlemTarihi < CH.İşlemTarihi Or (İşlemTarihi = CH.İşlemTarihi And No <= CH.No))),
YTLBorç, YTLAlacak,
YTLBakiye=(Select Sum(YTLBorç + YTLAlacak)
From CariHesaplar
Where FirmaAdı=CH.FirmaAdı And (İşlemTarihi < CH.İşlemTarihi Or (İşlemTarihi = CH.İşlemTarihi And No <= CH.No)))
From CariHesaplar as CH
Order By FirmaAdı, İşlemTarihi, No

Taruz
24-07-2008, 13:46
Merhaba. sn seruz..

Sanırım #4 nolu kutudaki örneği iyi incelemediniz.. İncelemiş olsaydınız yüyüyen bakiyenin sorguyla çözüldüğünüde görmüş olurdunuz..

"... istenilen sonuç olmamış" değerlendirmeniz biraz iddalı olmuş yani..;)

Sorgudaki sıralamayı ORDER BY ttt.FirmaAdı, ttt.[No], ttt.İşlemTarihi; olarak değiştirerek bakınca daha iyi anlaşılacaktır..

Hatta hazırladığım bu sorguyu birleştirme sorgusu haline dönüştürerek Firmaların bakiye alt toplamlarını da aynı da aynı ekranda alabiliriz..

Saygılar..

seruz
24-07-2008, 15:53
Mesajınız üzerine tekrar bakınca gördüm ki, istenilen sonuç olmuş :)

Sn. Taruz öncelikle özür dilerim.

Aslında hiç bir zaman iddialı olmayı sevmem
çünkü "Akıl akıldan üstündür" sözüne her zaman inanırım.

Ama sanırım #5 nolu mesajdaki olmamış yazısı ön yargılı davranmamı ve
gözümden kaçmasını sağladı.
Ayrıca avatar'da fotosu görünen henüz bir haftalık kızım nedeniyle,
gözüm pek bir şey görmüyor bu aralar :)

Güzel bir çözüm, teşekkürler.

Ama yine de küçük bir not, bakiyeyi alırken kontrolü No alanına göre değil de,
önce tarih sonra no alanına göre yapmak daha doğru olur bence.
(benim yaptığım gibi yani :) )

Ben yine de iddialı olmiim :) ama tarih değiştirilebilir,
eski bir tarihe kayıt girilebilir vs. nedenlerle no ve tarih sırası değişebilir.

seruz
24-07-2008, 16:02
SQL'de script'i yazabilmiştim ama Access'teki sorguda bunu nasıl yapabileceğimi çözememiştim. (Akıl akıldan üstündür :) )

Aslında Access'te de çift sorgu yerine tek sorgu ile çözümlenir bu işlem.

SELECT yb.FirmaAdı, yb.İşlemTarihi, yb.[No], yb.YTLBorç, yb.YTLAlacak, (select sum(nz([YTLBorç])+nz([YTLAlacak])) from CariHesaplar where firmaadı=yb.FirmaAdı And (İşlemTarihi < yb.İşlemTarihi Or (İşlemTarihi = yb.İşlemTarihi And No <= yb.No))) AS YTLBakiye, yb.DövizBorç, yb.DövizAlacak, (select sum(nz([DövizBorç])+nz([DövizAlacak])) from CariHesaplar where firmaadı=yb.FirmaAdı And (İşlemTarihi < yb.İşlemTarihi Or (İşlemTarihi = yb.İşlemTarihi And No <= yb.No))) AS DövizBakiye
FROM CariHesaplar AS yb
ORDER BY yb.FirmaAdı, yb.İşlemTarihi, yb.[No];


Sadece biraz karışıkmış gibi görünüyor ama mantık basit.

Taruz
24-07-2008, 16:30
Merhaba sn seruz..

Sizi ve eşinizi tebrik ederim.. Allah analı babalı büyütsün. :)

Sorgudaki çözümün gözünden kaçtığına emindim.. Yoksa forum içerisinde verdiğiniz çözüm önerilerinden bu konudaki bilginiz konusunda intibam vardı zaten..

Bence kontrol benzersiz alandan alınmalı.. Tersi bir durum aynı tarihli hareketlerde sıkıntı yaratabilir..

Bu türde sorguları genelde bende tek sorgu içerisinde yapıyorum ama sizinde gördüğünüz gibi null alanların oluşu ve diğer fazlalıklar toparlama açısından iki sorgu üzerinden hareket etmeme sebep oldu..

Saygılar..

assenucler
24-07-2008, 16:55
Sayın Seruz;

Ben de sizi ve eşinizi tebrik ederim.

Kızınız analı babalı büyüsün, şansı açık ve uzun ömürlü olsun. Sayın Taruz hocam da yeni babalardan...

Selam ve sevgiler.

seruz
24-07-2008, 17:50
Sn. Taruz ve assenucler,
İyi dilekleriniz için teşekkür ediyorum ve
Sn. Taruz sizi de ayrıca tebrik ediyorum.
Sizde yeni baba olduğunuza göre ruh halimi anlıyorsunuzdur :)

Biraz şahsi reklam gibi olacak ama www.seruz.com 'da kızımın fotoğraflarını görebilirsiniz.

Not: Kontrol tabii ki benzersiz alanlardan alınmalı.. Ancak dediğim gibi olabilecek çeşitli sebeplerden ötürü tarih ve no paralel olmayabilir.
Aynı tarihli hareketler tabiiki olabileceği için, önce tarih sonra aynı tarihlerde no kontrolü ekledim.

Aslında muhasebe açısından aynı tarihli hareketlerde önce borç sonra alacak hareketleri sıralanır ama burada çok da önemli değil.


Özel Arama