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.
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;
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.
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.
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; 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ı
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?
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 ..