
Detail de Birden Çok Kayıt Girdikten Sonra Kaydetme?
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Detail de Birden Çok Kayıt Girdikten Sonra Kaydetme?
MErhaba arkadaşlar. Aşağıda ki şekilde bir formum var. DbGrid'in üst tarafı ana tabloya DbGrid detay tabloya bağlı. Böyle bir form hazırladıktan sonra detay tabloya birden çok kayıt girip alttaki kayıt butonuna basınca ana ve detay tablomun kaydedilmesini istiyordum. Ama detayda ikince satıra geçince otomatik olarak DbGrid'in bağlı olduğu tabloyu kaydediyor. Bense bu şekilde değil tüm kayıtlardan girildikten sonra kaydet butonuna basılınca olmasını istiyorum. Aramalarım tam olarak bulamadım istediğimi. Ara sıra VS C#' da kullanıyorum. Orda dataset nesnesi üzerinden vt işlemlerinizi yaparsanız önce datasete kaydedilip siz istediğiniz zaman veritabanındaki tabloya değişiklikleri yansıtabiliyorsunuz. Sanırım delphi ile aynı şansım yok peki böyle bir sorunu nasıl çözerim. Teşekkürler cevaplarınız için şimdiden...


Re: Detail de Birden Çok Kayıt Girdikten Sonra Kaydetme?
s.a.
temptable kullanrak halledebilirsiniz.
kolay gelsin.
temptable kullanrak halledebilirsiniz.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Re: Detail de Birden Çok Kayıt Girdikten Sonra Kaydetme?
Hocam temptable dan kastınız vt de aynı yapıda bir tablo daha oluşturup işlemleri orada yapıp benim kaydet butonuna basmamla normal tabloya taşımam mı? Sanırım temp tabloda işlemler yapıldıktan ve veriler diğer tabloya aktardıktan sonra temp tablodaki kayıtlarıda vt şişmesin diye silmem lazım. Doğru anlamışım hocam?
Re: Detail de Birden Çok Kayıt Girdikten Sonra Kaydetme?
memtable (bellekte çalışan tablo) diye araştırın.
Re: Detail de Birden Çok Kayıt Girdikten Sonra Kaydetme?
tarnsaction kullanabilirsin.
Verileri kaydetmeye başlamadan önce connection nesnesine begintransaction diyerek başlarsın.
Örnek veriyim: (ADO ve Ms Sql kullandığını varsayıyorum.)
ADOConnection1.Begintrans ---> yeni kayıt butonuna ekle
ADOConnection1.CommitTrans ---> Kaydet butonundaki işlemlerin en sonuna ekle.
ADOConnection1.Rollback ---> Vazgeç butonuna ekle.
Böylece sen kaydet diğene kadar veriler asla tabloya fiziksel olarak yazılmaz.
Sen kaydet demeden programı kapatsan bile rollback olur. Yada vazgeç değinde rollback çalışır.
Verileri kaydetmeye başlamadan önce connection nesnesine begintransaction diyerek başlarsın.
Örnek veriyim: (ADO ve Ms Sql kullandığını varsayıyorum.)
ADOConnection1.Begintrans ---> yeni kayıt butonuna ekle
ADOConnection1.CommitTrans ---> Kaydet butonundaki işlemlerin en sonuna ekle.
ADOConnection1.Rollback ---> Vazgeç butonuna ekle.
Böylece sen kaydet diğene kadar veriler asla tabloya fiziksel olarak yazılmaz.
Sen kaydet demeden programı kapatsan bile rollback olur. Yada vazgeç değinde rollback çalışır.
Re: Detail de Birden Çok Kayıt Girdikten Sonra Kaydetme?
Cevaplarınız için teşekkürler. En kolay yöntem olarak tuna hocamın dediği transaction yöntemini kullandım. Fakat orda da şu şekilde bir sorun yaşıyorum. Detay kayıtta tek kayıt eklersem sorunsuz bir şekilde master tablodan aldığım birincil alanı detaya yabancı alan olarak girebiliyorum. Fakat detayda birden çok kayıt olursa sadece en sonuncu detay kaydın yabancı anahar bölümüne ana tablodan aldığım alanı ekliyor. Bunun için ne yapabilirim? Aklıma şu geldi ama böyle birşey var mı bilmiyorum. Transaction başlatıp detaya kayıtları girmeye başlayıp detayda ikinci kayda geçtiğimde detayda 1 den fazla kayıt varsa (fiziksel tabloda değil hafızadaki transaction işleminde) her beforePost olayında ana tablodan alacağım anahtarı detaya yabancı anahtar olarak girmek. Fakat burda da hafızadaki sonlanmamış transaction işlemindeki detaydaki kayıt sayısını nasıl alacağımı bilmiyorum. Ne yapmalıyım transaction kullanırken yardımızı bekliyorum arkadaşlar...
Re: Detail de Birden Çok Kayıt Girdikten Sonra Kaydetme?
Arkadaşlar sorunu hallettim. detayQuery' nin beforePost olayında ana tablodan id alanını alıyorum ve kaydediyorum. En kolay çözüm bu oldu işe yaradı. Teşekkürler cevaplarınız için...