Firebird'de matematik islemi

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
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Firebird'de matematik islemi

Mesaj gönderen ikra »

selamu aleyküm

Firebird 1.5 veritabaninda Computed bir alanda matematik islemi yaptirmaya calisiyorum... miktar, kdv, iskonto bu üc alani birlestirerek yapilacak bir islem...

Kod: Tümünü seç

((100 + kdv) / 100) * (((100 - iskonto) / 100) * miktar)
eger miktari 1000 lira iskonto'yu 3% ve kdv'yi %20 alacak olur isek sonuc olarak 1164 lira cikartmasi gerekiyor.

iskonto net ten düsülüp daha sonra kdv eklenip brütü cikmali... sonuc hep 970 olarak cikiyor. sizce yanlisi nerede yapiyorum?
kıdemsiz üye
oguzozturk74
Kıdemli Üye
Mesajlar: 574
Kayıt: 01 Şub 2004 12:29
Konum: Erdemli - MERSİN

Mesaj gönderen oguzozturk74 »

DDL yi gonderseydiniz daha iyi olurdu.

- Computed alan table ın create kodunda ilişkili oldugu alanlardan sonra oluşturulmalıdır.
- Eger yukardakini yaptıysanız su sekilde yazmayı deneyin:
(((100 + kdv) / 100) * (((100 - iskonto) / 100) * miktar))

Dikkat ederseniz , butun ifadeyi parentez içine aldım.
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Mesaj gönderen ikra »

hocam bütün DDL i kopyaliyorum...

Kod: Tümünü seç

CREATE GENERATOR GEN_RECHNUNG_ID;

CREATE TABLE RECHNUNG (
    RECHNUNG_ID  BIGINT NOT NULL,
    SB           BIGINT,
    RGNR         BIGINT,
    KUNDEN_ID    BIGINT,
    DATUM        DATE,
    BETRAG       DECIMAL(15,2),
    ZHANREDE     VARCHAR(4),
    ZHTITEL      VARCHAR(15),
    ZHNACHNAME   VARCHAR(20),
    ZHVORNAME    VARCHAR(20),
    ZHNAME       COMPUTED BY (case when (zhtitel) is null and (zhnachname) is null and (zhvorname) is not null then
'z.H.'||' '||zhanrede||' '||zhvorname
when (zhtitel) is null and (zhnachname) is not null and (zhvorname) is null then
'z.H.'||' '||zhanrede||' '||zhnachname
when (zhtitel) is null and (zhnachname) is not null and (zhvorname) is not null then
'z.H.'||' '||zhanrede||' '||zhnachname||' '||zhvorname
when (zhtitel) is not null and (zhnachname) is null and (zhvorname) is not null then
'z.H.'||' '||zhanrede||' '||zhtitel||' '||zhvorname
when (zhtitel) is not null and (zhnachname) is not null and (zhvorname) is null then
'z.H.'||' '||zhanrede||' '||zhtitel||' '||zhnachname
when (zhtitel) is not null and (zhnachname) is not null and (zhvorname) is not null then
'z.H.'||' '||zhanrede||' '||zhtitel||' '||zhnachname||' '||zhvorname end),
    O_STRASSE    VARCHAR(30),
    O_PLATZ      INTEGER,
    O_ORT        VARCHAR(15),
    O_ADRESSE    COMPUTED BY (case when (o_strasse) is null and (o_platz) is null then
o_ort
when (o_strasse) is null and (o_ort) is null then
o_platz
when (o_strasse) is null and (o_platz) is not null and (o_ort) is not null then
o_ort||' '||o_platz
when (o_strasse) is not null and (o_platz) is null and (o_ort) is null then
o_strasse
when (o_strasse) is not null and (o_platz) is null and (o_ort) is not null then
o_ort||', '||o_strasse
when (o_strasse) is not null and (o_platz) is not null and (o_ort) is null then
o_platz||', '||o_strasse
when (o_strasse) is not null and (o_platz) is not null and (o_ort) is not null then
o_platz||' '||o_ort||', '||o_strasse end),
    MWST         SMALLINT,
    ZAHLUNG      SMALLINT,
    ABLAGE       VARCHAR(10),
    LZ           DATE,
    FUR          VARCHAR(100),
    SKONTO       FLOAT DEFAULT 0,
    STORNO       SMALLINT DEFAULT 0,
    ZSUMME       COMPUTED BY (case when (skonto is not null) and (mwst is not null) and (betrag is not null) then
((100 - skonto) / 100) * betrag else 0 end),
    RSKONTO      COMPUTED BY (case when (skonto is not null) and (betrag is not null) then
(skonto / 100) * betrag else 0 end),
    RMWST        COMPUTED BY (case when (skonto is not null) and (mwst is not null) and (betrag is not null) then
((((100 - skonto) / 100) * betrag) / 100) * mwst
when (skonto is null) and (mwst is not null) and (betrag is not null) then
(betrag / 100) * mwst else 0 end),
    BRUTTO       COMPUTED BY ((((100 + mwst) / 100)) * ((((100 - skonto) / 100) * betrag)))
);




/******************************************************************************/
/****                             Primary Keys                             ****/
/******************************************************************************/

ALTER TABLE RECHNUNG ADD CONSTRAINT PK_RECHNUNG PRIMARY KEY (RECHNUNG_ID);


/******************************************************************************/
/****                               Triggers                               ****/
/******************************************************************************/


SET TERM ^ ;
yukarida belirttigin sekilde de denedim fakat sonuc yine ayni. 970 veriyor...
kıdemsiz üye
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

120/100 u ne yaptıysam 1.2 diye algılatamadım
select cast(120/100 as numeric(10,2)) from rdb$database
select cast(120/100 as double precision) from rdb$database

problem bu kesirden kaynaklanıyor.
gozden kacan birsey var ama cıkar elbet
ÜŞENME,ERTELEME,VAZGEÇME
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Mesaj gönderen ikra »

hocam 1.2 yi cikartiyorum ki, miktari 1.2 ile carptigimda %20 lik bir kdv eklemis oluyorum...
kıdemsiz üye
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,

Kod: Tümünü seç

(miktar-(miktar*iskonto/100))+((miktar-(miktar*iskonto/100))*kdv/100)


şeklinde yaparsanız istediğiniz sonucu verir. Verdiğiniz rakamlarla denedim. Sizin 1164 ü çıkardı.

acele ile yanlış yazmışım düzellttim. :oops:
İyi çalışmalar.
En son ofenX tarafından 14 Eyl 2005 05:45 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Mesaj gönderen ikra »

ofenx yazdı:Merhaba,

Kod: Tümünü seç


(Miktar-(miktar*iskonto/100))+((miktar*iskonto/100)*kdv/100)
hocam aynen dedigin gibi yaptim... bire bir kopyaladim fakat sonuc yine 970... bir anlam veremedim. hesap makinasinda yapiyorum sonuc 1164 ve firebird de yaptigimda sonuc 970...
kıdemsiz üye
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
yukarıdaki kodu eksik göndermişim. şu an düzelttim ve 1164 ü veriyor.

İyi çalışmalar.
onaydin

Mesaj gönderen onaydin »

120/100 u ne yaptıysam 1.2 diye algılatamadım
select cast(120/100 as numeric(10,2)) from rdb$database
120.00/100.00 veya cast ı dışarda değilde her bir rakam için kullanarak olabilir. Cast ile sonuçta 1 değerini 1.00 a çeviriyorsunuz.

viewtopic.php?t=6254
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

Merhaba,

KDV alanını SMALLINT tanımlamışsınız sanırım, onu float ya da double precision olarak değiştirirseniz düzelir. Çünkü iki integer sayının sonucu yine bir integer sayı olur. Ama ben veri türünü değiştirmicem diyorsanız:

Kod: Tümünü seç

((100 + kdv) / 100.0) * (((100 - iskonto) / 100) * miktar)

olarak belirtin computed source alanını

İyi çalışmalar
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

evet onur dedigin gibi
bazen kor oluyor insan ne yaptıgını goremiyor :)
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Genelde SP lerde dahi tamsayı olmayan değişkenlere 100.0 şeklinde atama yapmak sanırım iyi bir alışkanlık. Burada da aynı olay oluyor. İşlemde tamsayıları bölünce sonucu tamsayı çıkartıyor.. Sayılardan en az biri float şeklinde

Kod: Tümünü seç

select cast(120.0/100 as numeric(10,2)) from rdb$database 
şeklinde yazılmalı.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Mesaj gönderen ikra »

Hocalarim degerli fikirlerinizi benimle paylastiginiz icin cok cok cok tesekkür ediyorum...
ALTIN fikirlerinizin dogrultusunda dogru sonuca ulastim. hata kdv'yi tam sayi olarak belirtmemden kaynaklaniyor mus :oops:
bu sekilde 1.2 yi tam sayi olarak görüp yani ( 1 ) 970 x 1.2 yerine 970 x 1 yapip yine 970 sonucunu veriyormus...
Gkimirti kocaminda dedigi gibi bazen kör olabiliyor insan...
kıdemsiz üye
Cevapla