Firebird Mizan Procedure

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
Kullanıcı avatarı
softdestek
Üye
Mesajlar: 155
Kayıt: 17 Eyl 2010 03:53

Firebird Mizan Procedure

Mesaj gönderen softdestek »

İki tane tablom var basit halleri şu şekilde
"HESAPKODLAR" tablosu yapısı aşağıda
HESAPKODU HESAPADI
100 Kasa hesabı
200 Banka hesabı
300 Gelirler hesabı

"HESAPLAR" tablosu yapısı aşağıdadır.
HESAPKODU BORC ALACAK
100 30 0
200 15 0
300 0 20
100 40 0
200 30 0

İstediğim şey şu Procedure hesapkodlarını sıra ile listeleyecek listelerkende hesaplar tablosundaki
borçlarıbulacak
SELECT HesapKodu, HesapAdi
FROM HesapKodlar
WHERE
(HesapKodlar.HesapKodu >= :PBasKod)
AND (HesapKodlar.Hesapkodu < :PBitKod)


ORDER BY HesapKodu
INTO: HESAPKODU, HESAPADI
do
SUSPEND;
end

Yukardaki procedure
select SUM(HESAPLAR.BORC), SUM(HESAPLAR.ALACAK)FROM HESAPLAR
where HESAPLAR.hesapkodu=:hesapkodu
INTO :BORC,:ALACAK;
ŞEKLİNDE BORC VE ALACAK toplamlarınıda eklemek istiyorum..

KISACASI HESAPKODLAR LİSTENİRKEN O HESABIN TOPLAM BORC VE ALACAĞI DA BULACAK PROCEDURE YAZMAM LAZIM..
TEŞEKKÜRLER..
NOT:Aşağıda aynı işi yapan bir sql kodu yazdım fakat yavaş çalışıyor..

select
HESAPKODLAR.hesapkodu,
(select SUM(HESAPLAR.BORC) FROM hesaplar WHERE HESAPLAR.HESAPKODU=HESAPKODLAR.hesapkodu) AS TOPLAMBORC,
(select SUM(HESAPLAR.ALACAK) FROM hesaplar WHERE HESAPLAR.HESAPKODU=HESAPKODLAR.hesapkodu) AS TOPLAALACAK
FROM hesapkodlar
ORDER BY hesapkodlar.HESAPKODU
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Firebird Mizan Procedure

Mesaj gönderen sabanakman »

Kod: Tümünü seç

elect * from hesapkodlar as kod
left join (select HESAPKODU, sum(BORC) as BORC, sum(ALACAK) as ALACAK from hesaplar) as toplam on kod.HESAPKODU=toplam.HESAPKODU
:mrgreen:
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
softdestek
Üye
Mesajlar: 155
Kayıt: 17 Eyl 2010 03:53

Re: FIREBIRD MiZAN PROCEDURE

Mesaj gönderen softdestek »

Örnek firebird veritabanını incelerken procedure nasıl yazacağımı buldum..
Toplamı veren Query kodu yazdım..Ama maalesef query bayağı uzun sürüyor.İndexlerde var ama artık idare edecekler.
2690 civarında hesapkodu işlem görüyor...Bunları like operatörü ile toplatıyorum ..
Tek sorununum şu anda BORÇBAKİYE VE ALACAKBAKIYE MİKTARINI BULMAK Onun cevabınıda bulursam süper olaacak..
Teşekkür ederim...
Ama merak ettiğim bir şey var acaba aynı veriler SQL SERVERDA OLSA hangisi daha hızlı çözüm bulurdu...
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: FIREBIRD MiZAN PROCEDURE

Mesaj gönderen sabanakman »

Yavaş dediğiniz sorguyu sadece detayların toplamını bulacak

Kod: Tümünü seç

select HESAPKODU, sum(BORC) as BORC, sum(ALACAK) as ALACAK from hesaplar
şekilde deneyin, ne kadar sürüyor?
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
anemos
Üye
Mesajlar: 110
Kayıt: 02 Nis 2007 07:51
Konum: Sakarya / Hendek

Re: Firebird Mizan Procedure

Mesaj gönderen anemos »

Mizan queryleri yavaş oluyor nedense. SQL server da olsa çok farkedeceğini sanmıyorum. Mizanlar için ayrı bir hesap tablosu oluşturup, fiş tablosunun trigger ile mizan tablosundaki alanları güncelleyin; liste anında ekrana gelsin.
Kullanıcı avatarı
doctorfunks
Üye
Mesajlar: 105
Kayıt: 26 Oca 2005 10:37
Konum: İstanbul

Re: Firebird Mizan Procedure

Mesaj gönderen doctorfunks »

indexlerin sıralamasını where şartı ve order by düzenine göre olmasnıa dikkat edin, olmazsa plan kullanarak direkt bu iş için şu index'i kullan diyebilirsiniz,
bakiye hesaplamasında kebirlerde grup by having ile işlemi yaparsanız hızlı olur
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3077
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Firebird Mizan Procedure

Mesaj gönderen sabanakman »

sabanakman yazdı:

Kod: Tümünü seç

select HESAPKODU, sum(BORC) as BORC, sum(ALACAK) as ALACAK from hesaplar
Hız sorunu için çok boyutlu düşünmek gerekmektedir. (Doğru veritabanı tasarımından sonra) yukarıdaki gibi bir sorgu "detayların toplamlarını" gayet hızlı bir biçimde vermektedir. Bu sorguda sorun çıkaran mesele ara başlıklar da dahil tüm ana kodlara gerekli toplamların dağıtılmasıdır. Burada SQL + Delphi kodu ile kabul edilebilir sürelerde sonuç alabilirsiniz. Bu iki aşamalı işlemin ilk ayağında sadece SQL sorgusu kullanarak yukarıdaki gibi sadece detaylara ait toplamlar elde edilir. Sonraki aşamada ise hesap kodları belleğe alınır (sanal tablo veya dizi olabilir ama ClientDataSet gibi bellekte oluşan geçici bir tablo kullanılabilir). Artık geriye detay toplamlar ve hesap kodlarını harmanlamak kalıyor. İşi kısa sürede bitirecek asıl püf noktası burada yatmaktadır. Ana kodlara ait ek bir dizi oluşturup detay toplamlarını buradaki gerekli ana başlıklara topladıktan sonra bu toplamlar dizisini sanal tablodaki yerlerine yazıp göstererek, kayıtlardan hesap yaparak kabul edilebilir bir sürede sonuca ulaşmak mümkün olmaktadır.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Re: Firebird Mizan Procedure

Mesaj gönderen Hakan Can »

Şuna benzer bir query ile çok hızlı sonuç dönmesi gerekir (hesapkodu alanı her iki tabloda da indeksli ise) :

Kod: Tümünü seç

SELECT
  T1.HESAPKODU,
  T2.TOPLAMBORC,
  T2.TOPLAMALACAK
FROM HESAPKODLAR T1
  LEFT JOIN
    (
     SELECT
       HESAPKODU,
       SUM(BORC) AS TOPLAMBORC,
       SUM(ALACAK) AS TOPLAMALACAK
     FROM HESAPLAR
     GROUP BY HESAPKODU
    ) T2 ON T2.HESAPKODU = T1.HESAPKODU
Buna benzer queryler MS SQL Server'da çok hızlı sonuç döndürüyor.
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2247
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Re: Firebird Mizan Procedure

Mesaj gönderen Kuri_YJ »

Selamlar,

Kod: Tümünü seç


SELECT A.HESAPKODU, A.HESAPADI, SUM(B.BORC) SNL_TOPLAM_BORC, SUM(B.ALACAK) SNL_TOPLAM_ALACAK
FROM HESAPKODLAR A
  INNER JOIN HESAPLAR B ON A.HESAPKODU = B.HESAPKODU 
GROUP BY A.HESAPKODU, A.HESAPADI

Eğer B tablosunda HESAPKODU'na göre index varsa, yüzbin hareket kaydı bile olsa şak diye hesaplar. 1-2 saniye içinde sonucu verir. (Tabi FB'nn CONF dosyasını da elleçlediyseniz şakır şukur yanıt verir size)

Yalnız yukarıdaki Sorgu'da, hareket kaydı olmayan hesaplar görülmez. Eğer onların da görülmesini isterseniz sadece INNER JOIN ifadesini, LEFT OUTER JOIN olarak değiştirin.

Aklınızda bulunsun, INNER JOIN, LEFT OUTER JOIN'den daha hızlı çalışır.

Ayrıca, WHERE koşuluna da, istediğiniz şartları eklersiniz. Yani, herhangi bir tarih sınırlaması olabilir veya Hesap Kodu sınırlaması olabilir.

Bir eklenti daha yapayım. Bu bahsettiğiniz iş için Procedure yapmanıza gerek yok. Tek bir Query ile halledilebilecek bir konu. Yapılsa da olur yapılmasa da. Ben olsam bu iş için Procedure yazmazdım.

Kolay Gelsin
Adnan
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Cevapla