Kayıt işlemi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Nry
Üye
Mesajlar: 8
Kayıt: 04 Tem 2003 10:07

Kayıt işlemi

Mesaj gönderen Nry »

[code]procedure TForm3.Button1Click(Sender: TObject);
var
u:integer;
b:integer;
begin
if (dbedit1.text='') or (dbedit2.text='') then
u:=application.messagebox('Bir Veri Girmelisiniz!','Dikkat!',mb_ok+mb_iconquestion+mb_defbutton1);
begin
if table1.locate('sicil_no',dbedit1.text,[]) then
b:=application.messagebox('Bu Kayıt Daha Önce Girilmiş','Dikkat!',mb_ok+mb_defbutton2)
else
begin
if dbedit7.text='01.01.1990' then
table1ayri_tr.asdatetime:=null;
table1.insert;
end;
end;
end;[/code]
bu kodlarla yaptığım kayıt işlemim istediğim gibi olmuyor bazı problemlerle karşılaşıyorum:
1.sicil no alanına göre kıyaslayıp eşleşen verileri mükerrer kayıt etmemesi gerekirken kayıt yapıyor.
2.yeni kayıttada bu veri girilmiş mesajı çalışıyor.
bu sorunlarımı nasıl düzelte bilirim hatayı nerde yapmış olabilirim Bence herşey normal görüküyor :?:
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

öncelikle iki değişken tanımlayıp dbedit1.text i ve dbedit2.text i atamalısın. daha önce de dbedit.text ler üzerinde işlem yapılmamasının doğru olacağını yazmıştım. çünkü siz locate veya findkey ile tabloda herhangi bir arama yaptığınızda doğal olarak dbedit.text in de değeri değişmektedir. o halde hangi bilgiyi esas alacaksınız?

Kod: Tümünü seç

var
  dbt1, dbt2: string;
begin
  dbt1 := DBEdit1.Text;
  dbt2 := DBEdit2.Text;

  if (dbt1 = '') or (dbt2 = '') then 
   .....
//aynı şekilde locate de de
if table1.locate('sicil_no', dbt1, []) then 
  .......
şeklinde yazmalısın.
Nry
Üye
Mesajlar: 8
Kayıt: 04 Tem 2003 10:07

?

Mesaj gönderen Nry »

sayın rsimsek öncelikle merhaba diyorum ve ilginiz ve uyarınız için teşşekkür ediyorum.Söylediklerinizi uyguladım.Ama hala kodlarım doğru çalışmıyor.Mükerrer kayıt problemim ve yeni girilen kayıtta bu kayıt daha önce girilmiş mesajım hala çalışmakta ...
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

ben olayı tam olarak okumadan sadece yönteme dikkat çekmiştim.

burada kayıt yeni girilmiş olsa da eski kayıt üzerinde değişiklik yapmaya kalksan da bu kod "mükerrer kayıt" mesajını verir. mevzu bahsı geçen yöntemle başka bir kayıtı ararken mevcut kayıt post edilmektedir. dolaysıyla o kayıtttan en az bir tane mevcut olmaktadır (yani kendisi). burada yapabileceğin bir iki işlem daha var;

1. Table1.RecNo

Kod: Tümünü seç

var
  old_RecNo: integer
  dbt1: string;
....
  old_RecNo := Table1.RecNo;
  dbt1 := DBEdit1.Text;
  if (table1.locate('sicil_no',dbt1,[])) and (Table1.RecNo <> old_RecNo); then 
    ShowMessage('Mükerrer...')
  else
 .....
2. bana sorarsan şu yöntem en ucuzudur, ve böylecede tablodaki cursoru de hareketlendirmemiş olursun;

Kod: Tümünü seç

  with TQuery.Create(Self) do
  try
    DatabaseName := 'db'; // ne olarak atamışsan. yada path c:\progr\data
    SQL.Clear;
    SQL.Append('select count(*) from tablo');
    SQL.Append('where sicil_no = ''' + dbt1 + ''''); 
               // burada tırnak içinde tek tırnak için ikişer tek tırnak yapıyoruz.
///   SQL.Append('where sicil_no = ' + dbt1); / sicil_no sayısay bir değerse.
    Open;
    if Fields[1].Value > 0 then
      showmessage('Mükerrer...');  // dolaysıyla daha post etmemiş.
  finally                         // düzeltmede sicil_no alanı editlenebiliyorsa yine problem olabilir. o zaman düzeltme mi değil mi diye de kontrol etmelisin.
     free;
  end; 
3. ikinci yöntemle tespit ettiğin mükerrer kayıt olayını silmedeki beforedelete yazıldığı gibi beforepost event ına yazman. kayıt mükerrer ise
Abort; ile işlemi iptal etmen.

kolay gelsin.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

Paradox hiç kullanmadım ama sanırım vardı. Mükerrer kayıt olmasını engellemek için unique key tanımla table yada query nin on posterror event'ında hatayı yakalarsın. Ordada ekrana istediğin mesajı verdirip kaydı engelleyebilirsin.Ben en sağlam ve kod yazmadan yapılacak yöntem bunu buldum.(FireBird kullanıyorum)
Recep Amcanın( :lol: :P ) dediğide tabiki olur, Ama her kayıt sırasında query yada table ı açmak performans kaybettirir. Tabi bu eğer kayıt sayısı çok fazlaysa önemli 1-2 bin kayıtta çok fazla kastıracağını sanmam
Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
pasa_75
Üye
Mesajlar: 15
Kayıt: 12 Ağu 2004 11:11
İletişim:

Re: Kayıt işlemi

Mesaj gönderen pasa_75 »

MÜKERRER KAYITTA KULLANDIĞIM KOD
aşağıdaki kodu mükerrer kaydı engellemek için kullanıyorum. ibdataset eğer formumda varsa sorun olmuyor ancak ibdataset eğer DM da ise kullandığımıda kodum Application.MessageBox ta hata veriyor dolayısıyla hiç bir mesajı kullanamıyorum nasıl bi çözüm önerirsiniz?

with IBQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM OGR_ARSIV');
SQL.Add('WHERE TCNO:=TCNO AND ADI:=ADI AND SOYADI:=SOYADI');
Params [0].AsString:=form1.DBEdit2.Text;
Params [1].AsString:=form1.cxDBTextEdit2.Text;
Params [1].AsString:=form1.cxDBTextEdit3.Text;
open;
end;
if not IBQuery1.Eof then;
begin
Application.MessageBox('Bu kişi zaten kayıtlı.Aynı kaydı tekrar giremezsiniz.... :::...oleksoft©...:::','UYARI !',0+0+48);
Abort;
Sevgiyi SEV Nefretten Nefret ET.
www.oleksoft.com
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: Kayıt işlemi

Mesaj gönderen conari »

ilk olarak şurayı düzeltmelisiniz.

Kod: Tümünü seç

Params [2].AsString:=form1.cxDBTextEdit3.Text;
hata nedir?
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
pasa_75
Üye
Mesajlar: 15
Kayıt: 12 Ağu 2004 11:11
İletişim:

Re: Kayıt işlemi

Mesaj gönderen pasa_75 »

Params [2].AsString:=form1.cxDBTextEdit3.Text$;
buraya yazarken yanlış yazmışım özür ancak problem bununla ilgili değil
ibdataset bileşenlerini formum üzerinde yaptığımda bu kod gayet güzel çalışıyor
ancak ibdataset bileşenlerini form değilde bir data modulde ise (dm) bu kod application messageye kadar çalışıyor orada hata veriyor yani showmessage de dahil mesaj kullanamıyorum nasıl düzeltebilirim

hata ise şu görünüyor
[error] dm.pas(97): undeclared identifier:'application'
[error] dm.pas(97): missing operator or semicolon
[fattal error] project1.dpr(6); could not compile used unit 'dm.pas'
Sevgiyi SEV Nefretten Nefret ET.
www.oleksoft.com
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Kayıt işlemi

Mesaj gönderen aslangeri »

ilgili metodların olduğu unitleri uses kısmına eklemen lazım.
showmessage üzerine tıkla F1 e bas. yardım da hangi unitte olduğu yazıyor.
aynı şey messagebox içinde geçerli.
olmadı bulamassan formun uses satırındaki unitler ile datamodulun uses satırındaki unitleri karşılaştır.
deneme yanılma yöntemi ile bulabilirsin.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
pasa_75
Üye
Mesajlar: 15
Kayıt: 12 Ağu 2004 11:11
İletişim:

Re: Kayıt işlemi

Mesaj gönderen pasa_75 »

ilginizden dolayı çok teşekkür ederim
sorunu çözdüm söylediğiniz gibi
dm.nin uses kısmında forms eksik olduğundan hata veriyormuş
Sevgiyi SEV Nefretten Nefret ET.
www.oleksoft.com
pasa_75
Üye
Mesajlar: 15
Kayıt: 12 Ağu 2004 11:11
İletişim:

Re: Kayıt işlemi

Mesaj gönderen pasa_75 »

aşağıdaki kod ile çok güzel mükerrer kayıt kontrolu yaptırıyorum ancak kayıt düzeltme (edit) yapamıyorum bu kod devreye giriyor
nasıl bi öneride bulunursunuz?

with IBQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM ARSIV');
SQL.Add('WHERE TCNO:=TCNO');
Params [0].AsString:=form1.DBEdit2.Text;
open;
end;
if not IBQuery1.Eof then;
begin
Application.MessageBox('Bu kişi zaten kayıtlı.Aynı kaydı tekrar giremezsiniz.... :::...oleksoft©...:::','UYARI !',0+0+48);
Abort;
Sevgiyi SEV Nefretten Nefret ET.
www.oleksoft.com
pasa_75
Üye
Mesajlar: 15
Kayıt: 12 Ağu 2004 11:11
İletişim:

Re: Kayıt işlemi

Mesaj gönderen pasa_75 »

arkadaşlar yardımcı olabilecek kimse yokmu
Sevgiyi SEV Nefretten Nefret ET.
www.oleksoft.com
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Kayıt işlemi

Mesaj gönderen sabanakman »

O alan için primary veya unique tipte index tanımlarsanız kontrol için kod yazmanıza gerek kalmaz. Siz mükerrer kayıt yapmaya çalışırsanız veritabanı size hata çıkaracaktır. Tek yapmanız gereken bu hatayı kodla kontrol altına almak o kadar.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
pasa_75
Üye
Mesajlar: 15
Kayıt: 12 Ağu 2004 11:11
İletişim:

Re: Kayıt işlemi

Mesaj gönderen pasa_75 »

teşekkür ederim benim kayıt zorunluluğu olmayan alana ihtiycım var bu nedenle index alan tanımlayamıyorum
bu kod üzerine yardımcı olabilirseniz sevinirim
Sevgiyi SEV Nefretten Nefret ET.
www.oleksoft.com
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Re: Kayıt işlemi

Mesaj gönderen sabanakman »

Kod: Tümünü seç

var DuzeltilenKayit:String;

procedure TForm1. IBTable1AfterEdit(DataSet: TDataSet);
begin
  DuzeltilenKayit:=IBTable1.FieldByName('TCNo').AsString;
end;

procedure TForm1.IBTable1BeforePost(DataSet: TDataSet);
begin
  if IBTable.FieldByName('TCNO').AsString<>'' then begin 
    with IBQuery1 do begin
      Close;
      SQL.Clear;
      SQL.Add('SELECT * FROM ARSIV');
      SQL.Add('WHERE TCNO='+QuotedStr(form1.DBEdit2.Text));
      if IBTable1.State=dsEdit then SQL.Add('and TCNO<>'+QuotedStr(DuzeltilenKayit));
      Open;
    end;
    if not IBQuery1.Eof then begin
      Application.MessageBox('Bu kişi zaten kayıtlı.Aynı kaydı tekrar giremezsiniz.... :::...oleksoft©...:::','UYARI !',0+0+48);
      Abort;
    end;
  end;
end;
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Cevapla