firebird de Yürüyen Bakiye ve CURSOR

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
boreas
Üye
Mesajlar: 120
Kayıt: 05 Tem 2007 12:39
Konum: Ankara

Re: firebird de Yürüyen Bakiye ve CURSOR

Mesaj gönderen boreas »

Tahminen engelleyemezsin o işlemleri sql ile yaparsan daha sağlıklı olur. İşlem öncesinde bakiye sıfırla ya da bakiyeyi şu tarihler arasına topla gibi birşekilde çözersin. Alternatif olarak sorguyu yaptıktan sonra memory table'a aktarıp filitreleme işlemlerini orada yaparsın ama editleme yaptırmazsın.
....
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: firebird de Yürüyen Bakiye ve CURSOR

Mesaj gönderen esistem »

Selam,
O işlemde önceden gelen devir bakiye önemli oluyor sonuçta, sorguyu çalıştırmadan önce seçilen başlangıç tarihinden önceki bakiyeyi alıp, bky# değişkenini sıfırladığın sorguya parametre olarak bu değeri gönderirseniz sorgu önceden gelen bakiyenin üzerinden işleme devam edeceği için bakiyeleriniz düzgün hesaplanacaktır diye düşünüyorum fakat deneme şansım olmadı.
akuyumcu63
Üye
Mesajlar: 386
Kayıt: 02 Tem 2007 09:43

Re: firebird de Yürüyen Bakiye ve CURSOR

Mesaj gönderen akuyumcu63 »

merhaba;
paradox veri tabanıyla bir program yazmıştım. bu sorunu orada da yaşamıştım. dediğiniz gibi bir çözüm üretmiştim. ancak çok verimli olmuyordu. filitreleme sadece iki tarih arası yapılmıyor diğer alanlar içinde yapılmakta. bakiye alanı filitrelemelerden etkilenmemeli. bakiye etkilendiği zaman sanki hesaplama hatası varmış gibi bir izlenim bırakıyor. bu da olmuyor.

Kod: Tümünü seç

EXECUTE BLOCK
RETURNS(ID BIGINT, BORC DOUBLE PRECISION, ALACAK DOUBLE PRECISION, KALAN DOUBLE PRECISION)
AS
DECLARE VARIABLE DYN_KALAN DOUBLE PRECISION;
BEGIN
  DYN_KALAN = 0.00;
  FOR
   SELECT ID, Trunc(COALESCE(BORC,0),2), Trunc(COALESCE(ALACAK,0),2) FROM TBLKASAHAR  WHERE (KASAID='7') and (DOVIZ='TL') ORDER BY TARIH asc, ID asc
   INTO :ID, :BORC, :ALACAK DO
    BEGIN
      DYN_KALAN = DYN_KALAN + BORC - ALACAK;
      KALAN = DYN_KALAN;
    SUSPEND;
    END
END;
Bu kodda parametreyi FdQuery içinde belirterek yaklaşık 40000 kasa hareketinde 1-2 sn içinde sonuç aldım. filitrelemelerde nasıl bir sonuç üretiyor bilmiyorum. delphiden parametre gönderebilirsek filitrelemelerde sorun çıkarmazsa süper kod olur. vaktin varsa bir dene derim.
İsteyen, yapabildiğinden daha fazlasını yapar.
akuyumcu63
Üye
Mesajlar: 386
Kayıt: 02 Tem 2007 09:43

Re: firebird de Yürüyen Bakiye ve CURSOR

Mesaj gönderen akuyumcu63 »

kodla ilgili kaynağı tekrar belirteyim ayıp olmasın :D
http://www.access-sql.com/Konu-Firebird ... Uygulamasi

istersen buraya da bak.
İsteyen, yapabildiğinden daha fazlasını yapar.
akdatilla
Üye
Mesajlar: 292
Kayıt: 02 Nis 2006 06:04
Konum: Antalya

Re: firebird de Yürüyen Bakiye ve CURSOR

Mesaj gönderen akdatilla »

Merhaba,
Benim bu konuda yazdıklarımı tekrar okuyup değerlendirseniz, belki faydalı olabilir.
Kolay gelsin.
akuyumcu63
Üye
Mesajlar: 386
Kayıt: 02 Tem 2007 09:43

Re: firebird de Yürüyen Bakiye ve CURSOR

Mesaj gönderen akuyumcu63 »

merhaba;

akdatilla kardeş mesajını ara ara okudum ama inan dediğini anlamaya bilgim yetmedi. yinede ilgin için teşekkür ederim.

boreas hocam;
Öncelikle firebirdde #bky adında kullanıcı tanımlı bir değişken açıp içeriğini sıfıra eşitledim.

Kod: Tümünü seç

SELECT rdb$set_context( 'USER_TRANSACTION' ,'bky#' ,0) from rdb$database;
demişsiniz.
size sormak istediğim #bky değişkenine değer nasıl gönderebilirim. ilk değerini sıfır değilde iki tarih arası filitreleme yaparken daha önceki kayıtların borc ve alacak kayılarının toplamını alıp o tarihe kadar olan bakiyeyi buluyorum. bulduğum bakiye değerini bky# değişkenine göndererek bakiyeyi hesaplatırsam yürüyen bakiyede hatalı bakiye oluşmaz diye düşünüyorum.
İsteyen, yapabildiğinden daha fazlasını yapar.
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: firebird de Yürüyen Bakiye ve CURSOR

Mesaj gönderen esistem »

Parametre kullanarak tabiki. Sonuçta bir sorgu gönderiyorsunuz.
Mesela QBakiyeSifirla query sine yazdınız kodu ama yazarken şöyle yapın,

Kod: Tümünü seç

SELECT rdb$set_context( 'USER_TRANSACTION' ,'bky#' , :deger) from rdb$database;
deger isminde bir parametre belirledik, Sorguyu close/open yapıyorsunuz bky değerini sıfırlamak için, bunun yerine;

Kod: Tümünü seç

QBakiyesifirla.Close;
QBakiyesifirla.ParamByName('deger').AsFloat:=100;
QBakiyesifirla.Open;
yaparsanız değer 100 den başlıyacaktır.
akuyumcu63
Üye
Mesajlar: 386
Kayıt: 02 Tem 2007 09:43

Re: firebird de Yürüyen Bakiye ve CURSOR

Mesaj gönderen akuyumcu63 »

çok teşekkür ederim. güzel oldu.
İsteyen, yapabildiğinden daha fazlasını yapar.
Cevapla