Biraz anlatayım. Extre tablosunda son durum ve son durum 2 adında 2 alan var. Bu alanlara extre tablosundaki tarih ve ide göre sıralanıp ilk kayıttan başlayıp döngü ile her satırdaki işleme göre o andaki bakiyeyi atıyor son durum 2 alanına ise bir önceki bakiye atılıyor ki 2 tarih arası sorgularda devredeni görmek için. sondurum2 alanı 2 tarih arası sorgulama yapılınca gösteriliyor extre formunda devreden adı altında.
Örnekle açıklamak gerekirse
1. İşlemde satış yapılmış 5 tl lik son durum bakiye 5 tl - sondurum2 ise 0 olmuş.
2. İşlemde 1 liralık satış yapılmış son durum 6 lira - sondurum2 ise 5 olmuş.
3. İşlemde 5 tl lik ödeme yapılmış son durum 1 lira sondurum2 ise 6 olmuş.
4. İşlemde 8 lira satıl olmuş son durum tekrar artarak 9 lira - sondurum2 ise 1 olmuş.
5. İşlemde 8 liralık satış olmuş son durum 17 tl - sondurum2 ise 9 olmuş.
6. İşlemde 5 tl lik ödeme ypılmış son durum 12 ye - sondurum2 ise 17 düşmüş.
7.işlemde 160 tl borç işlenmiş son durum 172 tl - sondurum2 ise 12 olmuş
döngüye girip işlem türüne bakıp borcçsa bakiyesi artan, ödeme ve iade ise bakiye azalan bir şekilde önce değişkene en sonda ilgili alanlara editlenip post ediliyor. kayıt sayısı az olan işlemlerde süre az ama 1000 leri geçince ( bbu şimdi bin olur yarın yüzbin olur bilinmez) müthiş zaman almakta. 2300 kayıt olan extre 4 çekirdeğe sahip 4 gb li ram olan pc de yaklaşık 6 dakka sürüyor. siz düşünün bu 10000 olsa 100 000 olsa ne olacak.
Bu işlemi başka nasıl yapabilirim? bu konuda her fikre öneriye açığım. firebird 2.0 veri tabanı kullanmaktayım. Herkese saygılar sunarım.
kodum şu şekilde.
Kod: Tümünü seç
procedure Talinanlar_form.SonDurumHesapla(ILK:Boolean);
VAR BAKIYE,BAKIYE2 : DOUBLE;
I:Integer;
BEGIN
IF DM.extre_query.RecordCount=0 THEN Exit;
order:='TARIH,ID';
Filitre;
dm.extre_query.First;
BAKIYE:=0; // bakiye değişekni sıfırlanıyor
I:=1;
WHILE NOT(dm.extre_query.EOF) DO // döngü yapıyor
begin
Application.ProcessMessages;
bsSkinLabel1.Caption:='HESAPLANAN İŞLEM SAYISI / TOPLAM İŞLEM SAYISI : ' + IntToStr(I)+' / '+IntToStr(dm.extre_query.RecordCount);
I:=I+1;
BAKIYE2:=BAKIYE;// burada bakiye 2 alanı devreden için kullanıldığından bir önceki bakiyeyi tutması için eşilendi.
IF (dm.extre_query.FieldByName('TOPLAMTUTAR').AsFloat> 0) and (dm.extre_query.FieldByName('TUR').AsString <> 'İADE')THEN
BAKIYE:=BAKIYE+dm.extre_query.FieldByName('TOPLAMTUTAR').AsFloat;
IF dm.extre_query.FieldByName('ODEME').AsFloat> 0 THEN
BAKIYE := BAKIYE - dm.extre_query.FieldByName('ODEME').AsFloat;
dm.extre_query.Edit;
dm.extre_query.FieldByName('SON_DURUM').AsFloat:= BAKIYE; // son duruma değişeken toplanan bakiyeyyi atıyorum
dm.extre_query.FieldByName('SON_DURUM2').AsFloat:= BAKIYE2; // DEVREDEN BAKİYE ICIN
dm.extre_query.Post;
dm.extre_query.Next;
end;
end;