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.
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
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?
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
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...
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...
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
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.
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.
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
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
procedure TDM1.Q_Firmalar_AdresPostError(DataSet: TDataSet;
E: EDatabaseError; var Action: TDataAction);
begin
if Dataset.State in [dsInsert] then
Dataset.Cancel;
end;
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
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
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
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
Son bir öneri ; 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;