Paradox veritabanımdaki kayıtları id numarasına göre group by edip bir alandaki değerleri toplattırıyorum. Şu şekilde bir sonuçla karşılaşıyorum;
(bilgileri kısaltarak yazıyorum)
Tablo yapılarım
tanim.db
ALAN ADI ALAN TİPİ
ID N (Numeric)
ISIM A (Alfanumeric) 10 karakter
hareket.db
ID + (Auto increment)
TANIMID N
DEGER N (Numeric)
Tablomdaki Veri
tanim.db
ID ISIM
1 ABC
2 DEF
3 GHI
4 JKL
hareket.db
ID TANIMID DEGER
1 1 10,245
2 3 10,573
3 1 10,425
4 2 8,230
5 2 4,250
Tquery de kullandığım sql str dizisi
SELECT
t.ID,t.ISIM,sum(h.DEGER) as DEGERTOPLAM
from tanim t left outer join hareket h
ON (t.ID=h.TANIMID)
GROUP BY t.ID,t.ISIM
Son olarak da tquery nesnesinin ürettiği sonuç
ID ISIM DEGERTOPLAM
1 ABC 25,445
2 DEF 8,315
3 GHI 3,25
4 JKL -1,451244353453453454E308
Toplanmış değerleri toplayıp da yazmadım kafadan attım, ancak hareket tablosunda hiç olmayan 4 numaralı kayıt için neden 10 üzeri 308 gibi bir değer üretildi bunu anlayamadım SQL de castin fonksiyonlarını denedim ancak hiçbir sonuca ulaşamadım.
BDE deki ENABLE BCD özelliği bu gibi rounding error tipleri handle etmek için kullanılıyor. nasıl kullanıldığını bilen varsa lütfen bana ulaşsın
(ayrıca bahsettiğim bu sorun örnek verdiğim gibi 4 kayıtta falan olmuyor. tablomda yaklaşık 130.000 kayıt var şimdi almaya başladım bu hatayı)
Toplama işini sql in sum fonksiyonuna bırakmayıp, ek bir alan üzerine BDE fonksiyonları ile toplattırma yaptım, sonuç görünüşte başarılı ama takdir edersiniz ki aşırı derecede yawaş. Kayıt sayısı çok olduğu için kod cambazlıkları yapamıyorum.
Fikri olan veya tecrübe etmiş olan varsa lütfen bana ulaşsın
Ender
enkaradag@gmail.com
Paradox ve TQuery Yuvarlama Hatası
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
bence sum komutunun olduğu yeri ayrı bir nesne olarak al
mesela
kolay gelsin
mesela
Kod: Tümünü seç
t.ID,t.ISIM,
(select sum(h.DEGER)from hareket h where h.tanimid=t.id) as DEGERTOPLAM
from tanim t left outer join hareket h
ON (t.ID=h.TANIMID)
GROUP BY t.ID,t.ISIM
BU SORUN BENDE DE VARDI.
VERİ TABANI OLARAK FIREBIRD KULLANIYORDUM
SAYI TIPIPNP FLOAT OLARAK SECMIŞTİM.
SONRA SENİNKİ GİBİ 0.0000007444854 GİBİSİNDEN KÜSÜRATLAR VERİYORDU
SONRADA VERİ TABANINDA BU TİP PARASAL DEĞERLER İÇİN. (ÖZELLİKLE KÜSÜRATLAR) DOUBLE EXTENSION KULLANDIM
KÜSÜRATLARDAN KURTULDUM. ŞİMDİ HESAPLAMALAR VE ONDALIK KISIM TAM ÇIKIYOR.
BENCE SEN DE VERİ TİPİNİ DEĞİŞTİRMELİSİN.
VERİ TABANI OLARAK FIREBIRD KULLANIYORDUM
SAYI TIPIPNP FLOAT OLARAK SECMIŞTİM.
SONRA SENİNKİ GİBİ 0.0000007444854 GİBİSİNDEN KÜSÜRATLAR VERİYORDU
SONRADA VERİ TABANINDA BU TİP PARASAL DEĞERLER İÇİN. (ÖZELLİKLE KÜSÜRATLAR) DOUBLE EXTENSION KULLANDIM
KÜSÜRATLARDAN KURTULDUM. ŞİMDİ HESAPLAMALAR VE ONDALIK KISIM TAM ÇIKIYOR.
BENCE SEN DE VERİ TİPİNİ DEĞİŞTİRMELİSİN.
Konuyu açandan cevap
Ya kullandığım veri tipini BCD olarak değiştirdim ama sonuç aynı. Bende şu şekilde bi çözüme gittim;
önce tanım tablosuna bi alan daha açtım VIEWMIKTAR isminde fi alan açtım tipini de numeric seçtim yine. sonra daha önce sql de yaptığım sum lı query yi yeniden yaptım, querynin ürettiği tüm sonuçları bu viewmiktar alanına update ettim. son olarak da viewmiktar alanını veri toplamı olarak view ettim. sonuç başarılı sayılar belli noktalardan sonra truncate edilmiş durumda. 50000 kayıda kadar problem yok, ama kayıt sayısı artınca hız aşırı derecede düşüyor. Bence problem BDE sql inin sum fonksiyonunda. Dediğin gibi toplama yapılacak alan tipini değiştirdim toplama yapılan alan tipi ne olursa olsun sum fonksiyonu double tipi dönderiyor. işin içler acısı olan tarafı bu şekilde çok uzamış bir rakamı 3 * (2/3) şeklinde bir işlemden beklerim ama öyle bir işlem yok ve veritabanında kesinlikle bukadar hassasiyeti olabilecek bi durum yok.
Sum fonksiyonun ürettiği veriyi ne şekilde BCD tipine CAST edebiliriz, ve BDE nin ENABLE BCD özelliğini nasıl kullanabiliriz
önce tanım tablosuna bi alan daha açtım VIEWMIKTAR isminde fi alan açtım tipini de numeric seçtim yine. sonra daha önce sql de yaptığım sum lı query yi yeniden yaptım, querynin ürettiği tüm sonuçları bu viewmiktar alanına update ettim. son olarak da viewmiktar alanını veri toplamı olarak view ettim. sonuç başarılı sayılar belli noktalardan sonra truncate edilmiş durumda. 50000 kayıda kadar problem yok, ama kayıt sayısı artınca hız aşırı derecede düşüyor. Bence problem BDE sql inin sum fonksiyonunda. Dediğin gibi toplama yapılacak alan tipini değiştirdim toplama yapılan alan tipi ne olursa olsun sum fonksiyonu double tipi dönderiyor. işin içler acısı olan tarafı bu şekilde çok uzamış bir rakamı 3 * (2/3) şeklinde bir işlemden beklerim ama öyle bir işlem yok ve veritabanında kesinlikle bukadar hassasiyeti olabilecek bi durum yok.
Sum fonksiyonun ürettiği veriyi ne şekilde BCD tipine CAST edebiliriz, ve BDE nin ENABLE BCD özelliğini nasıl kullanabiliriz