Firebird ile BORC ALACAK BAKIYE

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: Firebird ile BORC ALACAK BAKIYE

Mesaj gönderen Kuri_YJ »

Selamlar,

Bu arada bir eklenti yapayım. Henüz test etmedim ama RDBMS'lerdeki mantık gereği, bu tür Yürüyen bakiye'lerde Nested Query'ler kullanmak, hem sistemi yorar hem de fazla kaynak tüketir. Tabi doğal olarak da vakit alıcı olur. Bu tür Query'ler yerine Procedure hazırlamanızı öneririm. Test edip deneyeceğim. Sonuçlarını da yazacağım.

Kolay Gelsin
Adnan
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: Firebird ile BORC ALACAK BAKIYE

Mesaj gönderen Kuri_YJ »

Selamlar,

Az önce testlerimi tamamladım.

Daha önceden hazırladığım bir SP ile, Nested Query içeren Yürüyen Bakiye Sorgusunu kıyasladım. Sonuçlar tahmin ettiğim gibi çıktı.

173,000 civarı Cari Hareket olan bir tabloda, Yaklaşık 6,000 kadar Cari Karta ait Ekstre hazırladım.

1 dakika 42 Saniye'de Nested Query çalıştı.

10 Saniye Stored Procedure sürdü. (Ki SP'nin içinde bir sürü kontrol de var.)

Bunların dışında bu işlemleri yaparken Kartezyen çarpıma girip, dolaştığı kayıt sayıları 100,000,000'u geçiyor.

Dediğim gibi bu tür bir şey için SP yazıp kullanırsanız daha hızlı sonuç alırsınız ve sistem kaynaklarını da daha efektif kullanmış olursunuz.

Kolay Gelsin
Adnan
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
akuyumcu63
Üye
Mesajlar: 386
Kayıt: 02 Tem 2007 09:43

Re: Firebird ile BORC ALACAK BAKIYE

Mesaj gönderen akuyumcu63 »

merhaba;

Kod: Tümünü seç

SELECT CH.ID,CH.CARIID,CH.TARIH,CH.BORC AS BORC,CH.ALACAK AS ALACAK,
          (SELECT ABS(COALESCE(SUM(BORC),0) - COALESCE(SUM(ALACAK),0)) FROM TBLCARIHAR WHERE TBLCARIHAR.CARIID=CH.CARIID) as bakiye
FROM TBLCARIHAR CH
WHERE (CH.CARIID=24)
ORDER BY TARIH, ID
kodu yukarıdaki şekilde değiştirdim. iki kodda da bana verdiği sonuç, bakiye sütunundaki her hücrede seçilen carinin toplam borç ile alacağının farkını yazıyor. her satırdaki bakiyeyi ayrı ayrı vermiyor. aşağıdaki gibi bir sonuç veriyor. halbuki birinci satırda bakiye 10 ikinci satırda bakiye 5 üçüncü satırda bakiye 35 son satırda da bakiye 20 olmalıdır

borç alacak bakiye
10 0 20
0 5 20
30 0 20
0 15 20
İsteyen, yapabildiğinden daha fazlasını yapar.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: Firebird ile BORC ALACAK BAKIYE

Mesaj gönderen Kuri_YJ »

Selamlar,

Yürüyen bakiye işlemlerinde, Query'nin hesap yaptığı satır için Nested Query'nin Where şartları ayarlanmalı.

Kod: Tümünü seç

SELECT CH.ID,CH.CARIID,CH.TARIH,CH.BORC AS BORC,CH.ALACAK AS ALACAK,
          (SELECT ABS(COALESCE(SUM(BORC),0) - COALESCE(SUM(ALACAK),0)) FROM TBLCARIHAR WHERE TBLCARIHAR.CARIID=CH.CARIID  XXXXXXXXXXXX) as bakiye
FROM TBLCARIHAR CH
WHERE (CH.CARIID=24)
ORDER BY TARIH, ID
Yukarıda XXXXXXXXXX şeklinde yazılı olan yere Ana Tablon olan CH'deki Tarih ile, SUM çektiğin tablo olan TBLCARIHAR için

AND TBLCARIHAR.TARIH <= CH.TARIH AND TBLCARIHAR.ID <= CH.ID

bunu eklemelisin. Haa bir de SUM Querysinde ORDER BY TBLCARIHAR.CARIID, TBLCARIHAR.TARIH, TBLCARIHAR.ID eklemelisin.

Kolay Gelsin
Adnan
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
akuyumcu63
Üye
Mesajlar: 386
Kayıt: 02 Tem 2007 09:43

Re: Firebird ile BORC ALACAK BAKIYE

Mesaj gönderen akuyumcu63 »

merhaba;

çok teşekkür ederim. dediğiniz şekilde oldu. kolay gelsin;
İsteyen, yapabildiğinden daha fazlasını yapar.
Cevapla