Aynı Kayıt Uyarısı [Çözüldü]

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Re: Aynı Kayıt Uyarısı

Mesaj gönderen ozcank »

Tşk. Ederim ihalilcoban kardeşim.
ihalilcoban
Üye
Mesajlar: 121
Kayıt: 10 Ara 2015 10:39

Re: Aynı Kayıt Uyarısı

Mesaj gönderen ihalilcoban »

Rica Ederim.
ertank
Kıdemli Üye
Mesajlar: 1716
Kayıt: 12 Eyl 2015 12:45

Re: Aynı Kayıt Uyarısı

Mesaj gönderen ertank »

ozcank yazdı:Arkadaşlar Merhaba;
Eğer ADOQuery de aynı kayıt varsa veya boş ise uyarı verdiriyorum ama bir türlü farklı bir kayıt olduğunda kayıt ettiremedim. Nerde yanlış yapıyorum bakabilir misiniz?

Exit yerine Abort da kullandım olmadı.

Kod: Tümünü seç

procedure TForm3.BitBtn2Click(Sender: TObject);
begin
MADENKAYIT.Close;
MADENKAYIT.Open;

  DBEdit1.Text := Trim(DBEdit1.Text);
  if (DBEdit1.Text = EmptyStr) then
  begin
    Application.MessageBox('Öğrenci Çember Kodu ve TC. Kimlik No Boş Geçilemez !!!','Bilgilendirme Mesajı',MB_ICONINFORMATION);
    Exit;
  end
Else
        if MADENKAYIT.RecordCount>0 then
        begin
            MessageBoxW(Handle, 'Aynı Çember Kodun da Öğrenci Kaydı Var !!!',
            'Uyarı', MB_OK + MB_ICONSTOP + MB_DEFBUTTON2);
            DBEdit1.SetFocus;
            Exit;
        end
Else
///////////////////////////////////////////////////////////
MADENKAYIT.FieldByName('MD_CEMKODU').AsString := DBEdit1.Text;
MADENKAYIT.FieldByName('MD_ADSOYAD').Value:=DBEdit2.Text;
MADENKAYIT.FieldByName('MD_SINIFI').Value:=DBEdit3.Text;
MADENKAYIT.FieldByName('MD_TCKIMLIK').Value:=DBEdit30.Text;
MADENKAYIT.FieldByName('MD_OGRNO').Value:=DBEdit31.Text;
MADENKAYIT.FieldByName('MD_NUFKAYIL').Value:=ComboBox1.Text;
MADENKAYIT.FieldByName('MD_DOGYERI').Value:=ComboBox2.Text;
MADENKAYIT.FieldByName('MD_DOGTARIHI').AsDateTime:=DateTimePicker1.Date;



Merhaba,

Öncelikle gönderdiğiniz kod ile ilgili daha önce de öneride bulunmuştum. "begin..end", "try..finally..end" gibi ifadelerin arasında kalan kod bloklarını en az iki karakter içeriden yazmaya özen göstermek gerekli. Zira kodun işleyişini gözle takip etme konusunda çok büyük faydaları vardır. Ancak, bazı blokları 2 karakter, bazılarını 4 karakter boşluk ile yazmamak gerekli. Bu durumda faydadan çok karışıklığa sebep verebilir.

Yukarıdaki kod işleyişinde kayıt olmadığı zaman sadece aşağıdaki satır çalışacaktır.

Kod: Tümünü seç

MADENKAYIT.FieldByName('MD_CEMKODU').AsString := DBEdit1.Text;
Bunun dışında kod içinde bazı mantık hataları mevcut. Şöyle ki;

Kod: Tümünü seç

  if (DBEdit1.Text = EmptyStr) then
  begin
    Application.MessageBox('Öğrenci Çember Kodu ve TC. Kimlik No Boş Geçilemez !!!','Bilgilendirme Mesajı',MB_ICONINFORMATION);
    Exit;
  end
Else
Yukarıdaki kod içinde eğer DBEdit1.Text içi boş ise Exit() çalışarak prosedür içinden çıkılacak. Dolayısı ile ayrı bir "else" kullanarak kontrol yapmaya gerek yok. Ayrı bir "if" kontrolü başlatılarak diğer yapılmak istenilen kontroller yapılabilir.

Ayrıca, sorun olan kod ile ilgili fonksiyon/prosedürün tamamını forum ile paylaşmanız önemli. Gönderdiğiniz kodun alt kısımlarında ne yazdığını bilemiyoruz. Sadece paylaştığınız hata mesajından bir noktada MADENKAYIT.Post() gibi bir kod olduğunu varsayabiliyoruz.

Sorunuza gelince;
Abort() sessiz bir anormal durum (exception) oluşturur. Abort'un kullanım yeri olarak aklıma gelen en uygun yerlerden bir tanesi TDataSet.BeforePost() olayıdır. Burada çalışan Abort kayıt girişini iptal edecektir. Bunun haricinde yukarıdaki kod içinde Abort ile bir çözüme ulaşmak mümkün değil.

Daha önceki sorularınız ile birleştirildiği zaman; eğer buton tıklandığı sırada MADENKAYIT (DataSet) Edit veya Insert modunda ise, Siz bu DataSet'i kapatıp yeniden açarak bu durumu (state) değiştiriyorsunuz. Başka bir ifade ile kayıt giriş/değişiklik modundan çıkmış oluyorsunuz. Yapmak istediğinize benzer aramaları ayrı bir fonksiyon/prosedür içinde, farklı bir TAdoQuery kullanarak yapmanızda fayda var. Böylece veri girişi yaptığınız MADENKAYIT içinde Locate() kullanmanıza gerek kalmayacaktır. Aramayı yapacak prosedür/fonksiyonu kullanmanız yeterli olacaktır.

Örnek olması açısından arama için aşağıdaki şekilde bir kod yazılabilir:

Kod: Tümünü seç

function RecordExists(const Code: string): Boolean;
var
  Query: TAdoQuery;
begin
  Query := TAdoQuery.Create(nil);
  try
    Query.Connection := <Buraya bağlantı bileşen adı yazılmalı>
    Query.SQL.Text := 'select MD_CEMKODU from <Buraya database tablo adı yazılmalı> where MD_CEMKODU = :Kod';
    Query.Parameters[0].Value := Code;
    Query.Open();
    Result := Query.RecordCount > 0;
  finally
    Query.Free();
  end;
end;
Bundan sonra kullanımı aşağıdaki şekilde olabilir.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
  DBEdit1.Text := Trim(DBEdit1.Text);
  if (DBEdit1.Text = EmptyStr) then
  begin
    Application.MessageBox('Öğrenci Çember Kodu ve TC. Kimlik No Boş Geçilemez !!!','Bilgilendirme Mesajı',MB_ICONINFORMATION);
    Exit();
  end;

  if RecordExists(DBEdit1.Text) then
  begin
    MessageBoxW(Handle, 'Aynı Çember Kodun da Öğrenci Kaydı Var !!!', 'Uyarı', MB_OK + MB_ICONSTOP + MB_DEFBUTTON2);
    DBEdit1.SetFocus();
    Exit();
  end;

  ///////////////////////////////////////////////////////////
  MADENKAYIT.FieldByName('MD_CEMKODU').AsString := DBEdit1.Text;
  MADENKAYIT.FieldByName('MD_ADSOYAD').Value:=DBEdit2.Text;
  MADENKAYIT.FieldByName('MD_SINIFI').Value:=DBEdit3.Text;
  MADENKAYIT.FieldByName('MD_TCKIMLIK').Value:=DBEdit30.Text;
  MADENKAYIT.FieldByName('MD_OGRNO').Value:=DBEdit31.Text;
  MADENKAYIT.FieldByName('MD_NUFKAYIL').Value:=ComboBox1.Text;
  MADENKAYIT.FieldByName('MD_DOGYERI').Value:=ComboBox2.Text;
  MADENKAYIT.FieldByName('MD_DOGTARIHI').AsDateTime:=DateTimePicker1.Date;
end;
ozcank
Üye
Mesajlar: 937
Kayıt: 28 Nis 2005 05:29

Re: Aynı Kayıt Uyarısı

Mesaj gönderen ozcank »

ertank kardeşim çok teşekkür ederim sorunum verdiğin kod ile halloldu.
Cevapla