taksitlendirme / access violation 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

taksitlendirme / access violation hatası

Mesaj gönderen Serim »

mrb arkadaşlar,

projemde taksitlendir butonuna tıklayınca access violation hatası alıyorum. yaptıklarımı kısaca anlatayım.Hatayı nerde yaptığımı bulamadım :oops:

3 tane tablom var.Kayit_tutarı, odenen ve bakiye alanlarımı OGRENCI tablosunda tutuyorum.Bakiyeyi hesaplarken OGRENCI tablosunda BAK isimli bir calculated alan oluşturdum ve datasetin oncalcfields olayında aşağıdaki kodları yazdım:

Kod: Tümünü seç

procedure Tdm.OGRENCIDATACalcFields(DataSet: TDataSet);
begin
     if (not OGRENCIDATAKAYIT_TUTAR.isnull) and
        (not OGRENCIDATAODENEN.isnull) and
        (OGRENCIDATAKAYIT_TUTAR.AsFloat <> 0) then
          dm.OGRENCIDATABAK.AsFloat:=dm.OGRENCIDATAKAYIT_TUTAR.asfloat-dm.OGRENCIDATAODENEN.asfloat
     else
     dm.OGRENCIDATABAK.AsFloat:=0;
end;
Kayıt Tutarını girince Bakiye alanınada direk tutarı atıyor odenen miktar artıkça bakiyeden düşüyor.
Taksitlendirme kısmında ise taksit adedi, Küsüratı, Ilk Taksit Tarihi, Taksit Araligi,Kusurati Ilk taksidemi / Son Taksidemi Ekleyecegi, Kaydı alan Kişi gibi alanları TAKSIT tablomda tutuyorum.Vade_tarihi, Vade_tutari, Odeme_Tarihi, Odeme_tutari gibi alanlarıda ODEME tablomda tutuyorum.taksitlendir deyince ilgili alanlardaki verileri (taksit adedi vs..) TAKSIT tablosuna atıyor, Vade_tarihi ve Vade Tutarlarını hesaplıyorum.ODEME tablosunun afterpost olayında Odenen_Tutarlari toplatıp OGRENCI tablosundaki ODENEN alanına atıyorum.Böylece toplam ödenen miktarı buluyorum. Projeyi çalıştırınca Öğrenci bilgilerini giriyorum.Hesaplar kısmına geçip taksit bilgilerini giriyorum taksitlendir diyorum bazen taksitlendir butonuna tıklayınca access violation hatasını alıyorum bazende ODEME tablosunda mesela taksidin birini ödeyip post ettikten sonra o hatayı alıyorum ve OGRENCI tablosu edit modunda görünüyor. kodları aşağıda veriyorum.
Taksitlendir butonu :

Kod: Tümünü seç

procedure Thesapform.cxButton1Click(Sender: TObject);
begin
     if cxComboBox1.Text='' then
     begin
          Application.Messagebox('Lütfen Küsüratı Giriniz..','.:: ! ::.',mb_Ok+mb_IconInformation);
          cxComboBox1.SetFocus;
          exit;
     end;
     if cxSpinEdit2.Text='' then
     begin
          Application.Messagebox('Lütfen Taksit Adedini Giriniz..','.:: ! ::.',mb_Ok+mb_IconInformation);
          cxSpinEdit2.SetFocus;
     end;
     if cxDateEdit1.Text='' then
     begin
          Application.Messagebox('Lütfen İlk Taksit Tarihini Giriniz..','.:: ! ::.',mb_Ok+mb_IconInformation);
          cxDateEdit1.SetFocus;
          exit;
     end;
     if cxSpinEdit1.Text='' then
     begin
          Application.Messagebox('Lütfen Taksit Aralığını Giriniz..','.:: ! ::.',mb_Ok+mb_IconInformation);
          cxSpinEdit1.SetFocus;
          exit;
     end;
     if cxComboBox2.Text='' then
     begin
          Application.Messagebox('Lütfen Küsüratı Hangi Taksite Ekleyeceğinizi Giriniz..','.:: ! ::.',mb_Ok+mb_IconInformation);
          cxComboBox2.SetFocus;
          exit;
     end;
     If cxtextedit1.Text='' then
     begin
          Application.Messagebox('Lütfen Kaydı Alan Kişiyi Giriniz..','.:: ! ::.',mb_Ok+mb_IconInformation);
          cxtextedit1.SetFocus;
          exit;
     end;

     Kusurat:=StrToInt(cxComboBox1.TExt);
     Taksit_Adet:=cxSpinEdit2.Value;
     Tarih:=CxDateEdit1.Date;
     Gun:=cxSpinEdit1.Value;
     Ilk_Son:=cxCombobox2.text;
     kaydi_alan:=cxTextEdit1.Text;


     Taksit_tutar:=dm.OGRENCIDATA.fieldbyname('KAYIT_TUTAR').AsFloat/taksit_adet;
     Taksit_Tutar:=Yuvarla(Taksit_Tutar,Kusurat);
     Artan:=Taksit_Tutar*Taksit_Adet;
     Artan:=dm.OGRENCIDATA.fieldbyname('KAYIT_TUTAR').AsFloat-Artan;

     dm.TAKSITDATA.Append;
     dm.TAKSITDATA.FieldByName('ADET').AsInteger:=Taksit_adet;
     dm.TAKSITDATA.FieldByName('BAS_TAR').AsDateTime:=Tarih;
     dm.TAKSITDATA.FieldByName('GUN').AsInteger:=Gun;
     dm.TAKSITDATA.FieldByName('KAYDI_ALAN').AsString:=kaydi_alan;
     dm.TAKSITDATA.FieldByName('ILK_SON').AsString:=ilk_son;
     dm.TAKSITDATA.FieldByName('KUSURAT').AsInteger:=Kusurat;
     dm.TAKSITDATA.Post;

     For i:=1 To Taksit_Adet Do
     Begin
          Dm.ODEMEDATA.Append;
          Dm.ODEMEDATA.FieldByName('VADE_TARIHI').AsDateTime:=Tarih;
          Dm.ODEMEDATA.FieldByName('VADE_TUTARI').AsFloat:=Taksit_Tutar;
          dm.ODEMEDATA.FieldByName('ODENEN_TUTAR').AsFloat:=0;
          If (i=1) and (Ilk_Son='İlk Takside Ekle') Then
          Begin
               Dm.ODEMEDATA.FieldByName('VADE_TUTARI').AsFloat:=Taksit_Tutar+Artan;
          End;
          If (i=Taksit_Adet) and (Ilk_son='Son Takside Ekle') Then
          Begin
               Dm.ODEMEDATA.FieldByName('VADE_TUTARI').AsFloat:=Taksit_Tutar+Artan;
          End;
          Dm.ODEMEDATA.Post;
          Tarih:=Tarih+Gun;
     End;

     ShowMessage('Taksitlendirme İşlemi Tamamlandı..');
end;
ODEMEDATA After Post olayı :

Kod: Tümünü seç

procedure Thesapform.ODEMEDATAAfterPost(DataSet: TDataSet);
begin
      dm.sorgu.DataSource:=dm.OGRENCIDS;
      dm.sorgu.Close;
      dm.sorgu.SQL.Clear;
      dm.sorgu.SQL.Text:='Select sum(ODENEN_TUTAR) from ODEME where HESAP_ID=:OGRENCI_PK';
      dm.sorgu.Open;

      dm.OGRENCIDATA.Edit;
      dm.OGRENCIDATA.FieldByName('ODENEN').AsFloat:=dm.sorgu.Fields[0].asfloat;
      dm.OGRENCIDATABAK.AsFloat:=dm.OGRENCIDATAKAYIT_TUTAR.asfloat-dm.OGRENCIDATAODENEN.asfloat;
      dm.OGRENCIDATABAKIYE.AsFloat:=dm.OGRENCIDATABAK.AsFloat;
      dm.OGRENCIDATA.Post;
end;
tşkler, kolay gelsin..
Bilginin temelini sağlam at depremde zarar görmesin
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
acces violation oluşturulmamış bir nesneye(objeye) ulaşmaya çalıştığınız zaman verir.
pogramı satır satır çalıştırıp hangi satırda hata verdiğini bulun. ona göre gerekli düzenlemeyi yapabilirsin.z
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
Serim
Üye
Mesajlar: 194
Kayıt: 08 Ara 2004 03:32
Konum: Konya

Mesaj gönderen Serim »

mrb, öncelikle cvp için tşk ederim.

satır satır çalıştırdığımda 2 yeni kayıt girdim ilkinde hiç problem çıkarmadan taksitlendirme işlemini yaptı ödeme yaptım onları bakiyeden düştü felan yani sorunsuz çalıştı. İkinci kayıtta ise taksitlendirmeyi yaptıktan sonra ODEMEDATA nın afterpost olayında OGRENCI tablosunu edit moduna aldıktan sonraki yani aşağıdaki satırda hatayı verdi (access violation...) :

Kod: Tümünü seç

dm.OGRENCIDATA.FieldByName('ODENEN').AsFloat:=dm.sorgu.Fields[0].asfloat;
kolay gelsin..
Bilginin temelini sağlam at depremde zarar görmesin
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

FieldDefs

Mesaj gönderen sabanakman »

Merhaba;
Serim yazdı:mrb, öncelikle cvp için tşk ederim.

satır satır çalıştırdığımda 2 yeni kayıt girdim ilkinde hiç problem çıkarmadan taksitlendirme işlemini yaptı ödeme yaptım onları bakiyeden düştü felan yani sorunsuz çalıştı. İkinci kayıtta ise taksitlendirmeyi yaptıktan sonra ODEMEDATA nın afterpost olayında OGRENCI tablosunu edit moduna aldıktan sonraki yani aşağıdaki satırda hatayı verdi (access violation...) :

Kod: Tümünü seç

dm.OGRENCIDATA.FieldByName('ODENEN').AsFloat:=dm.sorgu.Fields[0].asfloat;
kolay gelsin..
Her şey ortada; OGRENCIDATA'nın kullandığı tabloda ODENEN isimli alan yok ya da alan ismi yanlış yazılmış olabilir. Bu arada eğer alanları tasarım aşamasında form üzerine eklediysen ve ODENEN isimli alanı eklemediysen bu alanı hiç bir şekilde kullanamazsın. Kolay gelsin.
Ş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 »

selam,

tablomda ODENEN isimli bi alan var ismi yanlış deil ve dbcurrency edite bağlı. Sorun ondan kaynaklanmıyor yani başka ne olabilir acaba??
hala çözebilmiş deilim ve eğer çok basit bişiyse kendime ceza vericem :P
Bilginin temelini sağlam at depremde zarar görmesin
erdoganturkmen

Mesaj gönderen erdoganturkmen »

Bende buna benzer bir sorunla karşı karşıya gelmiştim.

Kod: Tümünü seç

dm.OGRENCIDATA.FieldByName('ODENEN').AsFloat:=dm.sorgu.Fields[0].asfloat;
kısmında atadığın değişken de bir problem olabilir. Ayrıca sorgu tablosundaki alanın adını yazman daha doru olmazmı? (Fields[0] yerine :?: )
Birde şunu dene istersen : Öncelikle table ve query nesnelerini çift tıkla ve içine tablodaki tüm alanları aktar.

Kod: Tümünü seç

dm.OGRENCIDATAodenen.AsFloat:=dm.sorgualanadi.asfloat;
Kolay Gelsin...
Cevapla