Delphi Söz Dizimi Hatası

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
darrenjones
Üye
Mesajlar: 25
Kayıt: 12 Ara 2013 08:35

Delphi Söz Dizimi Hatası

Mesaj gönderen darrenjones »

Merhaba arkadaşlar, Oturum açma ekranında Giriş Yap butonuna tıkladığımda "is not a valid integer value hatasını alıyorum.

Kodu böyle yazdım:

ADODataset1.CommandText:='SELECT * FROM Personel WHERE KullaniciAdi='''+QuotedStr(Edit1.Text)+''' and Sifre='''+QuotedStr(Edit2.Text)+'''';
ADODataset1.Open;
sadedi:=ADODataset1.Fields[2].AsInteger;
Oturum1.hide;
acilis:=ADODataset1.Fields[0].AsInteger;
if sadedi=1 then AnaEkran2.show else

Access VT'da Personel'in altında KullaniciAdi ve Sifre olarak iki alan açıp içlerine kullanıcı adı ve şifre atadım. Ancak bazen personel soyadı için bu geçersiz değerdir vs hatalar veriyor. Kullanıcı adı ve Şifre girmesem bile hata veriyor.

Bunu nasıl çözebilirim?
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Delphi Söz Dizimi Hatası

Mesaj gönderen sabanakman »

Muhtemelen, sadedi:=ADODataset1.Fields[2].AsInteger; veya acilis:=ADODataset1.Fields[0].AsInteger; satırlarından biri yüzünden olabilir. Fields[0] veya Fields[2] ile değerini okuduğunuz alan sayısal tipli bir alan değilse ve alan değeri olarak string bir değer kayıtlı ise (boş '' değeri de dahil) bu durum oluşabilir.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
darrenjones
Üye
Mesajlar: 25
Kayıt: 12 Ara 2013 08:35

Re: Delphi Söz Dizimi Hatası

Mesaj gönderen darrenjones »

sabanakman yazdı:Muhtemelen, sadedi:=ADODataset1.Fields[2].AsInteger; veya acilis:=ADODataset1.Fields[0].AsInteger; satırlarından biri yüzünden olabilir. Fields[0] veya Fields[2] ile değerini okuduğunuz alan sayısal tipli bir alan değilse ve alan değeri olarak string bir değer kayıtlı ise (boş '' değeri de dahil) bu durum oluşabilir.
Merhaba cevap yazdığınız için teşekkür ederim. Kullanıcı adı ve Şifreye database dosyasından 12345 atadım.

'KullaniciAdi="12345" and Sifre="12345"' sorgu ifadesi içindeki söz dizimi hatası(eksik işleç) diye hata verdi. AsString olarak da tanımlanmıyor. Sorunun nasıl çözebilirim?
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Delphi Söz Dizimi Hatası

Mesaj gönderen Lost Soul »

QutedStr kullanmışsanız tekrardan ''' işaretlerini kullanmanıza gerek yok.
darrenjones
Üye
Mesajlar: 25
Kayıt: 12 Ara 2013 08:35

Re: Delphi Söz Dizimi Hatası

Mesaj gönderen darrenjones »

Lost Soul yazdı:QutedStr kullanmışsanız tekrardan ''' işaretlerini kullanmanıza gerek yok.
'SELECT * FROM Personel WHERE KullaniciAdi=QuotedStr(Edit1.Text) and Sifre=QuotedStr(Edit2.Text)'

Merhaba, bu sefer de tanımlanmamış QuotedStr diye bir hata verdi.

Kullanıcı Adını ve Şifreyi Integer olarak 12345 girdiğim için Edit1.Text lerin başındaki QuotedSTR ifadesini çıkardım ve şöyle yazdım:

ADODataset1.CommandText:='SELECT * FROM Personel WHERE KullaniciAdi=Edit1.Text and Sifre=Edit2.Text';

Bu sefer de Edit1.Text parametresinin varsayılan değeri yok hatasını verdi.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Delphi Söz Dizimi Hatası

Mesaj gönderen mrmarman »

darrenjones yazdı:
Lost Soul yazdı:QutedStr kullanmışsanız tekrardan ''' işaretlerini kullanmanıza gerek yok.
'SELECT * FROM Personel WHERE KullaniciAdi=QuotedStr(Edit1.Text) and Sifre=QuotedStr(Edit2.Text)'

Merhaba, bu sefer de tanımlanmamış QuotedStr diye bir hata verdi.

Kullanıcı Adını ve Şifreyi Integer olarak 12345 girdiğim için Edit1.Text lerin başındaki QuotedSTR ifadesini çıkardım ve şöyle yazdım:

ADODataset1.CommandText:='SELECT * FROM Personel WHERE KullaniciAdi=Edit1.Text and Sifre=Edit2.Text';

Bu sefer de Edit1.Text parametresinin varsayılan değeri yok hatasını verdi.

İlkesel olarak yaklaşarak kavramanız daha doğru olacaktır.

(1) SELECT komut satırı tırnak içerisinde olmalıdır.
(2) Edit1.Text ile Edit2.Text tırnak DIŞARISINDA olmalıdır.
(3) Sorunuz gereği 1 ve 2 nolu başlığı birlikte kullanmak zorundasınız.
(4) 'abc' + '123' + 'def' string ifadesinin sonucu = 'abc123def' şeklindedir. Bunu hatırlayalım.

Çözüm : O zaman yeri geldiğinde tırnak açıp, yeri geldiğinde tırnağı kapatıp, sonra tekrar açıp bir düzen oluşturacağız.
(*) Örneğimizde Edit1.Text := 'ARMAN'; olsun...

(1) 'abc' + 'Edit1.Text' = 'abcEdit1.Text' olacaktır.
(2) 'abc' + Edit1.Text = 'abcARMAN' olacaktır.

farkı anlayabildik mi ? Edit1.text'i Tırnak içerisinde yazarsak bir metin olarak değerlendirilecektir. Tırnak dışında yazarsak bir değişkendir.

- Tırnak içerisinde TIRNAK olan bir ifade yazmak isterseniz QuotedSTR( stringDegisken ) fonksiyonunu kullanırsınız. Mesela QuotedStr( Edit1.Text ) sonucu tırnak içerisinde ARMAN yani 'ARMAN' sonucunu verir.

- QuotedStr kullanmak istemezseniz, o zaman her bir tırnak için yan yana iki adet tırnak kullanabilirsiniz.
Örnek :

'abc' + '' + 'cde' + '' + 'fgh' = sonucu şöyledir abc'cde'fgh şeklindedir.

aynı ifadeyş QuotedStr fonksiyonuyla şöyle yazarız.

'abc' + QuotedStr('cde') + 'fgh' şeklinde aynı sonucu elde edersiniz.
* Bu farkı şimdi kendi SELECT satırınızda uygularsanız nasıl olur bir deneyin. Olmadı yardımcı olalım...

Maksat balık tutmayı öğrenmek...İşi yokuşa sürmek değil... :bravo:
Resim
Resim ....Resim
darrenjones
Üye
Mesajlar: 25
Kayıt: 12 Ara 2013 08:35

Re: Delphi Söz Dizimi Hatası

Mesaj gönderen darrenjones »

mrmarman yazdı:
darrenjones yazdı:
Lost Soul yazdı:QutedStr kullanmışsanız tekrardan ''' işaretlerini kullanmanıza gerek yok.
'SELECT * FROM Personel WHERE KullaniciAdi=QuotedStr(Edit1.Text) and Sifre=QuotedStr(Edit2.Text)'

Merhaba, bu sefer de tanımlanmamış QuotedStr diye bir hata verdi.

Kullanıcı Adını ve Şifreyi Integer olarak 12345 girdiğim için Edit1.Text lerin başındaki QuotedSTR ifadesini çıkardım ve şöyle yazdım:

ADODataset1.CommandText:='SELECT * FROM Personel WHERE KullaniciAdi=Edit1.Text and Sifre=Edit2.Text';

Bu sefer de Edit1.Text parametresinin varsayılan değeri yok hatasını verdi.

İlkesel olarak yaklaşarak kavramanız daha doğru olacaktır.

(1) SELECT komut satırı tırnak içerisinde olmalıdır.
(2) Edit1.Text ile Edit2.Text tırnak DIŞARISINDA olmalıdır.
(3) Sorunuz gereği 1 ve 2 nolu başlığı birlikte kullanmak zorundasınız.
(4) 'abc' + '123' + 'def' string ifadesinin sonucu = 'abc123def' şeklindedir. Bunu hatırlayalım.

Çözüm : O zaman yeri geldiğinde tırnak açıp, yeri geldiğinde tırnağı kapatıp, sonra tekrar açıp bir düzen oluşturacağız.
(*) Örneğimizde Edit1.Text := 'ARMAN'; olsun...

(1) 'abc' + 'Edit1.Text' = 'abcEdit1.Text' olacaktır.
(2) 'abc' + Edit1.Text = 'abcARMAN' olacaktır.

farkı anlayabildik mi ? Edit1.text'i Tırnak içerisinde yazarsak bir metin olarak değerlendirilecektir. Tırnak dışında yazarsak bir değişkendir.

- Tırnak içerisinde TIRNAK olan bir ifade yazmak isterseniz QuotedSTR( stringDegisken ) fonksiyonunu kullanırsınız. Mesela QuotedStr( Edit1.Text ) sonucu tırnak içerisinde ARMAN yani 'ARMAN' sonucunu verir.

- QuotedStr kullanmak istemezseniz, o zaman her bir tırnak için yan yana iki adet tırnak kullanabilirsiniz.
Örnek :

'abc' + '' + 'cde' + '' + 'fgh' = sonucu şöyledir abc'cde'fgh şeklindedir.

aynı ifadeyş QuotedStr fonksiyonuyla şöyle yazarız.

'abc' + QuotedStr('cde') + 'fgh' şeklinde aynı sonucu elde edersiniz.
* Bu farkı şimdi kendi SELECT satırınızda uygularsanız nasıl olur bir deneyin. Olmadı yardımcı olalım...

Maksat balık tutmayı öğrenmek...İşi yokuşa sürmek değil... :bravo:
Hocam çok teşekkürler çok iyi anlatmışsınız. Sizin dediğiniz gibi sonuçları KullaniciAdiSifre(1234512345) olarak algılıyor sanırım. Bunları ayrı ayrı anlayıp veritabanıyla doğrulaması lazım. O zaman şöyle mi yazmak gerekiyor?

KullaniciAdi=QuotedStr(Edit1.Text) and Sifre=QuotedStr(Edit2.Text)

Ki yazdığımda "İfadede, tanımlanmamış 'QuotedStr' işlemi" hatası veriyor.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Delphi Söz Dizimi Hatası

Mesaj gönderen mrmarman »

Yaklaştınız...

Doğrusu :

Kod: Tümünü seç

'....   KullaniciAdi = ' + QuotedStr(Edit1.Text) + ' and Sifre = ' + QuotedStr(Edit2.Text)
şeklinde.
Resim
Resim ....Resim
darrenjones
Üye
Mesajlar: 25
Kayıt: 12 Ara 2013 08:35

Re: Delphi Söz Dizimi Hatası

Mesaj gönderen darrenjones »

mrmarman yazdı:Yaklaştınız...

Doğrusu :

Kod: Tümünü seç

'....   KullaniciAdi = ' + QuotedStr(Edit1.Text) + ' and Sifre = ' + QuotedStr(Edit2.Text)
şeklinde.
'Koctug' is not a valid integer value hatası verdi başa döndük yine :) Personel soyadını geçersiz integer değeri olarak görüyor.

sadedi:=ADODataset1.Fields[2].AsInteger;

şurada hata var sanırım.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Delphi Söz Dizimi Hatası

Mesaj gönderen mrmarman »

"SELECT * FROM Personel" cümlesinde çıkan alanların sıralamasını ve alan tiplerini bir yere yazar mısınız ?

- Fields[2] (yani 0,1,2 şeklinde gider, 0'dan başlar) (3) nolu sıradaki alanınız Integer alan tipi değildir. Hata mesajına göre o satırınız şöyle olacaktı.

ADODataset1.Fields[2].AsString; ama o da sadedi değişkeninize uygun olmadığını tahmin ediyorum. Demek ki yanlış değişkene yanlış alanı atamaya çalışıyorsunuz. :idea:
Resim
Resim ....Resim
darrenjones
Üye
Mesajlar: 25
Kayıt: 12 Ara 2013 08:35

Re: Delphi Söz Dizimi Hatası

Mesaj gönderen darrenjones »

mrmarman yazdı:"SELECT * FROM Personel" cümlesinde çıkan alanların sıralamasını ve alan tiplerini bir yere yazar mısınız ?

- Fields[2] (yani 0,1,2 şeklinde gider, 0'dan başlar) (3) nolu sıradaki alanınız Integer alan tipi değildir. Hata mesajına göre o satırınız şöyle olacaktı.

ADODataset1.Fields[2].AsString; ama o da sadedi değişkeninize uygun olmadığını tahmin ediyorum. Demek ki yanlış değişkene yanlış alanı atamaya çalışıyorsunuz. :idea:
Hocam Access dosyasında kullaniciadi ve sifre alanları kısa metinmiş sayı olarak değiştirdim. "Ölçüt ifadesinde veri türü uyuşmazlığı" hatası verdi.
Demek istediğiniz Personel Tablosunda PersonelID=0 TCNo=1 PersonelAd=2 PersonelSoyad=3 Telefon=4 Adres=5 Gorev=6 GirisTarihi=7 KullaniciAdi=8 Sifre=9 mu?

Ben bu programı yanlış yazdım herhalde;

Kod: Tümünü seç

var
  Oturum1: TOturum1;
  acilis:integer;

implementation

uses Unit3, Unit2, Unit4, Unit5, Unit7, Unit6;

{$R *.dfm}

procedure TOturum1.BitBtn1Click(Sender: TObject);
begin
Application.Terminate;
end;

procedure TOturum1.Button1Click(Sender: TObject);
var
sadedi:integer;
begin
ADODataset1.close;
  ADODataset1.CommandText:='SELECT * FROM Personel WHERE KullaniciAdi = ' + QuotedStr(Edit1.Text) + ' and Sifre = ' + QuotedStr(Edit2.Text);
  ADODataset1.Open;
  sadedi:=ADODataset1.Fields[2].AsInteger;
  Oturum1.hide;
  acilis:=ADODataset1.Fields[0].AsInteger;
  if sadedi=1 then AnaEkran2.show else

  begin
         if sadedi=2 then KitapSorgulama4.show else
  begin
  if sadedi=3 then Personel3.show else
  begin
  Application.MessageBox('Lütfen Kullanıcı Adınızı veya Şifrenizi Kontrol Ediniz.','Sistem Mesajı',MB_OK);
  Oturum1.Show;
  end;
  end;
  end;

end;
Yapmak istediğim: Personel Şifresiyle girince Personel Ekranı(Personel3) Açılsın. Admin Şifresiyle Girince Admin Ekranı(AnaEkran2) Açılsın. Bir de oturum açmadan Kitap Sorgulasın var mı yok mu diye. Kitapçı Otomasyon Projesi yapıyorum da.
Kullanıcı avatarı
Lost Soul
Üye
Mesajlar: 1064
Kayıt: 01 Nis 2007 02:55
Konum: mekan ANKARA toprak ELAZIĞ
İletişim:

Re: Delphi Söz Dizimi Hatası

Mesaj gönderen Lost Soul »

S.A.
İlk olarak kullanıcı adı ve şifreyi neden numaraya çevirdiniz. Mantıken alfanumerik olması daha doğru.
Eğer numerik ise o zaman QuotedStr fonksyionunu kullanmanıza gerek kalmadı zira QuotedStr metindeki tırnakları kontrol eder ve tırnak ile çevreler. Oysa ki sorgularda integer alanlar tırnaksız kullanılır.

İkinci olarak fieldları isimleriyle çağırabilirsiniz.
Yani

Kod: Tümünü seç

ADODataset1.Fields[2].AsString
yerine

Kod: Tümünü seç

ADODataset1.FieldByName('PersonelAd').AsString
kullanabilirsiniz.

Üçüncü olarak
Personel Tablosunda PersonelID=0 TCNo=1 PersonelAd=2 PersonelSoyad=3 Telefon=4 Adres=5 Gorev=6 GirisTarihi=7 KullaniciAdi=8 Sifre=9
demişsiniz. Bu durunda 2 nolu kayıt PersonelAd iken

Kod: Tümünü seç

sadedi:=ADODataset1.Fields[2].AsInteger;
  Oturum1.hide;
  acilis:=ADODataset1.Fields[0].AsInteger;
demişsiniz.
Burada bir terslik var. String bir değeri integera cast etmeye çalışmışsınız.
Hatayı bundan dolayı veriyor olabilir.
Kolay gelsin.
Cevapla