firebird hatasımı acaba ?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
zero_g
Üye
Mesajlar: 56
Kayıt: 11 Şub 2004 11:52

firebird hatasımı acaba ?

Mesaj gönderen zero_g »

slm arkadaşlar

Database olarak firebird 2.0 kullanıyorum

Arkadaşlar benim anahtar alanı fis_num ve fis_sir olan bir table'ım var
bu table'nin içinde brc_tut numeric(15,2) ve alc_tut numaric(15,2)
olan bir alanım var ve her fis için bu iki alanın toplamı eşit olması gerekiyor

şimdi beni şöyle bir sql im var

SELECT FIS_TAR,FIS_NUM,
SUM(BRC_TUT) AS BRC_TUT,SUM(ALC_TUT) AS ALC_TUT,
SUM(BRC_TUT)- SUM(ALC_TUT) as bakiye FROM hesap
Whre FIS_NUM= "65"
GROUP BY FIS_TAR,FIS_NUM

bu sql cümleciğini sonucu brc_tut = 718,38 alc_tut=718,38 ve bakiye is
1,13686837721616E-13 çıkıyor normalde bakiye=0 olmalıydı

aynı sql cümleciğini şu şekilde çalıştırdığımda ise

SELECT SUM(BRC_TUT) AS BRC_TUT,SUM(ALC_TUT) AS ALC_TUT,
SUM(BRC_TUT)- SUM(ALC_TUT) as bakiye FROM hesap
Whre FIS_NUM= "65"

brc_tut = 0, alc_tut=0, bakiye=0 veriyor

sonuç olarak group by koyarak aldığım sonuç yanlış, acaba problemin sebebi nedir
bu konuda bir bilgisi ve fikri olan arkadaşlara şimdiden tşk eder iyi çalışmalar dilerim
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Küsüratlarda öyle problemler çıkabiliyor.. Daha önce konuşmuştuk.. Şöyle bir ali cengiz oyunu ile aşabilirsiniz :wink:

Kod: Tümünü seç

SELECT SUM(1.00 * BRC_TUT) AS BRC_TUT, SUM(1.00 * ALC_TUT) AS ALC_TUT,
SUM(1.00 * BRC_TUT) - SUM(1.00 * ALC_TUT) as bakiye FROM hesap
Whre FIS_NUM= "65" 
IBExpert veya benzeri bir yönetim aracı ile şöyle bir deneme yapabilirsin:

Kod: Tümünü seç

select 2 / 3, 2 / 3.00, 2 / 3.00000 from rdb$database
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
zero_g
Üye
Mesajlar: 56
Kayıt: 11 Şub 2004 11:52

Mesaj gönderen zero_g »

Hocam cevabınız için çok tşk ederim

:( tarif ettiğiniz şekilde denedim ama hiçbirşey değişmedi.. birde dikkatimi çek bunu her sayıda yapmıyır bazı sayılarda yapıyor .
başka önerileriniz varsa bekliyorum tıknadım kaldım... birazda hayal kırıklığına uğradım daha doğrusu.. sonuçta matematik matematiktir 2+2=4 eder.. brc_tut doğru alc_tut ta doğru brc-alc yapıyoruz sonuç yanlış bir türlü anlayamadım..

yardımlarınızı bekliyorum
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

bu sql cümleciğini sonucu brc_tut = 718,38 alc_tut=718,38 ve bakiye is
1,13686837721616E-13 çıkıyor normalde bakiye=0 olmalıydı
o sayı zaten 0 oluyor. cast ile sayı için uygun bir tip belirtirseniz sorun olacağını zannetmem. kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Tanımladığın alanları NUMERIC olarak değil de DOUBLE PRECISION olarak tanımlayarak deneyebilir misin?

Sonuçta fark sıfır değilse aynı dediğin SUM'lar da aynı değil anlamı çıkıyor.

Basit bir query ile bunu test edebilirsin.

Kod: Tümünü seç

SELECT SUM(BRC_TUT) AS BRC_TUT,SUM(ALC_TUT) AS ALC_TUT, 
SUM(BRC_TUT)- SUM(ALC_TUT) as bakiye FROM hesap 
Whre FIS_NUM= "65"
HAVING SUM(BRC_TUT) = SUM(ALC_TUT)
Bu query sonuç döndürmüyorsa zaten sıfırdan farklı anlamı çıkacak.

Yani gerçekten de zaten sıfır değil fark demek olacak.
zero_g
Üye
Mesajlar: 56
Kayıt: 11 Şub 2004 11:52

Mesaj gönderen zero_g »

Sayın aslangeri arkadaşım verdiğin bilgi için tşk ederim .
o sayı zaten sıfır oluyor demişşin ama ben if bakiye=0 then dediğimde
then 'den sonrasını işlemesi gerekiyor ama işlemiyor demekki sayı sıfır değil. ama cast 'tan bahsetmişşin birkaç örnek denedim yine olmadı
birde sen cast la ilgili bir kullanım şekli yazarsan sevinirim.

ilgin için tşk ederim
zero_g
Üye
Mesajlar: 56
Kayıt: 11 Şub 2004 11:52

Mesaj gönderen zero_g »

Arkadaşlar ben en iyisi size table nin içeriğini vereyim


Fis_no Sıra No Brc_Tut Alc_Tut
------- -------- ---------- ---------
65 : 1 : 245,95 : 0
65 : 2 : 28,33 : 0
65 : 3 : 0 : 274,28
65 : 4 : 7,11 : 0
65 : 5 : 1,28 : 0
65 : 6 : 0 : 8,39
65 : 7 : 431,4 : 0
65 : 8 : 4,31 : 0
65 : 9 : 0 : 435,71 (görüntü için özür dilerim ayarlayamadım)
simdi arkadaşlar
select sum(brc_tut),sum(alc_tut),sum(brc_tut-alc_tut) as bakiye from hesap
sonuc brc_tut = 718,38 , alc_tut = 718,38 , bakiye=0 bu sonuç doğru

aynı sql i şu şekilde yazıyorum
select Fis_No,Sira_No,sum(brc_tut),sum(alc_tut),sum(brc_tut-alc_tut) as bakiye from hesap
Group by Fis_No,Sira_No

sonuc brc_tut = 718,38 , alc_tut = 718,38 , bakiye=1,13686837721616E-13

bakiye sıfır olması gerekirken çok ufak bir rakam bu problemin çözümünü arıyorum yardımlarınızı acil bekliyorum....

benmi hata yapıyorum acaba firebird mü?
    Kullanıcı avatarı
    aslangeri
    Moderator
    Mesajlar: 4322
    Kayıt: 26 Ara 2003 04:19
    Konum: Ankara
    İletişim:

    Mesaj gönderen aslangeri »

    ben 1.5 kullanıyorum select sql inin sonucunda farkı 0 olark gösterdi
    gerçi ibexpertten ayarları da etkilemiş olabilir.
    Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
    Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
    Hakan Can
    Üye
    Mesajlar: 634
    Kayıt: 04 Mar 2005 04:27
    Konum: Ankara

    Mesaj gönderen Hakan Can »

    Verdiğin rakamlardan (kayıtlardan) en az bir tanesi verdiğinden farklı. Yani çok küçük küsüratı var anlamı çıkıyor.

    Bunu da ancak kodla kayıtları tek tek kontrol ederek tespit edebilirsin.

    Denemende fayda var.

    Yani şuna benzer bir kontrol:

    if Table1.FindField('Brc_Tut').AsFloat <> StrToFloat(FormatFloat('0.00', Table1.FindField('Brc_Tut').AsFloat)) then...

    gibi.
    Cevapla