edit ederken insert ediyor

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
hdayi
Kıdemli Üye
Mesajlar: 1284
Kayıt: 29 Oca 2004 01:53
Konum: Erciyes'in eteklerinden.

edit ederken insert ediyor

Mesaj gönderen hdayi »

Merhaba,
Belediyenin evlendirme memurluğu için bir program yapıyorum. nikah adında bir master tablom ve buna bağlı erkek ve kadin adında iki tane detail tablom var. tek bir formda bilgilerin hepsini girdirip post dediğim zaman (nikah tablosunu post ediyorum, onun after postunda diğerlerini post ediyorum) detail tablolara kayıt insert ediyor. hiç bişey anlayamadım, nerden yapıyor niye yapıyor.
Windows XP Service Pack 1, MSDAC 2.7, Ms Access kullanıyorum.
Yardımlarınızı Bekliyorum.

Kod: Tümünü seç

procedure Tdm.tblkadinAfterEdit(DataSet: TDataSet);
begin
if not(tblerkek.State in [dsedit]) then tblerkek.Edit;
if not(tblnikah.State in [dsedit]) then tblnikah.Edit;
end;


procedure Tdm.tblnikahAfterEdit(DataSet: TDataSet);
begin
  if not(tblerkek.State in [dsedit]) then tblerkek.Edit;
  if not(tblkadin.State in [dsedit]) then tblkadin.Edit;
end;

procedure Tdm.tblnikahAfterInsert(DataSet: TDataSet);
begin
  tblerkek.Insert;
  tblerkeknikahid.AsString:=tblnikahKimlik.AsString;
  tblerkekulkekodu.AsString:='9980';
  tblerkekdini.AsString:='11';
  tblerkekbaskavatandaslik.AsBoolean:=False;

  tblkadin.Insert;
  tblkadinnikahid.AsString:=tblnikahKimlik.AsString;
  tblkadindini.AsString:='11';
  tblkadinbaskavatandaslik.AsBoolean:=False;
  tblkadinulkekodu.AsString:='9980';
  tblkadinoncekisoyadi.AsBoolean:=False;
end;


procedure Tdm.tblnikahAfterPost(DataSet: TDataSet);
begin
if tblerkek.State in [dsedit,dsinsert]
  then dm.tblerkek.Post;
if tblkadin.State in [dsedit,dsinsert]
  then dm.tblkadin.Post;

end;


procedure Tdm.tblkadinAfterEdit(DataSet: TDataSet);
begin
if not(tblerkek.State in [dsedit]) then tblerkek.Edit;
if not(tblnikah.State in [dsedit]) then tblnikah.Edit;
end;

procedure Tdm.tblkadinAfterEdit(DataSet: TDataSet);
begin
if not(tblerkek.State in [dsedit]) then tblerkek.Edit;
if not(tblnikah.State in [dsedit]) then tblnikah.Edit;
end;



En son hdayi tarafından 21 May 2004 09:32 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Bişnev in ney çün hikâyet mîküned
Ez cüdâyîhâ şikâyet mîküned
Resim
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

koddan gorebildigim kadari ile zaten nikah tablosunun after insertinde detay tablolara kayıt insert edip after post'ta da o detayları post ediyorsunuz.. Yani bu sonuc normal oyle degil mi?
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
hdayi
Kıdemli Üye
Mesajlar: 1284
Kayıt: 29 Oca 2004 01:53
Konum: Erciyes'in eteklerinden.

Mesaj gönderen hdayi »

Maalesef normal değil. Her ne hikmetse master tabloyu post ettiğim zaman detail tabloların afteinsert olayları çalışıyor, gerçi afterinsert'teki codu sildim ama çalışıyor burdan anlıyorum ki yeni bir kayıt insert etmiş detail tablolara.

zaten post ettiğimde detail tablolarla ilgili olan alanlar siliniyor, boş geliyor.

query ile baktığımda girdiğim kayıtları görüyorum aslında, post edilmişler ve database'de varlar, ama yeni kayıtlar insert edildiği için ilk girdiğim asıl kayıtlar ekranda görünmüyor.
Bişnev in ney çün hikâyet mîküned
Ez cüdâyîhâ şikâyet mîküned
Resim
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

gonderdiginiz koda gore master'in post islemini takiben detaylara bir insert gorunmuyor..... gorunen after isnertte detaya insert edilmesi idi....
post anindaki detay insert icin su an aklıma bir şey gelmiyor...
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam...
hdayi yazdı:procedure Tdm.tblnikahAfterPost(DataSet: TDataSet);
begin
if tblerkek.State in [dsedit,dsinsert]
then dm.tblerkek.Post;
if tblkadin.State in [dsedit,dsinsert]
then dm.tblkadin.Post;
end;
demişsiniz...

- peki bu tblerkek ve tblkadin'ın afterpost olayları boş mu ? Tahminim bunlarda da Nikah'a insert vb. gibi bir yönlendirme olabilir... Bu da geribeslemeye sebep oluyordur diye düşünüyorum...
Resim
Resim ....Resim
Kullanıcı avatarı
hdayi
Kıdemli Üye
Mesajlar: 1284
Kayıt: 29 Oca 2004 01:53
Konum: Erciyes'in eteklerinden.

Mesaj gönderen hdayi »

Her iki detail tablonun da afterpost'ları boş maalesef :(
bu detail tabloları edit ettiğim zaman insert çalışıyor şimdi farkettim.
ana tabloya yeni bir kayıt insert ettikten sonra diğer tablolarada birer kayıt insert ediyorum hiç bir yerde bu detail tabloları post etmediğim halde post edilmiş olarak görünüyorlar. state'leri DsInsert olması gerekirken DsBrowse oluyor. bu durumda edit çalışıyor ve edit çalıştıktan sonra state dsinsert oluveriyor.
Bişnev in ney çün hikâyet mîküned
Ez cüdâyîhâ şikâyet mîküned
Resim
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7602
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

bu sanırım ADO componentlerinin bir bug'ından kaynaklanıyor. Master/detail'de benzer bir sorunu bende yaşamıştım. Bunun birkaç türlü çözümü var, kodlarım evde. Bakıp yazarım inşallah.

Eğer bu bug'dan dolayı değilse, en güzel tespit yolu adım adım çalıştırarak bulmak. Yanlışlıkla girilen olaya bir showmessage koy. Message verip olaya girdiği belli olsun. Daha sonra adım adım çalıştırarak, hangi satırda olaya dallanıyor bul.

Kolay gelsin.
Kullanıcı avatarı
hdayi
Kıdemli Üye
Mesajlar: 1284
Kayıt: 29 Oca 2004 01:53
Konum: Erciyes'in eteklerinden.

Mesaj gönderen hdayi »

Admin yazdı:Eğer bu bug'dan dolayı değilse, en güzel tespit yolu adım adım çalıştırarak bulmak. Yanlışlıkla girilen olaya bir showmessage koy. Message verip olaya girdiği belli olsun. Daha sonra adım adım çalıştırarak, hangi satırda olaya dallanıyor bul.
Kolay gelsin.
Admin'im dediğin gibi adım adım çalıştırdım.

Kod: Tümünü seç

if not(tblerkek.state in [dsedit,dsinsert] ) then tblerkek.edit;
Bu kod çalışırken, mousu state'in üzerine getirdiğimde browse modunda olduğu görünüyor halbuki insert modunda olması lazım zira yeni kayıt eklemiş oluyorum sanırım problem burda başlıyor. browse modunda olduğu için edit komutu çalışıyor ve edit edeceği yerde insert ediyor.
Bişnev in ney çün hikâyet mîküned
Ez cüdâyîhâ şikâyet mîküned
Resim
Kullanıcı avatarı
hdayi
Kıdemli Üye
Mesajlar: 1284
Kayıt: 29 Oca 2004 01:53
Konum: Erciyes'in eteklerinden.

Mesaj gönderen hdayi »

Admin yazdı:Master/detail'de benzer bir sorunu bende yaşamıştım. Bunun birkaç türlü çözümü var, kodlarım evde. Bakıp yazarım inşallah.
Admin'im bakabildin mi :) sabah sabah hemen sıkıştırmış olmayayım ama unutmamışsındır inşallah.
Bişnev in ney çün hikâyet mîküned
Ez cüdâyîhâ şikâyet mîküned
Resim
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7602
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

hocam baya bir uğraşıp hata neydi hatırlamaya çalıştım :)

Benim derdim şöyleydi. Master'ı kaydedip, sonra detail'il kaydediyordum. Ama Detail kayıdı kaydettikten sonra herşeyi boş bir kayıt daha insert ediyordu. O zaman için sorunu girilmesi zorunlu bir alanı kontrol ettirerek çözmüştüm

Kod: Tümünü seç

procedure TDM1.Q_Firmalar_AdresBeforePost(DataSet: TDataSet);
begin
  if Dataset.FieldByName('ADRES_TURU').AsString = '' then
    Abort;
end;

ayrıca şöyle bir kontrolle de girilen kaydı iptal ettimişim :

Kod: Tümünü seç

procedure TDM1.Q_Firmalar_AdresPostError(DataSet: TDataSet;
  E: EDatabaseError; var Action: TDataAction);
begin
  if Dataset.State in [dsInsert] then
    Dataset.Cancel;
end;
Kolay gelsin.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Kardeş dikkatimi çeken bir şey var; Master-Detail olayında detail tabloyu insert ettiğinde onun afterinsertinde master tablo ile bağladığın alanları kesinlikle atamalısın! Atama yapmasan insert ettiğin yeni kayıt ilişki master tablo ile ilişki kuramıyacağından onunla ilgili herhangi bir işlem yapamazsın :!: :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
hdayi
Kıdemli Üye
Mesajlar: 1284
Kayıt: 29 Oca 2004 01:53
Konum: Erciyes'in eteklerinden.

Mesaj gönderen hdayi »

Admin'im senin verdiğin kodları yazdım detail tablolara. nikahid alanını kontrol ettirdim. Banamısın demiyoryeni kayıt açmıyor ama var olanı da etmiyor.
rsimsek yazdı:Kardeş dikkatimi çeken bir şey var; Master-Detail olayında detail tabloyu insert ettiğinde onun afterinsertinde master tablo ile bağladığın alanları kesinlikle atamalısın! Atama yapmasan insert ettiğin yeni kayıt ilişki master tablo ile ilişki kuramıyacağından onunla ilgili herhangi bir işlem yapamazsın :!: :idea:
Recep bey zaten ip orda kopuyor. Otomatik sayı ile bir id üretiyorum master tablosu için. Master tablo post edilene kadar bu sayıyı üretmiyor, detail'in afterinsert'ünde yapınca böyle bir problem oluyor. Master'ın after postuna taşıdım ben de bu olayı ama o da bir çözüm olmadı. :(
Bişnev in ney çün hikâyet mîküned
Ez cüdâyîhâ şikâyet mîküned
Resim
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7602
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

biraz uğraştırır ama şöyle bir yol izleyebilirsin.

1. DBEdit gibi bileşenleri normal Edit'ler ile değiştir. Diğerlerini de aynı şekilde.

2. Kullanıcı bilgileri girsin ve Kaydet butonuna bassın.

3. Gerekli bilgilerin tamamı girilmiş mi kontrol et, girilmemişse kullanıcıyı girmeye zorla.

4. Master tabloyu kaydet (Post)

5. ID bilgisini alarak detail tabloları kaydet.

Kolay gelsin.
Kullanıcı avatarı
hdayi
Kıdemli Üye
Mesajlar: 1284
Kayıt: 29 Oca 2004 01:53
Konum: Erciyes'in eteklerinden.

Mesaj gönderen hdayi »

Sanırım biraz kafayı dinleyip ondan sonra yapacağım bunları :(
Biraz dinleneyim bakalım. master tablonun id'sin otomatik olarak değil de manuel olarak yapayım dedim yine olmadı.
Bişnev in ney çün hikâyet mîküned
Ez cüdâyîhâ şikâyet mîküned
Resim
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Son bir öneri :wink: ; eğer master tablon post etmeden id üretmiyor. o zaman ya autoinc alandan vazgeç bu kısmı elle yap. mesela before insertte max id yi bulup after insertte bir artırıp id ye atabilirsin. böylece hiç sorun kalmaz.
ikinci yol biraz daha uzun; master a insert yapınca bir şekilde detail tabloları tetiklemeyi durdurmalısın. yani;

table1.OnAfterPost := nil; gibi..
daha sonra table1.OnAfterPost := Table1.AfterPost;

Kolay gelsin..
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Cevapla