Paradox ve TQuery Yuvarlama Hatası

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
ekaradag

Paradox ve TQuery Yuvarlama Hatası

Mesaj gönderen ekaradag »

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
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

bence sum komutunun olduğu yeri ayrı bir nesne olarak al
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
kolay gelsin
Demitri

Mesaj gönderen Demitri »

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.
ekaradag

Konuyu açandan cevap

Mesaj gönderen ekaradag »

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
Cevapla