Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
Mükerrer Kayıt Uyarısı
#1
Arkadaşlar Merhaba; Aşağıdaki kod da Aynı kayıt uyarısı veriyor sorun yok eğer farklı bir kayıt girersem onuda kayıt yapıyor fakat  ikinci kez button a bastığında önceden girmiş olduğu kaydı var demesi gerekirken "command text does not return a result set " hatası veriyor mükerrer kayıt tekrar atıyor.
Nerde hata yaptım yardımcı olabilir misiniz?
Üç ayrı kod da da denedim ama "command text does not return a result set " hatasını hep veriyor.

1.Kod :
procedure TForm9.Button1Click(Sender: TObject);

begin
/////////////////////////////////////////////////////////
SeriNoKayit.Active:=True;
IF SeriNoKayit.Locate('SERI',Edit3.Text,[]) Then
Begin
Application.MessageBox('Farklı Seri Girmelisiniz !!!','Uyarı Mesajı',MB_ICONERROR);
Exit;
End
Else
SeriNoKayit.SQL.Clear();
SeriNoKayit.SQL.Text:='INSERT INTO TBLEFATUNO(SUBE_KODU,SERI,TIP,NUMARA) VALUES SUBEKOD,:SERINO,:SERITIP,:SERINUMARA)';
SeriNoKayit.Parameters.ParamByName('SUBEKOD').Value:='0';
SeriNoKayit.Parameters.ParamByName('SERINO').Value:=Edit3.Text;
SeriNoKayit.Parameters.ParamByName('SERITIP').Value:='1';
SeriNoKayit.Parameters.ParamByName('SERINUMARA').Value:='000000000000';
Try
 SeriNoKayit.ExecSQL;
except on E: Exception do
 MessageDlg(E.Message,mtError,[mbOK],0);
End;
End;
/////////////////////////////////////////////////////////
2.Kod:
procedure TForm9.Edit3Exit(Sender: TObject);

Var
Bul:Boolean;
begin
SeriNoKayit.Active:=True;

//SeriNoKayit.Active;
//SeriNoKayit.Open;
////
bul := SeriNoKayit.Locate('SERI', edit3.Text, []);
if bul = true then
begin
  Showmessage('Seri Kayıtlı');
Exit;
  End
  Else
  Showmessage('Seri Kayıtlı Değil');

SeriNoKayit.SQL.Clear();
SeriNoKayit.SQL.Text:='INSERT INTO TBLEFATUNO(SUBE_KODU,SERI,TIP,NUMARA) VALUES (:SUBEKOD,:SERINO,:SERITIP,:SERINUMARA)';
SeriNoKayit.Parameters.ParamByName('SUBEKOD').Value:='0';
SeriNoKayit.Parameters.ParamByName('SERINO').Value:=Edit3.Text;
SeriNoKayit.Parameters.ParamByName('SERITIP').Value:='1';
SeriNoKayit.Parameters.ParamByName('SERINUMARA').Value:='000000000000';
Try
SeriNoKayit.ExecSQL;
except on E: Exception do
MessageDlg(E.Message,mtError,[mbOK],0);
////

3.Kod:
procedure TForm9.Button1Click(Sender: TObject);

begin
SeriNoKayit.Close;
SeriNoKayit.Active:=True;
IF SeriNoKayit.Locate('SERI',Edit3.Text,[]) Then
Begin
Application.MessageBox('Farklı Seri Girmelisiniz !!!','Uyarı Mesajı',MB_ICONERROR);
Exit;
End
Else
//IF NOT SeriNoKayit.Locate('SERI',Edit3.Text,[]) Then
SeriNoKayit.SQL.Clear();
SeriNoKayit.SQL.Text:='INSERT INTO TBLEFATUNO(SUBE_KODU,SERI,TIP,NUMARA) VALUES (''0'','+#39+''+Edit3.Text+''+#39+',''1'',''000000000000'')';
SeriNoKayit.ExecSQL;
End;
Cevapla
#2
İyi günler deneme imkanın olmadı ama sorun else den sonra birden çok satır çalışacak ise 
begin end arasına alınmalı

aksi durumda sizin kodda else için sadece SeriNoKayit.SQL.Clear();  çalışır 
altında kalan tüm kodlar her zaman çalışır

3.Kod:
[ars=delphi]procedure TForm9.Button1Click(Sender: TObject);
begin
SeriNoKayit.Close;
SeriNoKayit.Active:=True;
IF SeriNoKayit.Locate('SERI',Edit3.Text,[]) Then
Begin
Application.MessageBox('Farklı Seri Girmelisiniz !!!','Uyarı Mesajı',MB_ICONERROR);
Exit;
End
Else begin // buraya begin eklemeli
//IF NOT SeriNoKayit.Locate('SERI',Edit3.Text,[]) Then 
SeriNoKayit.SQL.Clear();
SeriNoKayit.SQL.Text:='INSERT INTO TBLEFATUNO(SUBE_KODU,SERI,TIP,NUMARA) VALUES (''0'','+#39+''+Edit3.Text+''+#39+',''1'',''000000000000'')';
SeriNoKayit.ExecSQL;
end;// eklenen beginin end  olmalı
End;
[/ars][/ars]
"…De ki: "Hiç bilenlerle bilmeyenler bir olur mu? Şüphesiz, temiz akıl sahipleri öğüt alıp-düşünürler" (Zümer Suresi, 9)
Cevapla
#3
(18-04-2019, Saat: 08:29)cinarbil Adlı Kullanıcıdan Alıntı: İyi günler deneme imkanın olmadı ama sorun else den sonra birden çok satır çalışacak ise 
begin end arasına alınmalı

aksi durumda sizin kodda else için sadece SeriNoKayit.SQL.Clear();  çalışır 
altında kalan tüm kodlar her zaman çalışır

3.Kod:
[ars=delphi]procedure TForm9.Button1Click(Sender: TObject);
begin
SeriNoKayit.Close;
SeriNoKayit.Active:=True;
IF SeriNoKayit.Locate('SERI',Edit3.Text,[]) Then
Begin
Application.MessageBox('Farklı Seri Girmelisiniz !!!','Uyarı Mesajı',MB_ICONERROR);
Exit;
End
Else begin // buraya begin eklemeli
//IF NOT SeriNoKayit.Locate('SERI',Edit3.Text,[]) Then 
SeriNoKayit.SQL.Clear();
SeriNoKayit.SQL.Text:='INSERT INTO TBLEFATUNO(SUBE_KODU,SERI,TIP,NUMARA) VALUES (''0'','+#39+''+Edit3.Text+''+#39+',''1'',''000000000000'')';
SeriNoKayit.ExecSQL;
end;// eklenen beginin end  olmalı
End;
[/ars][/ars]

Cinarbil kardeşim sonuç aynı :Sad hata 
Cevapla
#4
Aynı Query nesnesi ile hem veri gösterip hem de insert/update vb yapmamalısınız. Sizin aldığınız hata burada paylaştığınız kodlardan kaynaklanmıyordur, muhtemelen başka bir nedeni vardır ancak, size bir önerim olsun. Verileri gösterdiğiniz ve verileri güncellediğiniz Query'niz farklı olsun. Böylece hatayı tespit etme ihtimaliniz %50 oranında artar.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla
#5
Merhaba,
if - else yapısında bir sorun var. Else ifadesinin tüm insert işlemini kapsaması için begin-end satırları arasına yazılmalıdır.
Else ifadesinden hemen sonra kullandığınız Clear() fonksiyonu, SQL.Text atamasından sonra geçersiz kalmış (İki defa aynı işlem tekrarlanmış). SQL.Text ataması yaptığınızda önceki değer silineceği için Clear kullanmaya gerek kalmayacaktır. 
Hatadan anladığım kadarıyla Ado bileşenlerini kullanıyorsunuz; en yakın zamanda FireDAC bileşenlerini kullanmanız bu tip hataları daha kolay yakalamanızı sağlayacaktır. 
Asıl sorununuz yukarıda belirttiğim maddelerle ilgili değil. 
Sorunun kaynağı Locate (dataset işlemlerinde) ve Insert işlemlerinde aynı dataset'in kullanılmasıdır. Her iki işlem için farklı bileşen kullanmanız daha iyi olacaktır.
Örneğin, kayıt listeleme ve benzeri işlemleri için bir table veya query kullanın. Veri tabanı üzerinde bir işlem gerçekleştirmek (Delete, Update, Insert, Alter, Create vb.) Query veya benzeri bir SQLScript bileşeni kullanın. Tek bir bileşen ile işlem yaptığınızda ekranda kayıt gösteren tablonuz kapatılacak ve yeniden açılacak; bu durumda ekrandaki kayıt listesi de kapanacak ve yeniden listelenecektir. Bu da göze hoş görünmez. Ayrıca işlemleriniz yavaşlayacaktır. Farklı bileşenler kullandığınızda, listelediğiniz bileşeni refresh etmeniz yeterli olacaktır.
Özetle, her iki işlem için farklı bileşenler kullanmanız sorununuzu çözecektir. 

Aynı yapı ile devam edip, sorunu ortadan kaldırmak isterseniz; else satırından sonra tabloyu kapatmalı, insert işleminden sonra da tabloyu yeniden açmalısınız. 
Kodu aşağıdaki şekilde kullanırsanız daha iyi olur.
var
 dbSeriNo: Variant;
begin
 SeriNoKayit.open;
 dbSeriNo := SeriNoKayit.Lookup('SERI', edtSeriNo.Text, 'ID');
 if VarIsNull(dbSeriNo) then
 begin
   Application.MessageBox('"' + edtSeriNo.Text +
     '" Seri numaralı ürün daha önceden kaydedilmiştir. Farklı bir seri numarası girmelisiniz!!!',
     'Uyarı Mesajı', MB_ICONERROR);
   Exit;
 end;
 SeriNoKayit.close;
 SeriNoKayit.SQL.Text :=
   'INSERT INTO TBLEFATUNO(SUBE_KODU,SERI,TIP,NUMARA) VALUES SUBEKOD,:SERINO,:SERITIP,:SERINUMARA)';
 SeriNoKayit.Parameters.ParamByName('SUBEKOD').Value := '0';
 SeriNoKayit.Parameters.ParamByName('SERINO').Value := edtSeriNo.Text;
 SeriNoKayit.Parameters.ParamByName('SERITIP').Value := '1';
 SeriNoKayit.Parameters.ParamByName('SERINUMARA').Value := '000000000000';
 Try
   SeriNoKayit.ExecSQL;
 except
   on E: Exception do
     MessageDlg(E.Message, mtError, [mbOK], 0);
 end;
 if not SeriNoKayit.Active then
   SeriNoKayit.open;
end;

Önemli Not: Mümkün mertebe Locate yerine Lookup kullanın.
DelphiCan'dır!
Cevapla
#6
(18-04-2019, Saat: 08:49)OZCANK Adlı Kullanıcıdan Alıntı:
(18-04-2019, Saat: 08:29)cinarbil Adlı Kullanıcıdan Alıntı: İyi günler deneme imkanın olmadı ama sorun else den sonra birden çok satır çalışacak ise 
begin end arasına alınmalı

aksi durumda sizin kodda else için sadece SeriNoKayit.SQL.Clear();  çalışır 
altında kalan tüm kodlar her zaman çalışır

[ars=delphi]3.Kod:
[ars=delphi]procedure TForm9.Button1Click(Sender: TObject);
begin
SeriNoKayit.Close;
SeriNoKayit.Active:=True;
IF SeriNoKayit.Locate('SERI',Edit3.Text,[]) Then
Begin
Application.MessageBox('Farklı Seri Girmelisiniz !!!','Uyarı Mesajı',MB_ICONERROR);
Exit;
End
Else begin // buraya begin eklemeli
//IF NOT SeriNoKayit.Locate('SERI',Edit3.Text,[]) Then 
SeriNoKayit.SQL.Clear();
SeriNoKayit.SQL.Text:='INSERT INTO TBLEFATUNO(SUBE_KODU,SERI,TIP,NUMARA) VALUES (''0'','+#39+''+Edit3.Text+''+#39+',''1'',''000000000000'')';
SeriNoKayit.ExecSQL;
end;// eklenen beginin end  olmalı
End;
[/ars]
[/ars][/ars]

Cinarbil kardeşim sonuç aynı :Sad hata 


procedure TForm9.Button1Click(Sender: TObject);
begin
SeriNoKayit.Close;
SeriNoKayit.Active:=True;
IF SeriNoKayit.Locate('SERI',Edit3.Text,[]) Then
Begin
showmessage (' Kayıt var');
End
Else begin
showmessage ('Kayıt yok eklenebilir');
end;

showmessage ('Bura procedure sonu');
End;


deneyebilir misiniz  kayıt olan ve olmayan 
sonuç nedir
"…De ki: "Hiç bilenlerle bilmeyenler bir olur mu? Şüphesiz, temiz akıl sahipleri öğüt alıp-düşünürler" (Zümer Suresi, 9)
Cevapla
#7
Merhaba.

Benim tavsiyem, bu kadar kod bloğuyla uğraşmaktansa, veritabanında bir tane index tanımlayıp delphi tarafında da olayı OnPostError ile yakalayarak çözmek daha kolay olacaktır.

Örnek Kullanım;

procedure TDM.KURSIYERPostError(DataSet: TDataSet; E: EDatabaseError;
 var Action: TDataAction);
begin
if Pos('TC_KIMLIK_NO_X', E.Message)>0 then
   begin
   Application.MessageBox('Bu Üye Daha Önce Kaydedilmiş !!!','Uyarı Mesajı', MB_OK + MB_ICONERROR);
   Action := daAbort;
   Kursiyer_Karti.DBEdit1.SetFocus;
   end;
end;

Firebird de bu şekil bir yapıyla kullanıyorum ve herhangi bir sıkıntıyla da karşılaşmadım.

İyi çalışmalar.
Bazen daha ileriye ulaşmak için bir kaç adım geri gitmek mecburidir. Çünkü en ileri sıçrayışlar iki adım geriden başlar.
Cevapla
#8
Merhaba; Emeğinize ve yüreğinize sağlık hepinize çok teşekkür ediyorum. Yazmış olduğunuz öneriler ve kodları dikkatlice okuyarak sorunu şu şekilde çözüme kavuşturdum ve bur da da paylaşmak istiyorum;

"SeriNoKontrol" ve "SeriNoKayit" olarak iki tane ADOQuery kullandım.


procedure TForm9.Button1Click(Sender: TObject);
begin
SeriNoKontrol.Close;
SeriNoKontrol.Active:=True;
IF SeriNoKontrol.Locate('SERI',Edit3.Text,[]) Then
Begin
Application.MessageBox('Girdiğiniz Seri Mevcuttur Farklı Seri Girmelisiniz !!!','Uyarı Mesajı',MB_ICONERROR);
Exit;
End
Else
begin
SeriNoKayit.Close;
SeriNoKayit.SQL.Text:='INSERT INTO TBLEFATUNO(SUBE_KODU,SERI,TIP,NUMARA) VALUES (:SUBEKOD,:SERINO,:SERITIP,:SERINUMARA)';
SeriNoKayit.Parameters.ParamByName('SUBEKOD').Value:='0';
SeriNoKayit.Parameters.ParamByName('SERINO').Value:=Edit3.Text;
SeriNoKayit.Parameters.ParamByName('SERITIP').Value:='1';
SeriNoKayit.Parameters.ParamByName('SERINUMARA').Value:='000000000000';
SeriNoKayit.ExecSQL;
end;
End;
Cevapla
#9
@OZCANK Madem sadece değişen 1 alan varsa aşağıdaki gibi de yapabilirsin

SeriNoKayit.Close;
SeriNoKayit.SQL.Text:='INSERT INTO TBLEFATUNO(SUBE_KODU,SERI,TIP,NUMARA) VALUES (''0'',:SERINO,''1'',''000000000000'')';
SeriNoKayit.Parameters.ParamByName('SERINO').Value:=Edit3.Text;
SeriNoKayit.ExecSQL;
Bu dünyada kendine sakladığın bilgi ahirette işine yaramaz. 
Cevapla
#10
(18-04-2019, Saat: 15:41)OZCANK Adlı Kullanıcıdan Alıntı: Merhaba; Emeğinize ve yüreğinize sağlık hepinize çok teşekkür ediyorum. Yazmış olduğunuz öneriler ve kodları dikkatlice okuyarak sorunu şu şekilde çözüme kavuşturdum ve bur da da paylaşmak istiyorum;

"SeriNoKontrol" ve "SeriNoKayit" olarak iki tane ADOQuery kullandım.


procedure TForm9.Button1Click(Sender: TObject);
begin
SeriNoKontrol.Close;
SeriNoKontrol.Active:=True;
IF SeriNoKontrol.Locate('SERI',Edit3.Text,[]) Then
Begin
Application.MessageBox('Girdiğiniz Seri Mevcuttur Farklı Seri Girmelisiniz !!!','Uyarı Mesajı',MB_ICONERROR);
Exit;
End
Else
begin
SeriNoKayit.Close;
SeriNoKayit.SQL.Text:='INSERT INTO TBLEFATUNO(SUBE_KODU,SERI,TIP,NUMARA) VALUES (:SUBEKOD,:SERINO,:SERITIP,:SERINUMARA)';
SeriNoKayit.Parameters.ParamByName('SUBEKOD').Value:='0';
SeriNoKayit.Parameters.ParamByName('SERINO').Value:=Edit3.Text;
SeriNoKayit.Parameters.ParamByName('SERITIP').Value:='1';
SeriNoKayit.Parameters.ParamByName('SERINUMARA').Value:='000000000000';
SeriNoKayit.ExecSQL;
end;
End;

Hayırlı olsun. 
Sonraki bir aramada, en son eklenen kaydın bulunması için ExecSQL satırından hemen sonra da SeriNoKontrol.Refresh; yazmalısınız.
DelphiCan'dır!
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Datasnap veritabanı kayıt serdar 2 350 30-11-2025, Saat: 10:53
Son Yorum: serdar
  Veri Tabanına Kontrollü Kayıt Yaptırma bünyamin68 20 4.238 08-06-2025, Saat: 09:40
Son Yorum: izmaimen
  fastreport şablonu database e kayıt ercanskose 11 2.438 18-02-2025, Saat: 17:10
Son Yorum: akuyumcu63
  MSSQL Kayıt yöntemi nevzatc 2 709 16-12-2024, Saat: 17:40
Son Yorum: mustafaozpinar
  Belirli sayıda kayıt çekmek cinarbil 2 956 17-05-2024, Saat: 08:35
Son Yorum: cinarbil



Konuyu Okuyanlar: 1 Ziyaretçi