bir çıktı sorusu

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
Kullanıcı avatarı
vampir261
Üye
Mesajlar: 298
Kayıt: 23 Kas 2004 03:22
Konum: Denizli

bir çıktı sorusu

Mesaj gönderen vampir261 »

Bir müşterimiz bizden ilginç bir çıktı istiyor. aslında belki ilginç değildir yani bazılarımıza ilginç gelmeyebilir. neyse fazla ilginç bir yazı oldu :P elimdeki veritabanında taksitler var bir müşteri 10 biri 5 biride 7 taksite sahip olabiliyor bu yüzden müşteri kodunun yanına taksit numarası ekleyerek bir tabloda verileri tutuyorum

Müşteri Taksit No Miktar Tarih
A 1 200 11.02.2004
A 2 200 11.03.2004
A 3 300 11.04.2004
A 4 100 11.05.2004
B 1 230 19.02.2004
B 2 201 19.03.2004
B 3 123 19.04.2004
B 4 201 19.05.2004
B 5 120 19.06.2004
B 6 400 19.07.2004
B 7 100 19.08.2004
C 1 100 20.09.2003
C 2 140 20.10.2003
C 3 120 20.11.2003
C 4 560 20.12.2003
C 5 140 20.01.2004


gibi A müşterisinin 4, B müşterisinin 7 ve C müşterisinin 5 taksiti var
kullanıcımda benden şöyle bir çıktı istiyor


Müşteri Eyl.03 Eki.03 Kas.03 Ara.03 Oca.04 Şub.04 Mar.04 Nis.04 May.04 Haz.04 Tem.04 Ağu.04
A 200 200 300 100
B 230 201 123 201 120 400 100
C 100 140 120 560 140
Kullanıcı avatarı
vampir261
Üye
Mesajlar: 298
Kayıt: 23 Kas 2004 03:22
Konum: Denizli

Mesaj gönderen vampir261 »

önizleme yerine gönder e bastım yanlışlıkla. kusura bakmayın.


Müşteri Eyl.03 Eki.03 Kas.03 Ara.03 Oca.04 Şub.04 Mar.04 Nis.04 May.04 Haz.04 Tem.04 Ağu.04
A 0 0 0 0 0 200 200 300 100 0 0 0
B 0 0 0 0 0 230 201 123 201 120 400 100
C 100 140 120 560 140 0 0 0 0 0 0 0

burada altta yazılan verilerin herbiri kendine ait ay ve yıl bilgisi altında olmasını istiyor. eğer anlatmak istediğim anlaşılmazsa resim ekleyebilirim. umarım istediğimi anlatabişlmişimdir. ben kullanıcıya yani müşterimize ne kadar dil döktü isem de anlamadı. "bu olmaz her taksit ayrı bir kayıt bu kayıtları böyle tek bir kayıt gibi tek satırda gösteremem " dedimse de anlamıyor da anlamıyor. daha önce böyle bir istekle karşılaşan, çözüm bulan, çözüm önerisi olan her kişiden yardım bekliyorum. program bitti bitecek ama bu istek son istek yapılabilir gibi görünüyor. ama olmuyor. ya taksit miktarları eşit uzunlukta olsa belki kayıt anında başka bir tabloya yan yana kayıt ederim hangi aydan başlıyorsa yazı tasarım aşamasında sol boşluğuna göre bişeyler ayarlarım diyorum ama oda eşit boyda değil. neyse umarım cevabı bilen biri vardır. herkese kolay gelsin



(Galiba editör birden fazla boşluğu bir boşluğa indiriyor o yüzden veriler ait olduğu ay ve yılın altına düşmüyor. yada bu özellik önceden vardı ben yeni fark ettim) (Kim düşündü ise ii düşünmüş Allah razı olsun)
Kullanıcı avatarı
vampir261
Üye
Mesajlar: 298
Kayıt: 23 Kas 2004 03:22
Konum: Denizli

Mesaj gönderen vampir261 »

Kod: Tümünü seç

Müşteri	Eyl.03	Eki.03	Kas.03	Ara.03	Oca.04	Şub.04	Mar.04	Nis.04	May.04	Haz.04	Tem.04	Ağu.04
A	          0     	0     	0     	0	     0	  200	    200	    300	100	     0	    0	     0 
B	          0	     0	     0 	    0	     0	  230	    201	    123	201	     120	  400	  100 



sonunda ne istediğini gösterebildim bunu dbgrid içinde değil çıktı olarak istiyor . bilenlerden yardım bekliyorum. herkese günaydın malum saat 5 olmuş. gerçi batıda güneş 35 dakika filan daha geç doğuyor neyse herkese kolay gelsin
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

NOT : mesajınızın sağ üst tarafındaki edit Resim butonuna tıklayarak mesajı düzeltebilirsiniz.

bir diğer önemli nokta ise veritabanınız nedir :D
.-.-.-.-.-.-.-. ^_^
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

Hocam hiç müşterinizi üzmeyin.... Biraz zor da olsa, bazı katı kuralları da olacak olsa tarz bir çıktıyı almanız çok da zor degil..... Tabi kullandığınız veritabanı da çok önemli... Yani paradox filan sizi yarı yolda bırakabilir.... Hiç güvenmeyin. Eğer Firbird veya Interbase ise bir şekilde halledilir... Yok eğer Sybase ise zaten SQL cümlesi cepte :)
Şöyle ki:

Kod: Tümünü seç

Select  MUSTERI,
SUTUN1=(Select isnull(sum(MIKTAR),0) from TABLO T1 where T1.MUSTERI=T.MUSTERI and T1.TARIH between '01-01-2003' and dateadd(day,-1,dateadd(month, 1, '01-01-2003'))),
SUTUN2=(Select isnull(sum(MIKTAR),0) from TABLO T1 where T1.MUSTERI=T.MUSTERI and T1.TARIH between dateadd(month,1,'01-01-2003') and dateadd(day,-1,dateadd(month, 2, '01-01-2003'))),

SUTUN3=(Select isnull(sum(MIKTAR),0) from TABLO T1 where T1.MUSTERI=T.MUSTERI and T1.TARIH between dateadd(month,2,'01-01-2003') and dateadd(day,-1,dateadd(month, 3, '01-01-2003'))),
SUTUN4=(Select isnull(sum(MIKTAR),0) from TABLO T1 where T1.MUSTERI=T.MUSTERI and T1.TARIH between dateadd(month,3,'01-01-2003') and dateadd(day,-1,dateadd(month, 4, '01-01-2003'))),
SUTUN5=(Select isnull(sum(MIKTAR),0) from TABLO T1 where T1.MUSTERI=T.MUSTERI and T1.TARIH between dateadd(month,4,'01-01-2003') and dateadd(day,-1,dateadd(month, 5, '01-01-2003'))),
SUTUN6=(Select isnull(sum(MIKTAR),0) from TABLO T1 where T1.MUSTERI=T.MUSTERI and T1.TARIH between dateadd(month,5,'01-01-2003') and dateadd(day,-1,dateadd(month, 6, '01-01-2003'))),
....
....
...

from TABLO T
group by MUSTERI
order by MUSTERI
Burada dateadd isimli bir fonksiyon kullandim. Sybase de var olan bu fonksiyon ile her ayin ilk ve son gununun arasındaki takistlerin toplamını yakaladık Yani

Kod: Tümünü seç

T1.TARIH between '01-01-2003' and dateadd(day,-1,dateadd(month, 1, '01-01-2003'))
TARHIH degeri 01-01-2003 ile bu tarihten 1 ay sonranın yani bir sonraki ayin 1. gunun 1 gun öncesi yani ilk ayın son gunu arasındaki degerleri filtrelemiş olduk...

isnull fonksiyonu ise eger o ay içinde bir taksit yok ise sonucun null değil de 0 olarak dönmesini sağlıyor....

Bu SQL cümlesi kolayca anlaşılacağı üzere bir tarihi parametre olarak alıp o tarihle başlayan ay ve ondan sonraki ayların raporunu veriyor... Ama kaç adet sutun yaparsanız o kadar ay sonrasını alabilirsiniz ve bu sabit olmak zorunda...
Sybase'e özel bu 2 fonksiyonun işlevini anladiktan sonra benzer işlevi mevcut veritabanınızda da gerçekleştirebilirsiniz zannediyorum....

Kolay gelsin....
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
vampir261
Üye
Mesajlar: 298
Kayıt: 23 Kas 2004 03:22
Konum: Denizli

Mesaj gönderen vampir261 »

Herkese günaydın bununla uğraşırken saat 7 ye kadar uyumamışım da yeni uyandım :oops: mege kardeş edit olayını yeni farkettim çoktandır siteye uğramamıştım. güzzel bir fikir doğrusu söylediğn için teşekkür ederim. bu projeye 3,5-4 ay önce başladık o zaman sql server2000 de başladık ama yazarken ağzımız dilimiz yandı. "onu yapayım" diyorum hata geliyor "yok olmaz değiştir" "yok bunu beğenmedim" sql server ı kullandığımıza bin pişman olduk zaten paralı olmasıda cabası. bizde programı firebird e geçireceğiz bir ay sonra filan. şu an veritabanı tabloları ile hazır durumda birde proje büyüdükçe başımız ağrıdı. oda bizim nesne tabanlı programdan uzak bir yazım tarzı kullanmamızdan kaynaklandı tabi. fahrettin abimin verdiği cevabı deneyip durumu bildiririm. kahve hazır olmuş kahvaltı yapayım isteyen gelsin fazkadan puaça ve simit var :D herkese selamet dilerim ii günler. cevaplar için teşekkür ederim
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Mesaj gönderen sadettinpolat »

memory tablolar var.
veritabanından okuduğun kayıtları uygun bir formatta memory tabloya ekler ve raporu bu tablo üzerinden alırsan sorunun çözülmüş olur.
kbmemtable diye bedava bir bileşen olması lazım. sql server kullanıyorsan (veya sp destekleyen her hangi bir veritabanı) bu çıktıyı verebilecek bir sp de yazılabilir.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Cevapla