Merhaba dostlar.... Projemde Adosql kullanıyorum...
Hesaplama fonksiyonuna aşağıdaki kodu ekledim ve stack overflow hatası veriyor.. Önerisi olan var mı.... Yanlışlık nerede.
Not: FieldKind fkCalculated yaptım.....
Kod:
procedure Tveriler.MasisSQLCalcFields(DataSet: TDataSet);
var
i : Integer;
masraftoplami : Double;
begin
try
//application.ProcessMessages;
masraftoplami := 0;
if veriler.MasisSQL.Eof then
Begin
Exit;
End
Else
Begin
veriler.MasisSQL.First;
For i:= 0 To veriler.MasisSQL.RecordCount-1 Do
Begin
veriler.MasisSQLmastopla.AsCurrency := veriler.MasisSQLmastopla.AsCurrency +
veriler.MasisSQLmasrafi.AsCurrency;
veriler.MasisSQL.Next;
End;
End;
//veriler.AnaSQL.Edit;
//veriler.AnaSQLd_masraf.AsCurrency := veriler.AnaSQLkf_mas.AsCurrency +
// veriler.AnaSQLkf_uc.AsCurrency +
// veriler.MasisSQLmastopla.AsCurrency;
except
ShowMessage('Hesap Yapılamadı');
end;
end;
Stack overflow hatası ... yardım
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
- sabanakman
- Kıdemli Üye
- Mesajlar: 3077
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Re: Stack overflow hatası ... yardım
Burada kayıt hareketi yaptığın (First, Next vs.) için MasisSQLCalcFields prosedürü içinde MasisSQLCalcFields prosedürü (kendisi) tekrar çalışmakta ve iç içe sonsuz kere çağrılmaktadır. Tabi sonsuza kadar sürmesi engellendiği için belirttiğin hata geliyor. İyi çalışmalar.adnansirca yazdı:procedure Tveriler.MasisSQLCalcFields(DataSet: TDataSet);
.
.
.
veriler.MasisSQL.First;
.
.
veriler.MasisSQL.Next;
.
.
.
end;
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
@sabanakman ın dediği gibi MasisSQLCalcFields ya da OnCalcFields yordamı kayıt göstergeci dosya açıldığında veya başka bir kayıtda konumlandığında tetiklenir. Dolaysıyla procedure içindeki veriler.MasisSQL.First; veriler.MasisSQL.Next; ile bu tetiklenmektedir.
Çözümü: şeklinde çözülebilir.. acele yazdım kontrol etmek lazım
Çözümü:
Kod: Tümünü seç
procedure Tveriler.MasisSQLCalcFields(DataSet: TDataSet);
var
i : Integer;
masraftoplami : Double;
begin
try
//application.ProcessMessages;
masraftoplami := 0;
if veriler.MasisSQL.Eof then
Begin
Exit;
End
Else
Begin
Veriler.OnCalcFields := nil;
veriler.MasisSQL.First;
For i:= 0 To veriler.MasisSQL.RecordCount-1 Do
Begin
veriler.MasisSQLmastopla.AsCurrency := veriler.MasisSQLmastopla.AsCurrency +
veriler.MasisSQLmasrafi.AsCurrency;
veriler.MasisSQL.Next;
End;
Veriler.OnCalcFields := MasisSQLCalcFields;
End;
//veriler.AnaSQL.Edit;
//veriler.AnaSQLd_masraf.AsCurrency := veriler.AnaSQLkf_mas.AsCurrency +
// veriler.AnaSQLkf_uc.AsCurrency +
// veriler.MasisSQLmastopla.AsCurrency;
except
ShowMessage('Hesap Yapılamadı');
end;
end;
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
-
- Üye
- Mesajlar: 135
- Kayıt: 14 Kas 2005 12:24
Selamlar,
Aklınızda bulunsun StackOverflow hatası almak demek, muhtemelen sonsuz bir döngü içinde bir rutin çağrılıyor demektir.
Öyle bir durumda hemen aklınıza, ben ne yapıyorumda milyonlarca kez bir Rutin çağrılıyor, diye bir soru gelmeli.
Ondan sonrasını çözersiniz.
Kolay Gelsin
Aklınızda bulunsun StackOverflow hatası almak demek, muhtemelen sonsuz bir döngü içinde bir rutin çağrılıyor demektir.
Öyle bir durumda hemen aklınıza, ben ne yapıyorumda milyonlarca kez bir Rutin çağrılıyor, diye bir soru gelmeli.
Ondan sonrasını çözersiniz.
Kolay Gelsin
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/