OnCalcFields ile Yürüyen Bakiye Sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
abdullahcetinel
Üye
Mesajlar: 35
Kayıt: 12 Ağu 2014 09:45

OnCalcFields ile Yürüyen Bakiye Sorunu

Mesaj gönderen abdullahcetinel »

Merhaba;

Programımda OnCalcFields olayı ile Yürüyen Bakiye hesaplaması yaptırmak istiyorum. Aşağıdaki kodlarla ilk çalıştırdığımda sorun yok.

Kod: Tümünü seç

  private
    { Private declarations }
  public

    { Public declarations }
  end;

var
  Form1: TForm1;
  oncekibakiye:currency;
implementation

{$R *.dfm}

procedure TForm1.ADOQuery1CalcFields(DataSet: TDataSet);
begin
  if ADOQuery1Borc.Value<>0 then
    begin
      ADOQuery1YBakiye.Value:=ADOQuery1Borc.Value+oncekibakiye;
      oncekibakiye:=ADOQuery1YBakiye.Value;
    end
  else
    begin
      ADOQuery1YBakiye.Value:=oncekibakiye-ADOQuery1Tahsilat.Value;
      oncekibakiye:=ADOQuery1YBakiye.Value;
    end;
end;

end.
Fakat tabloda çok fazla veri varsa dbgrid üzerinde aşağı yukarı kaydırma (scroll) yapınca Hesaplama tekrar yapılıyor yani OncalcFields olayı tetikleniyor. Buda bütün verilerin yanlış hesaplanmasına yol açıyor. Benim istediğim tabloda ekleme, silme, düzenleme işlemi olmadığı sürece bu hesaplamayı bir defa yapsın. Amacım yürüyen bakiye hesaplatmak başka bir yöntemi varsa oda olur 4-5 aydır bu sorunu çözemedim.
Resim
Resim
Resim

Programın kaynak kodu http://s6.dosya.tc/server6/tbbx6o/Yuruy ... e.rar.html
Kullanıcı avatarı
bulutsuzluk_35
Üye
Mesajlar: 124
Kayıt: 06 Eki 2007 04:14
Konum: İzmir-Ankara-İstanbul-Antalya
İletişim:

Re: OnCalcFields ile Yürüyen Bakiye Sorunu

Mesaj gönderen bulutsuzluk_35 »

oncalcfields içine kodun başına
if dataset.state in [dsbrowse] then exit;
denermisin

Kod: Tümünü seç

try
  try
    inc(Bilgi);
  except
    sabir;
  end;
finally
  inc(Mutluluk);
end;
abdullahcetinel
Üye
Mesajlar: 35
Kayıt: 12 Ağu 2014 09:45

Re: OnCalcFields ile Yürüyen Bakiye Sorunu

Mesaj gönderen abdullahcetinel »

bulutsuzluk_35 yazdı:oncalcfields içine kodun başına
if dataset.state in [dsbrowse] then exit;
denermisin
Denedim malesef aynı.
erdogan_ozkaya
Üye
Mesajlar: 839
Kayıt: 03 Eki 2007 02:00

Re: OnCalcFields ile Yürüyen Bakiye Sorunu

Mesaj gönderen erdogan_ozkaya »

aşağıdakini kodu kullanıyorum bir sıkıntı yok, umarım işine yarar

Kod: Tümünü seç

procedure TENVANTER_LISTESI_PENCERE.qryENVANTAR_LISTESICalcFields(
  DataSet: TDataSet);
var
  USD_ALIS,
  USD_SATIS,
  EURO_ALIS,
  EURO_SATIS,
  TL : Real;
  ALIS_TUTAR,SATIS_TUTAR,
  PARA_BIRIMI,SATIS_PARA_BIRIMI: Real;
begin
    USD_ALIS:=strtofloat(ANA_SAYFA.editUSD_ALIS.Text);
    USD_SATIS:=strtofloat(ANA_SAYFA.editUSD_SATIS.Text);
    EURO_ALIS:=strtofloat(ANA_SAYFA.editEURO_ALIS.Text);
    EURO_SATIS:=strtofloat(ANA_SAYFA.editEURO_SATIS.Text);
    TL:=strtofloat('1');


      if   (qryENVANTAR_LISTESI.Fieldbyname('ALIS_PARA_BIRIMI').Text='USD') and (ANA_SAYFA.editUSD_SATIS.Text<>'Alınamadı')
      then qryENVANTAR_LISTESI.Fieldbyname('ALIS_TL').Value:=qryENVANTAR_LISTESI.Fieldbyname('ALIS_FIYATI').Value * FloatToStr(USD_SATIS);

      if   (qryENVANTAR_LISTESI.Fieldbyname('ALIS_PARA_BIRIMI').Text='EURO') and (ANA_SAYFA.editUSD_SATIS.Text<>'Alınamadı')
      then qryENVANTAR_LISTESI.Fieldbyname('ALIS_TL').Value:=qryENVANTAR_LISTESI.Fieldbyname('ALIS_FIYATI').Value * FloatToStr(EURO_SATIS);

      if   (qryENVANTAR_LISTESI.Fieldbyname('ALIS_PARA_BIRIMI').Text='TL') and (ANA_SAYFA.editUSD_SATIS.Text<>'Alınamadı')
      then qryENVANTAR_LISTESI.Fieldbyname('ALIS_TL').Value:=qryENVANTAR_LISTESI.Fieldbyname('ALIS_FIYATI').Value * FloatToStr(TL);




      
      if   (qryENVANTAR_LISTESI.Fieldbyname('SATIS_PARA_BIRIMI').Text='USD') and (ANA_SAYFA.editUSD_SATIS.Text<>'Alınamadı')
      then qryENVANTAR_LISTESI.Fieldbyname('SATIS_TL').Value:=qryENVANTAR_LISTESI.Fieldbyname('SATIS_FIYATI').Value * FloatToStr(USD_SATIS);

      if   (qryENVANTAR_LISTESI.Fieldbyname('SATIS_PARA_BIRIMI').Text='EURO') and (ANA_SAYFA.editUSD_SATIS.Text<>'Alınamadı')
      then qryENVANTAR_LISTESI.Fieldbyname('SATIS_TL').Value:=qryENVANTAR_LISTESI.Fieldbyname('SATIS_FIYATI').Value * FloatToStr(EURO_SATIS);

      if   (qryENVANTAR_LISTESI.Fieldbyname('SATIS_PARA_BIRIMI').Text='TL') and (ANA_SAYFA.editUSD_SATIS.Text<>'Alınamadı')
      then qryENVANTAR_LISTESI.Fieldbyname('SATIS_TL').Value:=qryENVANTAR_LISTESI.Fieldbyname('SATIS_FIYATI').Value * FloatToStr(TL);


     qryENVANTAR_LISTESI.Fieldbyname('GIRIS_MALIYET').Value:=  ///10*5=50
     qryENVANTAR_LISTESI.Fieldbyname('GIREN').Value *
     qryENVANTAR_LISTESI.Fieldbyname('ALIS_TL').Value;

     qryENVANTAR_LISTESI.Fieldbyname('CIKAN_SATIS_TOPLAM').Value:=
     qryENVANTAR_LISTESI.Fieldbyname('CIKAN').Value *
     qryENVANTAR_LISTESI.Fieldbyname('SATIS_TL').Value;


     qryENVANTAR_LISTESI.Fieldbyname('TOPLAM_KAR').Value:=
     qryENVANTAR_LISTESI.Fieldbyname('CIKAN_SATIS_TOPLAM').Value -
     qryENVANTAR_LISTESI.Fieldbyname('GIRIS_MALIYET').Value;
 

end;
abdullahcetinel
Üye
Mesajlar: 35
Kayıt: 12 Ağu 2014 09:45

Re: OnCalcFields ile Yürüyen Bakiye Sorunu

Mesaj gönderen abdullahcetinel »

Erdoğan Bey kod için teşekkürler. Yanlış anlamadıysam sizde genellikle hesaplama işlemleri aynı satır içinde gerçekleşiyor. Örnek fiyat*Adet=Tutar şeklinde o konuda zaten bende sıkıntı yok. Ben 1.satırdan başlayarak borçsa toplayacak tahsilatsa çıkaracak şekilde istiyorum. Şimdiye kadar tablo sonu kontrol ile veritabanına kaydederek yaptırdım. Çalışıyor fakat 150-200 kayıttan sonra tarama uzadığından müşeriyi bekletiyor. Bu beklemeden kurtarmak için oncalcfields olayını kullanmak istiyorum.
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: OnCalcFields ile Yürüyen Bakiye Sorunu

Mesaj gönderen esistem »

Veritabanı olarak ne kullanıyorsunuz?
abdullahcetinel
Üye
Mesajlar: 35
Kayıt: 12 Ağu 2014 09:45

Re: OnCalcFields ile Yürüyen Bakiye Sorunu

Mesaj gönderen abdullahcetinel »

esistem yazdı:Veritabanı olarak ne kullanıyorsunuz?
Access
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: OnCalcFields ile Yürüyen Bakiye Sorunu

Mesaj gönderen esistem »

O zaman yürüyen bakiye işlemini calc fields ile yapabileceğinizi sanmıyorum, fakat şunu yapabilirsiniz; kayıtları çekip query i döngüye sokup verileri dbgrid yerine bir string grid de gösterebilirsiniz. yada bir memtable kullanabilirsiniz.
abdullahcetinel
Üye
Mesajlar: 35
Kayıt: 12 Ağu 2014 09:45

Re: OnCalcFields ile Yürüyen Bakiye Sorunu

Mesaj gönderen abdullahcetinel »

StringGrid'le yapmayı denedim fakat herhangi bir kaydı ekleme, silme, düzenleme işlemlerinde normal gridden çok daha fazla uğraşılacağı için vazgeçtim. Mutlaka bir yöntemi olmalı. Sorgu ile yapmayı denedim. aynı güne gelen işlemleri grupladı. Şuan tablo sonu kontrol ile veritabanına kaydederek yaptırabiliyorum oda oldukça zaman alıyor. işlemlerden arttıkça bu zaman daha da artıyor. Tecrübeli arkadaşlardan yardım bekliyorum.
AfterPost
Üye
Mesajlar: 144
Kayıt: 12 Tem 2014 10:22

Re: OnCalcFields ile Yürüyen Bakiye Sorunu

Mesaj gönderen AfterPost »

SELECT SUM(Tahsilat) AS T,
SUM(Borc) AS T2
FROM
tblislem bu adoqry2

procedure TForm1.ADOQuery1BeforePost(DataSet: TDataSet);

begin

ADOQuery1Bakiye.AsFloat:=ADOQuery2T.AsFloat-ADOQuery2T2.AsFloat;

end;

///
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
ADOQuery1.Edit;
ADOQuery1.Post;
ADOQuery2.Close;
ADOQuery2.Open;
ADOQuery1.Edit;
ADOQuery1.Post;
end; hesapla
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: OnCalcFields ile Yürüyen Bakiye Sorunu

Mesaj gönderen esistem »

AfterPost yazdı:SELECT SUM(Tahsilat) AS T,
SUM(Borc) AS T2
FROM
tblislem bu adoqry2

procedure TForm1.ADOQuery1BeforePost(DataSet: TDataSet);

begin

ADOQuery1Bakiye.AsFloat:=ADOQuery2T.AsFloat-ADOQuery2T2.AsFloat;

end;

///
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
ADOQuery1.Edit;
ADOQuery1.Post;
ADOQuery2.Close;
ADOQuery2.Open;
ADOQuery1.Edit;
ADOQuery1.Post;
end; hesapla
Bu yürüyen bakiyemi oldu şimdi ?
AfterPost
Üye
Mesajlar: 144
Kayıt: 12 Tem 2014 10:22

Re: OnCalcFields ile Yürüyen Bakiye Sorunu

Mesaj gönderen AfterPost »

oldu denedim yürüdü
abdullahcetinel
Üye
Mesajlar: 35
Kayıt: 12 Ağu 2014 09:45

Re: OnCalcFields ile Yürüyen Bakiye Sorunu

Mesaj gönderen abdullahcetinel »

afterpost; esistemin dediği gibi kodlardan ne yapmaya çalıştığınız anlaşılmıyor. Anlamaya çalışmadan yinede denedim alakası bile yok access violation verdi zaten. Denemelere devam ediyorum sql sorgusu ile çözmeye çalışıyorum oysaki oncalcfields olsaydı süper olacaktı
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: OnCalcFields ile Yürüyen Bakiye Sorunu

Mesaj gönderen esistem »

AfterPost yazdı:oldu denedim yürüdü
nereye yürüdü görebildinizmi bari :)

bir sorguda tahsilat ve borç toplamını alıp her post olayından önce gerçek tabloya bakiye olarak kaydederseniz bakiyeniz (kayıtlar eğer sıralı tarihte işlenirse) doğru çıkar, fakat araya başka bir tarihli işlem girerseniz yürüyen bakiyeniz karışmazmı? Yada hiç kayıt yokken bir kayıt girerseniz ne olur?
AfterPost
Üye
Mesajlar: 144
Kayıt: 12 Tem 2014 10:22

Re: OnCalcFields ile Yürüyen Bakiye Sorunu

Mesaj gönderen AfterPost »

Valla japonya ya doğru yürüdü :) ama kayboldu :)
post edilmiş kayıt üzerinde sonradan tekrar edit işlemi yapıldığında bakiye yürüdüğü yerde kayboluyor..Sıralı yapıldığında hatasız çalışıyor... arkadaşa fikir vermesi amacı ile yazdım ..
Cevapla