Firebird Mizan Procedure
- softdestek
- Üye
- Mesajlar: 155
- Kayıt: 17 Eyl 2010 03:53
Firebird Mizan Procedure
İ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 >= BasKod)
AND (HesapKodlar.Hesapkodu < BitKod)
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
"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 >= BasKod)
AND (HesapKodlar.Hesapkodu < BitKod)
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
- 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
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
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
- softdestek
- Üye
- Mesajlar: 155
- Kayıt: 17 Eyl 2010 03:53
Re: FIREBIRD MiZAN PROCEDURE
Ö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...
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...
- 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
Yavaş dediğiniz sorguyu sadece detayların toplamını bulacakşekilde deneyin, ne kadar sürüyor?
Kod: Tümünü seç
select HESAPKODU, sum(BORC) as BORC, sum(ALACAK) as ALACAK from hesaplar
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
Re: Firebird Mizan Procedure
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.
- doctorfunks
- Üye
- Mesajlar: 105
- Kayıt: 26 Oca 2005 10:37
- Konum: İstanbul
Re: Firebird Mizan Procedure
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
bakiye hesaplamasında kebirlerde grup by having ile işlemi yaparsanız hızlı olur
- 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
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.sabanakman yazdı:Kod: Tümünü seç
select HESAPKODU, sum(BORC) as BORC, sum(ALACAK) as ALACAK from hesaplar
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
Re: Firebird Mizan Procedure
Şuna benzer bir query ile çok hızlı sonuç dönmesi gerekir (hesapkodu alanı her iki tabloda da indeksli ise) :
Buna benzer queryler MS SQL Server'da çok hızlı sonuç döndürüyor.
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
Re: Firebird Mizan Procedure
Selamlar,
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
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
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/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/