Tekrar eden kayıt-kodun neresinde hata var?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
CinAnka
Üye
Mesajlar: 84
Kayıt: 03 Nis 2006 11:27
Konum: İstanbul

Tekrar eden kayıt-kodun neresinde hata var?

Mesaj gönderen CinAnka »

Merhaba;

elimde değişik grup isimlerini tuttuğum bir adotable var. ekle butonuna tıklanınca yeni kayıt ekleyecek. eğer grup adı alanına bir kayıt girilmemişse, 'grup adı girmediniz' diye uyarı verecek. ve eğer girilen grup adı listede varsa, kontrol edip, 'bu grup adı zaten listede var' diye bildirecek ve o ismi listeye eklemeyecek.

bütün mantık kurallarını zorlayarak, aklıma gelen tüm yolları denedim ama olmuyor arkadaşlar.

Kod: Tümünü seç

procedure TForm3.BitBtn1Click(Sender: TObject);
var
        ayni:char;
        i,j:integer;
        metin:string;
        grupmetin:string;
begin
metin:=dbedit1.EditText;
        if dbedit1.EditText='' then begin
                Application.MessageBox('Grup ismi girmediniz!','Uyarı',MB_ICONWARNING);
        end;


ayni:='H';
        while not datamodule1.adotable2.Eof do
        begin
                grupmetin:=datamodule1.ADOTable2.Fields.Fields[1].AsString ;
                        if grupmetin=metin then
                                ayni:='E';
        datamodule1.ADOTable2.Next;
                        if ayni='H' then begin
                                datamodule1.ADOTable2.Post;
                                form3.Close;
                        end
                        else begin
                        if dbedit1.EditText<>'' then begin
                                Application.MessageBox('Bu grup ismi listede zaten var!','Uyarı',MB_ICONWARNING);
                                datamodule1.ADOTable2.Cancel;
                                datamodule1.ADOTable2.Insert;
                        end;
        end;
end;
end;

Nerede hata var??

buy kodu çalıştırdığımda, listede var olan bir kaydı eklemeye kalktığımda, bu grup ismi listede zaten war diyor ama ekliyor da ismi.

Kolay gelsin herkese...
Güçlü olan haklı değil, haklı olan güçlüdür!
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba;

Kod: Tümünü seç

datamodule1.ADOTable2.Next; 
komutundan sonra bir end; bırakıp döngüyü bitirmeniz gerekir. End bırakmadığınız için ilk begin ta aşağılara kadar gidiyor.

Kolay gelsin.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
Kullanıcı avatarı
CinAnka
Üye
Mesajlar: 84
Kayıt: 03 Nis 2006 11:27
Konum: İstanbul

Mesaj gönderen CinAnka »

onu da denedim ama yine aynı problemi yaşıyorum...
Güçlü olan haklı değil, haklı olan güçlüdür!
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
yapacağın işlemler mantık olarakr şu şekilde olmalı

Kod: Tümünü seç

while not tablo.eof do
begin
  tablodaki kaydı al 
  tablodaki kayıt ile yeni girdiğin kaydı karşılaştır.
  eğer aynı ise 
  begin
     aynı='E';
     döngüden çık //break
  end
  tabloda bir sonraki kayda geç
end;
//döngü bittikten sonra
eğer aynı='E' ise mesajver çık
değilse kaydı ekle
gerisi sana kalmış.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

mantık kökten yanlış, bindiğiniz dalı kesiyorsunuz. yeni kayıt yapmak üzere olduğunuz bir tabloyu tutup baştan sona arıyorsunuz. olmaz. tablo insert konumunda iken, tabloyu first yapınca kayıtlar post olmuş olur. ve en sonda yazılan kodu bulur ve bu kod zaten var der. tabloya bi query bağlayın. query aramayı yaptırsın.
Demitri

Mesaj gönderen Demitri »

aslında ben farklı bi yöntem kullanıyorum
bi kere datasource larda auto edit özelliğini kpatıyorum.
böylece insert olayından sonra post methodunu kullanmak bana kalıyor
sonra record tipi bir değişken oluşturuyorum.
atarılmak istenen değerler bu değişkene atıyorum
sonra inser olayını cancel edip
locate methodu ile aratıyorum.
eğer yoksa tekrar insert diyerek değerleri record dan db ye tkrar aktarıyorum.
yani mantık şöyle


Kod: Tümünü seç

Tip geçici = record
....
...
...
end;


procedure gönderclick
geçici:=gönderilen
gönderilen.cancel
if locate (gönderilen.anahtarkayıt,geçici.anahtarhayıt) then
begin
showmessage('Mevcut anahtar kayıt zaten var')
// kullanıcının girişi kontrol etmesi için değerler tekrar atanır
gönderilen.insert
gönderilen=geçici
exit // prosedür den tamamen çıkılır
end;
.....
....
.....
...
//eğer kontrollerden sorunsuz geçmiş ise
gönderilen.post;

bu mantığı biraz daha geliştirirsen db.edit olaylarında da kontrol ettirirsin.

diğer bir alternatif query lkullanmak.
iyi çalışmalar.
En son Demitri tarafından 25 Nis 2006 01:33 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
CinAnka
Üye
Mesajlar: 84
Kayıt: 03 Nis 2006 11:27
Konum: İstanbul

Mesaj gönderen CinAnka »

arkadaşlar;

bahsettiğiniz her yolu denedim. fakat yine aynı olay başıma geliyor. aynı olsa da kaydı ekliyor.

Kod: Tümünü seç

procedure TForm3.BitBtn2Click(Sender: TObject);
begin
DataModule1.adotable2.cancel;
form3.Close;
end;

procedure TForm3.BitBtn1Click(Sender: TObject);
var
        ayni:char;
        i,j:integer;
        metin:string;
        grupmetin:string;
        ara:boolean;
begin
        if dbedit1.EditText='' then begin
                Application.MessageBox('Grup ismi girmediniz!','Uyarı',MB_ICONWARNING);
        end;


if dbedit1.EditText<>'' then begin

        adoquery1.Close;
        adoquery1.SQL.Clear;
        adoquery1.SQL.text:='SELECT ADI FROM GRUPLAR';
        ADOQUERY1.Open;
                ayni:='H';
                adoquery1.First;
                while not adoquery1.Eof do
                begin

                        if adoquery1.Fields.Fields[0].AsString=dbedit1.EditText then
                        ayni:='E';
                        adoquery1.Next;
                end;


                if ayni='E' then begin
                Application.MessageBox('Bu grup ismi listede zaten var!','Uyarı',MB_ICONWARNING);
                datamodule1.ADOTable2.Cancel;
                datamodule1.ADOTable2.Insert;
                end;

                if ayni='H' then begin
                datamodule1.ADOTable2.Post;
                form3.Close;
                end;
end;
end;

ben insert yaptığımda, kontrol mekanizması ne olursa olsun ekliyor gibi gözüküyor...
Güçlü olan haklı değil, haklı olan güçlüdür!
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
e mübarek adam

Kod: Tümünü seç

if ayni='H' then begin
                datamodule1.ADOTable2.Post;
                form3.Close;
                end; 
eğer aynı = H ise
sen yineden adotable.post dersen kaydeder tabi
hıııı :!:
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
nitro
Üye
Mesajlar: 1112
Kayıt: 23 Ağu 2004 01:18
Konum: Çanakkale
İletişim:

Mesaj gönderen nitro »

Kod: Tümünü seç

adoquery1.Close;
adoquery1.SQL.Clear;
 adoquery1.SQL.text:=('SELECT ADI FROM GRUPLAR where adi='+quotedstr(dbedit1.text));
ADOQUERY1.Open; 
ADOQUERY1.last;
if ADOQUERY1.recordcount<>0 then showmessage('Bu isim daha önceden kullanıldı..!');
olarak dene
Kullanıcı avatarı
CinAnka
Üye
Mesajlar: 84
Kayıt: 03 Nis 2006 11:27
Konum: İstanbul

Mesaj gönderen CinAnka »

sayın @aslangeri;

2 noktayı gözden kaçırıyorsunuz:

1. orada eğer aynı kayıt yok ise (if ayni='H') ekle diyor...
2.'e mübarek adam' değil 'e mübarek bayan' :evil: :lol: :idea:


ve sayın @nikrokonat;

yazdığınız query yi ekledim. çalıştı (bu kadar basit bir şeyi yapamamış oluşum ayrı bir hayret nedeniı :oops: ). eğer kayıt listede yok ise eklemiyor. ama 'listede var' uyarısını verdiğinde listemde görünüyor ve uyarı diyalog kutusunu kapatınca listemden siliniyor. listemde hiç görünmemesini nasıl sağlayabilirim??
Güçlü olan haklı değil, haklı olan güçlüdür!
Kullanıcı avatarı
ofenX
Üye
Mesajlar: 397
Kayıt: 09 Nis 2005 10:24
Konum: Diyarbakır
İletişim:

Mesaj gönderen ofenX »

Merhaba,
@nitrokanat uyarmadan önce

Kod: Tümünü seç

metin:=dbedit1.EditText; 
satırına dikkat etmemiştim.
o yüzden @nitrokanatın dediği yöntemi uygulayabilirsiniz.
Eğer arama yaptığınız anda girdiğiniz değer sadece dbedit1 ise
dbedit yerine edit bileşeni kullanıp dediğim yere end; bırakırsanız olması lazım.

Kolay gelsin.
http://www.aysbergbilgisayar.com
Logo Go özel eğitim, web tasarım, teknik servis
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

ups.... :oops:
özür dilerim.....
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Cevapla