BDE ile DBF bağlantısı ve access violation

Diğer veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
RewriteRule
Üye
Mesajlar: 43
Kayıt: 01 Eki 2007 02:06

BDE ile DBF bağlantısı ve access violation

Mesaj gönderen RewriteRule »

Merhaba arkadaşlar,

BDE'nin Table bileşenini kullanarak Visual FoxPro'nun .dbf uzantılı bir veritabanından verileri sorguluyorum. Filter butonuna ilk bastığımda bir problem çıkmıyor ancak ikinci kez tekrar verileri filtrelemek için tekrar bastığımda şu hatayı veriyor:

Resim

Kodlarım:

Kod: Tümünü seç

procedure TForm2.Button2Click(Sender: TObject);
var
  Tarih1 : String;
  Tarih2 : String;
  Stake1 : String;
  Tarih11: TDateTime;
  Tarih21: TDateTime;
begin
  Tarih1  := Edit1.Text;
  Tarih2  := Edit2.Text;
  Stake1  := Edit3.Text;
  Tarih11 := StrToDateTime(Tarih1);
  Tarih21 := StrToDateTime(Tarih2);

  if Tarih11 > Tarih21 then
  begin
    ShowMessage('From Date can not be bigger than To Date!');
    Tarih1     := InputBox('New From Date','Please enter a new from date:','');
    Edit1.Text := Tarih1;
  end;

  with Table1 do
  begin
    if Active then
    begin  
      //Active        := False;
      Close;
      TableName     := strDosyaYolu + 'transact.dbf';
      if Stake1 = '' then
        Filter      := 'DATE>=''' + Tarih1 + ''' AND DATE<=''' + Tarih2 + ''' AND TRANS_TYPE = 1'
      else
        Filter      := 'DATE>=''' + Tarih1 + ''' AND DATE<=''' + Tarih2 + ''' AND TRANS_TYPE = 1 AND AMOUNT < ''' + Stake1 + '''';
      Filtered      := True;
      ReadOnly      := True;
      Exclusive     := False;
      //Active        := True;
      Open;
      First;
    end
    else
    begin
      TableName     := strDosyaYolu + 'transact.dbf';
      if Stake1 = '' then
        Filter      := 'DATE>=''' + Tarih1 + ''' AND DATE<=''' + Tarih2 + ''' AND TRANS_TYPE = 1'
      else
        Filter      := 'DATE>=''' + Tarih1 + ''' AND DATE<=''' + Tarih2 + ''' AND TRANS_TYPE = 1 AND AMOUNT < ''' + Stake1 + '''';
      Filtered      := True;
      ReadOnly      := True;
      Exclusive     := False;
      //Active        := True;
      Open;
      First;
    end;      
  end;

  Button4.Enabled := True;
end;
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

İki durumu da birleştirerek yapmaya çalış. Filitreyi vermeden tablo kapalı olsun.

Kod: Tümünü seç

with Table1 do
  begin
      Close;
      TableName     := strDosyaYolu + 'transact.dbf';
      if Stake1 = '' then
        Filter      := 'DATE>=''' + Tarih1 + ''' AND DATE<=''' + Tarih2 + ''' AND TRANS_TYPE = 1'
      else
        Filter      := 'DATE>=''' + Tarih1 + ''' AND DATE<=''' + Tarih2 + ''' AND TRANS_TYPE = 1 AND AMOUNT < ''' + Stake1 + '''';

      Filtered      := True;
      ReadOnly      := True;
//      Exclusive     := False;
      Open;
      First;
  end;
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
RewriteRule
Üye
Mesajlar: 43
Kayıt: 01 Eki 2007 02:06

Mesaj gönderen RewriteRule »

maalesef yine olmadı ve yine aynı hatayı veriyor.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

try except içerisine alıp ya da kesme noktası (break point) koyup hatayı hangi satırda verdiğini söyler misin?
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
RewriteRule
Üye
Mesajlar: 43
Kayıt: 01 Eki 2007 02:06

Mesaj gönderen RewriteRule »

Merhaba

procedure'um şu şekilde:

Kod: Tümünü seç

procedure TForm2.Button2Click(Sender: TObject);
var
  Tarih1 : String;
  Tarih2 : String;
  Stake1 : String;
  Tarih11: TDateTime;
  Tarih21: TDateTime;
begin
  Tarih1  := Edit1.Text;
  Tarih2  := Edit2.Text;
  Stake1  := Edit3.Text;
  Tarih11 := StrToDateTime(Tarih1);
  Tarih21 := StrToDateTime(Tarih2);

  if Tarih11 > Tarih21 then
  begin
    ShowMessage('From Date can not be bigger than To Date!');
    Tarih1     := InputBox('New From Date','Please enter a new from date:','');
    Edit1.Text := Tarih1;
  end;

  with Table1 do
    begin
      //Active        := False;
      Close;

      TableName       := strDosyaYolu + 'transact.dbf';
      IndexFiles.Text := strDosyaYolu + 'transact.cdx';

      if Stake1 = '' then
        Filter        := 'DATE>=''' + Tarih1 + ''' AND DATE<=''' + Tarih2 + ''' AND TRANS_TYPE = 1'
      else
        Filter        := 'DATE>=''' + Tarih1 + ''' AND DATE<=''' + Tarih2 + ''' AND TRANS_TYPE = 1 AND AMOUNT < ''' + Stake1 + '''';
      Filtered        := True;
      ReadOnly        := True;
      Exclusive       := False;
      //Active        := True;
      Open;
      First;
    end;

  Button4.Enabled := True;
end;
İlk çalışmada bir sorun yok herşeyi listelettirebiliyorum. Ancak ikinci kez filtrele düğmesine bastığımda yukarıda ekran görüntüsü koyduğum resimdeki aynı hata çıkıyor. Showmessage kullandım with Table1 do begin'e başlayıp close olayından önce duruyor yani close yapamıyor sanırım açık olan tabloyu.

NOT: Mesajı düzenledim.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Dediğim gibi try except içinde de dene. Hatta

Kod: Tümünü seç

if Table1.Active then
  Table1.Close;
şeklinde garantiye alabilirsin. Ayrıca Table.Close ile Form.Close karışabilir. En garantisi with kullanmadan yazıp dene.
Access Violation genelde olmayan bir nesneye ulaşmaya çalışıldığında oluşur. Delphi ide den Tools -> Debugger Options... -> Language exceptions sekmesindeki "Stop on delphi exceptions" işaretini kaldır :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
RewriteRule
Üye
Mesajlar: 43
Kayıt: 01 Eki 2007 02:06

Mesaj gönderen RewriteRule »

kodu şu şekilde değiştirdim. exception'dan dolayı oluşacak bir showmessage karşıma çıkmadı ve eski mesaj halen devam ediyor.

Kod: Tümünü seç

procedure TForm2.Button1Click(Sender: TObject);
begin
  Form1.QuickRep1.Preview;
end;

procedure TForm2.Button2Click(Sender: TObject);
var
  Tarih1 : String;
  Tarih2 : String;
  Stake1 : String;
  Tarih11: TDate;
  Tarih21: TDate;
begin
  Try
  Tarih1  := Edit1.Text;
  Tarih2  := Edit2.Text;
  Stake1  := Edit3.Text;
  Tarih11 := StrToDate(Tarih1);
  Tarih21 := StrToDate(Tarih2);


  if Tarih11 > Tarih21 then
  begin
    ShowMessage('From Date can not be bigger than To Date!');
    Tarih1     := InputBox('New From Date','Please enter a new from date:','');
    Edit1.Text := Tarih1;
  end;

  Table1.Active := False;
  
  Table1.TableName       := strDosyaYolu + 'transact.dbf';
  Table1.IndexFiles.Clear;
  Table1.IndexFiles.Add(strDosyaYolu + 'transact.cdx');

  if Stake1 = '' then
    Table1.Filter        := 'DATE>=''' + Tarih1 + ''' AND DATE<=''' + Tarih2 + ''' AND TRANS_TYPE = 1'
  else
    Table1.Filter        := 'DATE>=''' + Tarih1 + ''' AND DATE<=''' + Tarih2 + ''' AND TRANS_TYPE = 1 AND AMOUNT < ''' + Stake1 + '''';
  Table1.Filtered        := True;
  Table1.ReadOnly        := True;
  Table1.Exclusive       := False;
  Table1.Active        := True;
  Table1.First;

  Except
    on E : Exception do
      ShowMessage(E.ClassName+' error raised, with message : '+E.Message);
  end;
  
  Button4.Enabled := True;
end;
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Son aklıma gelen de belki foxpro tablosu paylaşımlı modda sorun yapıyordur. O yüzden Table1.Exclusive := True; yapıp dener misiniz?
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
ikutluay
Üye
Mesajlar: 2341
Kayıt: 03 Tem 2007 10:13

Mesaj gönderen ikutluay »

bde exe ni gereksiz yere şişirir birde TDBF komponenti ile dene istersen.ç bedavadır
Kişi odur ki, koyar dünyada bir eser. Eseri olmayanın yerinde yeller eser./Muhammed Hadimi
http://www.ibrahimkutluay.net
http://www.ibrahimkutluay.net/blog
RewriteRule
Üye
Mesajlar: 43
Kayıt: 01 Eki 2007 02:06

Mesaj gönderen RewriteRule »

merhaba,

@rsimsek, tablonun exclusive özelliğini true yapınca sorun kalmadı. yardımınız için teşekkürler.

@ikutluay, ilk başta TDBF kullanmıştım. Ancak DATE>= gibi bir filtrelemeye imkan vermediği için BDE'ye geri döndüm. Eğer böyle bir sorgulamanın TDBF ile nasıl yapılacağını biliyorsan yazarsan sevinirim. Teşekkürler.
grafiker
Üye
Mesajlar: 1
Kayıt: 21 Kas 2010 01:22

Re: BDE ile DBF bağlantısı ve access violation

Mesaj gönderen grafiker »

merhaba..
mydac ile mysql e bağlanıyorum. formda ilk açmada problem yok. ama ikinci açmada access violation hatasıalıyorum. mydac ın exclusive özelliği de yok.
cevabınız ve ilginiz için şimdiden teşekkürler.
orhancc
Üye
Mesajlar: 585
Kayıt: 24 Ağu 2010 02:14
Konum: İstanbul / Kadıköy
İletişim:

Re: BDE ile DBF bağlantısı ve access violation

Mesaj gönderen orhancc »

AV hatası alıyorsan olmayan bir objeye erişemediğin içindir yani free ettiğin birşeye erişmeye çalışıyorsundur ya da create edilmeyen.
Cevapla