Yorumları: 374
Konuları: 66
Kayıt Tarihi: 16-12-2018
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 115 Başlangıç
18-04-2019, Saat: 05:30
(Son Düzenleme: 18-04-2019, Saat: 08:08, Düzenleyen: Fesih ARSLAN.)
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;
Yorumları: 513
Konuları: 88
Kayıt Tarihi: 28-12-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 2.178 Programcı
18-04-2019, Saat: 08:29
(Son Düzenleme: 18-04-2019, Saat: 08:32, Düzenleyen: cinarbil.)
İ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)
Yorumları: 374
Konuları: 66
Kayıt Tarihi: 16-12-2018
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 115 Başlangıç
(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ı : hata
Yorumları: 1.499
Konuları: 83
Kayıt Tarihi: 05-08-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 12.314 Üstad
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...
Yorumları: 4.245
Konuları: 381
Kayıt Tarihi: 07-07-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 17.107 Üstad
18-04-2019, Saat: 08:53
(Son Düzenleme: 18-04-2019, Saat: 08:56, Düzenleyen: Fesih ARSLAN.)
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!
Yorumları: 513
Konuları: 88
Kayıt Tarihi: 28-12-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 2.178 Programcı
18-04-2019, Saat: 08:58
(Son Düzenleme: 18-04-2019, Saat: 08:59, Düzenleyen: cinarbil.)
(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ı : 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)
Yorumları: 73
Konuları: 2
Kayıt Tarihi: 23-12-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 408 Acemi
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.
Yorumları: 374
Konuları: 66
Kayıt Tarihi: 16-12-2018
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 115 Başlangıç
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;
Yorumları: 850
Konuları: 149
Kayıt Tarihi: 07-12-2017
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 3.177 Uzman
@ 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.
Yorumları: 4.245
Konuları: 381
Kayıt Tarihi: 07-07-2016
Aktif Kullandığınız Delphi Sürümü:
Rep Puanı: 17.107 Üstad
18-04-2019, Saat: 16:56
(Son Düzenleme: 18-04-2019, Saat: 16:57, Düzenleyen: Fesih ARSLAN.)
(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!
|