Merhaba,
Öncelikle gönderdiğiniz kod ile ilgili olarak aşağıdaki noktalara dikkat etmenizde fayda var.
1- Değişken isimleri programcı kullanımına serbest bırakılmış olmakla beraber, Delphi içinde kullanılan Form, Buton, Edit gibi bileşenlere bileşen kullanım mantık ve amacına uygun isimler vermek yazılan kodun çok daha kolay anlaşılmasını sağlar. Sizin sorun yaşadığınız Edit1.Text içinde ne bilgi olduğu bileşen adından rahatça tahmin edilebilir.
2- TDataSet.Locate() fonksiyonu geriye Doğru/Yanlış (True/False) şeklinde mantıksal değer çevirir. if mantıksal kontrol için kullanılır. Bu anlamda TDataSet.Locate() ile gelen değeri tekrar doğru mu diye kontrol etmeye gerek yoktur. Gelen değerin kendisini kontrol etmek yeterlidir. Dolayısı ile sizin
Kod: Tümünü seç
IF MADENKAYIT.Locate('MD_CEMKODU',Edit1.Text,[loPartialKey])=True then
şeklinde yazdığınız satır aşağıdaki gibi yazıldığı zaman derleyici ekstra bir kontrol için kod üretmez ve tamamen aynı işi yapar.
Kod: Tümünü seç
if MADENKAYIT.Locate('MD_CEMKODU', Edit1.Text, []) then
3- Günümüzdeki programlama dillerinin neredeyse hepsinde kodu okuması daha kolay olması için "blok" (begin..end, try..finally, vb) arasında kalan satırlar daha içeride yazılır. Sizin gönderdiğiniz kodun tamamı aynı kolondan yazıldığı için blok başlangıç bitişleri kolay anlaşılmıyor. Özellikle bu konuya dikkat etmenizde ve özen göstermenizde fayda var. Duruma göre bazı hataları görerek anlamak blok içinde kalan kodlar en az iki karakter içeriden yazıldığı zaman çok daha kolay olabiliyor.
4- Yazdığınız kod içinde birçok if..else..else şeklinde ifade göze çarpıyor. Mantıksal incelendiğinde ise bu kadar çok kontrol yapmanıza gerek olmayabilir. Yazdığınız kodu bu anlamda mantıksal olarakta incelemelisiniz. En basit örnek olarak "Edit1.Text içi boş mu" kontrolünü ikinci kontrol olarak yapmışsınız. Halbuki içi boş olduğu zaman başka bir kontrole gerek yok. Başka bir şekilde ifade etmek gerekir ise; Eğer Edit1.Text içi boş ise database içinde arama yapılmasına gerek kalmıyor çünkü kayıt bulması mümkün değil.
5- Eğer database tablosuna NULL değer kaydetmek zorunda değil iseniz, database alanlarına atama yaparken aşağıdaki gibi değil
Kod: Tümünü seç
MADENKAYIT.FieldByName('MD_KAYITID').Value := Edit4.Text;
MADENKAYIT.FieldByName('MD_CEMKODU').Value := Edit1.Text;
şu şekilde atama yapılması
Kod: Tümünü seç
MADENKAYIT.FieldByName('MD_KAYITID').AsInteger := StrToInt(Edit4.Text);
MADENKAYIT.FieldByName('MD_CEMKODU').AsString := Edit1.Text;
uygulamanıza duruma göre bir miktar hız kazandırır zira aynı veri türlerini atama durumunuz olacaktır (integer tablo alanına uygulamanız içindeki integer değişkeni direk atayabileceksiniz). Zira bu işlem varyant değişkenin arka planda integer değişkene çevrilmesinden çok daha hızlı olacaktır. Ayrıca veri türü belirsiz varyant değil veri türü belirli değişkenler kullanmış olursunuz. Hatalı atamalar yaptığınızı kendiniz kod yazarken farketmeniz mümkün olabilir. Database tablosu yapınızın tamamını göremiyoruz. Bu anlamda aşağıdaki örnek kod bu öneriye ait örnek içermiyor.
Yukarıda yazdıklarım programcının klavye ve Delphi karşısında daha fazla zaman geçirmesine sebep olacak noktalardır. Uygulama geliştirilir iken ne kadar özen gösterilir ise ortaya çıkacak olan nihai ürün (uygulamanın kendisi) o kadar hatasız çalışması olası olacaktır.
Sorununuza gelince;
Daha önceden bahsedildiği gibi bazı olayların otomatik çalışması sebebi ile MADENKAYIT.Append() dediğiniz anda uygulamanızın başka bir yerinde yazılmış olan bir kod Edit1.Text içini boşaltılıyor olabilir. Bunu kontrol etmek adına ve yukarıdaki önerileri göz önünde bulundurarak aşağıdaki gibi bir kod yazmak mümkün.
Kod: Tümünü seç
procedure TForm3.BitBtn2Click(Sender: TObject);
begin
Edit1.Text := Trim(Edit1.Text);
if (Edit1.Text = EmptyStr) then
begin
Application.MessageBox('Öğrenci Çember Kodu Boş Geçilemez !!!','Bilgilendirme Mesajı',MB_ICONINFORMATION);
Exit();
end;
if MADENKAYIT.Locate('MD_CEMKODU', Edit1.Text, []) then
begin
Application.MessageBox('Aynı Çember Kodun da Öğrenci Kaydı Var !!!', 'Bilgilendirme Mesajı', MB_ICONINFORMATION);
Exit();
end;
MADENKAYIT.Append();
// Aşağıdaki kod bloğu hata tespiti yardımı için
if Trim(Edit1.Text) = EmptyStr then
begin
MADENKAYIT.Cancel();
ShowMessage('Edit1 içi boş');
Exit();
end;
MADENKAYIT.FieldByName('MD_KAYITID').Value := Edit4.Text;
MADENKAYIT.FieldByName('MD_CEMKODU').Value := Edit1.Text;
MADENKAYIT.FieldByName('MD_ADSOYAD').Value := DBEdit1.Text;
MADENKAYIT.FieldByName('MD_SINIFI').Value := DBEdit2.Text;
MADENKAYIT.FieldByName('MD_TCKIMLIK').Value := Edit2.Text;
MADENKAYIT.Post();
end;
Yukarıdaki kod çalıştığı zaman eğer size 'Edit1 içi boş' mesajını vermiyor ise karşınıza çıkan hatayı başka bir yerde aramanız gerekli. Delphi nesne ve olaylara dayalı çalışan bir dildir. Nesne içinde sorun bulunamıyor ise olayların incelenmesinde her zaman fayda vardır. Dolayısı ile @greenegitim tarafından size yapılan *ilk* tavsiyeye uyup diğer olayları incelemenizde fayda var.