stack owerflow hatası

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
Serim
Üye
Mesajlar: 194
Kayıt: 08 Ara 2004 03:32
Konum: Konya

stack owerflow hatası

Mesaj gönderen Serim »

merhaba arkadaşlar,
programımda ufak bi hesaplama işinde takıldım.sorumu şöyle anlatıyım.
mesela bir müşteriye 3 iş yapıldı ve bu işlerden kalan borçlarını toplattırıp toplam borcunu sql koduyla buldurdum.toplam borçtan bi miktarını ödediği zaman toplam kalan borcunuda buluyorum. takıldığım kısım ise eğer borcundan bi miktar ödemediyse toplam_kalan_para alanım toplam_borc alanıma eşit olsun, ödediği bi miktar varsa toplam_borc tan toplam_odenen_para yı çıkartsın ve kalanı bulsun.
bunun için datasetin beforeinsert olayında şöyle bi kod yazdım ama programı çalıştırıp yeni butonuna tıkladığım zaman stackowerflow hatası alıyorum.

Kod: Tümünü seç

procedure Tisform.ISDATABeforeInsert(DataSet: TDataSet);
begin
      dm.sorgu.DataSource:=dm.MUSDS;
      dm.sorgu.Close;
      dm.sorgu.SQL.Clear;
      dm.sorgu.SQL.Text:='Select sum(KALAN_PARA) from YAPILAN_IS where IS_NO=:MUSTERI_PK';
      dm.sorgu.Open;
      dm.ISDATA.Edit;
      If dm.ISDATA.FieldByName('TOPLAM_ODENEN_PARA').AsFloat=0 then
          dm.ISDATA.FieldByName('TOPLAM_KALAN_PARA').AsFloat:=dm.sorgu.Fields[0].asfloat
      else
      If dm.ISDATA.FieldByName('TOPLAM_ODENEN_PARA').AsFloat<>0 then
          dm.ISDATA.FieldByName('TOPLAM_KALAN_PARA').AsFloat:=dm.sorgu.Fields[0].asfloat-dm.ISDATA.FieldByName('TOPLAM_ODENEN_PARA').AsFloat;
end;
kolay gelsin...
Bilginin temelini sağlam at depremde zarar görmesin
poshet303
Üye
Mesajlar: 235
Kayıt: 26 Eki 2005 01:15

Mesaj gönderen poshet303 »

Kodunuzu trace edermisiniz.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Hata

Mesaj gönderen sabanakman »

Verilen kodlarda bir hata yok gibi duruyor, tahminime göre işin içine başka yerden hata geliyor.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
Serim
Üye
Mesajlar: 194
Kayıt: 08 Ara 2004 03:32
Konum: Konya

Mesaj gönderen Serim »

hımm hata şurdan kaynaklanıyor.eğer önceden kayıtlı bir müşteriye iş kaydı gireceksek tam olarak istediğim işlemi yapıyor diyemem ama hatada vermiyor.
ama yeni bir müşteri ekleyip ona iş kaydı gireceğimiz zaman bu hata mesajını veriyor.
yapmak istediğim işlemi başka nasıl bi yoldan yapabilirm.

iyi çalışmalar..
Bilginin temelini sağlam at depremde zarar görmesin
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Merhaba ,
Eklediğiniz hesaplanan bir alana OnClacField olay metodu haricinde Edit yada Append metodları çağırdıktan sonra değer atamak istiyor olabilirmisiniz? yani özetmelek gerekirse belirttiğiniz alanlardan herhangi biri hesaplanan bir alan olabilirmi?
İyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
Serim
Üye
Mesajlar: 194
Kayıt: 08 Ara 2004 03:32
Konum: Konya

Mesaj gönderen Serim »

toplam_odenen_para alanımın onchange olayında toplam_kalan_para yı hesaplatmıştım:

Kod: Tümünü seç

procedure Tdm.ISDATATOPLAM_ODENEN_PARAChange(Sender: TField);
begin
     dm.sorgu.DataSource:=dm.MUSDS;
     dm.sorgu.Close;
     dm.sorgu.SQL.Clear;
     dm.sorgu.SQL.Text:='Select sum(KALAN_PARA) from YAPILAN_IS where IS_NO=:MUSTERI_PK';
     dm.sorgu.Open;
     dm.ISDATA.FieldByName('TOPLAM_KALAN_PARA').AsFloat:= sorgu.Fields[0].asfloat-dm.ISDATA.FieldByName('TOPLAM_ODENEN_PARA').AsFloat;
odenen_para alanını datasetin afterinsert olayında sıfıra eşitliyorum:

Kod: Tümünü seç

dm.ISDATA.FieldByName('TOPLAM_ODENEN_PARA').AsFloat:=0;
öyle olduğu halde aşağıdaki satırları çalıştırmıyor :

Kod: Tümünü seç

      If dm.ISDATA.FieldByName('TOPLAM_ODENEN_PARA').AsFloat=0 then
          dm.ISDATA.FieldByName('TOPLAM_KALAN_PARA').AsFloat:=dm.sorgu.Fields[0].asfloat
tşkler..
Bilginin temelini sağlam at depremde zarar görmesin
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Tabi, bahsettiğimiz olay, Fiziksel alanlara Edit yada insert mod haricinde deeğr atamak istediğinizdede karşınıza çıkacaktır, AfterInsert metodunda dataset Insert moddan çıkmıştır yani Post edildikten sonra tetiklenir dolayısıla siz alana değer atamaya çalıştığınızda Stack overflow istisnasına neden olur.
İyi çalışmalar.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
Serim
Üye
Mesajlar: 194
Kayıt: 08 Ara 2004 03:32
Konum: Konya

Mesaj gönderen Serim »

yani after insertte yaptığım aşağıdaki işlemleri before inserttemi yaz diyorsunuz?

Kod: Tümünü seç

procedure Tisform.ISDATAAfterInsert(DataSet: TDataSet);
begin
      dm.ISDATA.FieldByName('IS_NO').AsInteger:=dm.MUSDATA.fieldbyname('MUSTERI_PK').AsInteger;
      dm.ISDATA.FieldByName('TUTAR').AsFloat:=0;
      dm.ISDATA.FieldByName('ODENEN_PARA').AsFloat:=0;
      dm.ISDATA.FieldByName('KALAN_PARA').AsFloat:=0;
      dm.ISDATA.FieldByName('MALIYET').AsFloat:=0;
      dm.ISDATA.FieldByName('BORC_ODEDI').AsString:='H';
      dm.ISDATA.FieldByName('FATURA_KESILDIMI').AsString:='H';
      dm.ISDATA.FieldByName('TOPLAM_ODENEN_PARA').AsFloat:=0;
end;
Bilginin temelini sağlam at depremde zarar görmesin
Kullanıcı avatarı
vkamadan
Kıdemli Üye
Mesajlar: 1935
Kayıt: 17 Mar 2004 03:52
Konum: Adapazarı
İletişim:

Mesaj gönderen vkamadan »

Merhaba ,
Anladığım kadarıyla siz yeni bir kayıtta varsayılan değerleri atamak istiyorsunuz , bu durumda bahsettiğiniz kod bloğunu dataset in OnNewRecord olay metoduna yazmanız doğru olacaktır.
Volkan KAMADAN
www.polisoft.com.tr
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

BeforeInsert olayında daha Kayıt ekleme/Insert olayı gerçekleşmemiştir. Halbuki siz eklenmeyen kayıtın alanlarına değer atamaya çalışıyorsunuz. Kodları AfterInsert içine yazınız :idea:

Yada @vkamadan arkadaşımızın dediği gibi OnNewRecord olayında :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
Serim
Üye
Mesajlar: 194
Kayıt: 08 Ara 2004 03:32
Konum: Konya

Mesaj gönderen Serim »

afterinsert içine yazıyorum ama toplam_odenen_para alanında 0 yazmasına rağmen toplam_kalan_para alanına toplam_borcun değerini atmıyor.
yani bu işlemi hangi olaya yazarsam yazayım yapmıyor.
aşağıda yapmak istediğim işlemi nasıl gerçekleştiricem ben :(

Kod: Tümünü seç

      If dm.ISDATA.FieldByName('TOPLAM_ODENEN_PARA').AsFloat=0 then
          dm.ISDATA.FieldByName('TOPLAM_KALAN_PARA').AsFloat:=dm.sorgu.Fields[0].asfloat
      else
      If dm.ISDATA.FieldByName('TOPLAM_ODENEN_PARA').AsFloat<>0 then
          dm.ISDATA.FieldByName('TOPLAM_KALAN_PARA').AsFloat:=dm.sorgu.Fields[0].asfloat-dm.ISDATA.FieldByName('TOPLAM_ODENEN_PARA').AsFloat;
kolay gelsin..
Bilginin temelini sağlam at depremde zarar görmesin
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Kesme noktası/break point koyup dönen değerleri kontrol etmelisin :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
Serim
Üye
Mesajlar: 194
Kayıt: 08 Ara 2004 03:32
Konum: Konya

Mesaj gönderen Serim »

kaydet butonuna yazdım sorun halloldu:)
sorunsuz çalışıyor.Kodun en son hali aşağıda:

Kod: Tümünü seç

procedure Tisform.kaydetbtnClick(Sender: TObject);
begin
      dm.ISDATA.Post;
      dm.ISDATA.Edit;
      dm.sorgu.DataSource:=dm.MUSDS;
      dm.sorgu.Close;
      dm.sorgu.SQL.Clear;
      dm.sorgu.SQL.Text:='Select sum(KALAN_PARA) from YAPILAN_IS where IS_NO=:MUSTERI_PK';
      dm.sorgu.Open;
      If dm.ISDATA.FieldByName('TOPLAM_ODENEN_PARA').AsFloat=0 then
          dm.ISDATA.FieldByName('TOPLAM_KALAN_PARA').AsFloat:=dm.sorgu.Fields[0].asfloat
      else
      If dm.ISDATA.FieldByName('TOPLAM_ODENEN_PARA').AsFloat<>0 then
          dm.ISDATA.FieldByName('TOPLAM_KALAN_PARA').AsFloat:=dm.sorgu.Fields[0].asfloat-dm.ISDATA.FieldByName('TOPLAM_ODENEN_PARA').AsFloat;
      dm.ISDATA.Post;
end;
tşkler iyi çalışmalar..
Bilginin temelini sağlam at depremde zarar görmesin
Cevapla