Master-Detail & Transaction Hakkinda bir soru..

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Glen
Üye
Mesajlar: 277
Kayıt: 12 Eki 2005 11:58

Master-Detail & Transaction Hakkinda bir soru..

Mesaj gönderen Glen »

Merhaba..

Master & Detail tabloyu ayni anda kaydetmem ve ayni anda ayni form üzerinden degi$iklik yapabilmem gerekiyor..

Örnek vermek gerekirse sanirim Öğretmen - Öğrenci mantiginla izah edebilirim...

Bir form yaratti.. Üstte öğretmen'in bilgilerini girecegim alanlar.. Altta ise bir Grid, öğrencileri ekleyebilecegim.. Asagidaki Kaydet butonuna bastiginda ise hem ögretmeni, hem de ögretmene bagli ogrencilerin kayit edilmesi gerekiyor...

Bunun icin en uygun yontem nedir.. Bir for dongusu ile verileri tek tek kaydetmek, kaydi gerceklestirecek kullanicinin bilgisayarinda herhangi bir sorun olusmasinda sanirim sorun cikaracaktir.. Bunu Transaction ile cözebilirim sanirim, ancak sorun $u noktada ba$liyor.. Transaction ba$latildiginda o tablodaki butun kayitlar mi kilitleniyor.. Yani ben deneme yaptigimda bir transaction baslattim, transaction bitene kadar Select islemi bile yapilmiyor, yanli$im varsa düzeltin lütfen.. Emin degilim cünkü transactioni baslattigim bilgisayar ile select i$lemini gercekle$tirdigim bilgisayar ayni bilgisayardi belki de bundan dolayi sorun cikmi$tir diye endi$em var, yoksa ayni olayi 2 farkli bilgisayarda da mi yapiyor yani biri bir tabloda transaction ba$lattiginda diger bilgisayar o tablo üzerinde select i$lemi dahi yapamiyor mu?.. Eğer yapamiyorsa, bir döngüde cikabilecek hata sonucunda ne yapilir?..

2. büyük sorun hatta kaydi yapmaktan daha büyük bir sorun olan kaydedilmi$ bir kaydi degi$tirme.. Öğretmen listesini dü$ünün.. Değiştire bastigimda acilacak formda Hem o öğretmenin bir kaç bilgisi hem de o öğretmene bagli bütün öğrenciler listeye gelecek.. Listeye gelen öğrencilerin sayisi 30 olsun. kullanici bu 30 kayit icerisinden 5 tane kaydi sildi, 2 tane kaydi degi$tirdi.. 7 tane de kayit ekledi.. Bu degi$iklikleri, kayit eklemeleri ve silmeleri nasil kontrol edebilirim. Kayitlari tek tek kontrol etmek olmaz, hepsini silip tekrar döngüyle insert etmek (yani sonuc olarak en son halini getirmek) de olmaz.. yani olur da hic saglikli olmaz.. O olmaz bu olmaz, peki nasil bir yöntem izlenir, en sagliklisi nedir?....

$imdidn cok te$ekkür ediyorum, herkese kolay gelsin..

NOT: Adnan abi (Kuri_YJ) bu konuyu daha once aciklami$ti ama sanirim biraz daha detay gerekiyor, artik bir dayagi hakettim kabul ediyorum kusuruma bakmazsin artik:P

Bu arada not a bir not daha ekliyeyim :) Acikladigin yontem updateleri deleteleri insertleri bu noktada SQL kullanarak degil de Edit. Post vs. table ile yapmakti ancak... sorun $urada ba$liyor. Ben Edit ve post yapmadan once her$eyi sp ile yaptirdigim icin bir takim kontroller yaptiriyorum ve bana bu bir suru kolayliklar sagliyor.. Örneğin bir öğretmen / öğrenci kaydederken o öğretmenin bulunduğu ili başka bir tablodan okutup daha sonra kayit esnasinda o il'in hala durup durmadigini kontrol etmek, eger varsa kaydi tamamlamak degilse kaydi iptal etmek gibi.. Edit ve Post islemlerinde sanirim bunu yapamiyorum.. Evet yapabiliyorum ama delphi kismindan yani kayit yapmadan once Query ile bir select islemi yapmak, sonucunda Recordcount > 0 ise edit post degilse iptal.. Ama delphi kismindan bu kontrolü yapmak sanirim performans acisindan bayagi bir dezavantaj..

Tekrardan kolay gelsin..
Kullanıcı avatarı
sadettinpolat
Moderator
Mesajlar: 2131
Kayıt: 07 Ara 2003 02:51
Konum: Ankara
İletişim:

Re: Master-Detail & Transaction Hakkinda bir soru..

Mesaj gönderen sadettinpolat »

Glen yazdı: Bunun icin en uygun yontem nedir.. Bir for dongusu ile verileri tek tek kaydetmek, kaydi gerceklestirecek kullanicinin bilgisayarinda herhangi bir sorun olusmasinda sanirim sorun cikaracaktir.. Bunu Transaction ile cözebilirim sanirim, ancak sorun $u noktada ba$liyor.. Transaction ba$latildiginda o tablodaki butun kayitlar mi kilitleniyor.. Yani ben deneme yaptigimda bir transaction baslattim, transaction bitene kadar Select islemi bile yapilmiyor, yanli$im varsa düzeltin lütfen.. Emin degilim cünkü transactioni baslattigim bilgisayar ile select i$lemini gercekle$tirdigim bilgisayar ayni bilgisayardi belki de bundan dolayi sorun cikmi$tir diye endi$em var, yoksa ayni olayi 2 farkli bilgisayarda da mi yapiyor yani biri bir tabloda transaction ba$lattiginda diger bilgisayar o tablo üzerinde select i$lemi dahi yapamiyor mu?.. Eğer yapamiyorsa, bir döngüde cikabilecek hata sonucunda ne yapilir?..
kullandığın veritabanini belirtmemişsin ama hangisi olursa olsun bi select işleminde bütün kayıtlara kilit koyması söz konusu değil. transactioun izolasyon düzeyiyle ilgili bir sorun olabilir. bundan sonraki yazıda ise fb + ibx kullandığını varsayıp buna göre devam edecem :)

aynı işlemi ben şu şekilde yapıyorum genelde.
kullanıcı ogretmenler formunu açar ve insert tuşuna basarak yeni bir öğretmen kaydı girer. girdigi bu ogretmene ogrenci kaydi girmek isterse bu seferde ogrenciler formunu acar ve ogrenciler kaydini girer. burda dikkat edilmesi gereken sey fb tarafından tabloların primary key alanlarına atanan degerlerin anında delphi tarafına yansıtılmasıdır aksi takdirde hatalı kayıt girişi olur.

Glen yazdı: 2. büyük sorun hatta kaydi yapmaktan daha büyük bir sorun olan kaydedilmi$ bir kaydi degi$tirme.. Öğretmen listesini dü$ünün.. Değiştire bastigimda acilacak formda Hem o öğretmenin bir kaç bilgisi hem de o öğretmene bagli bütün öğrenciler listeye gelecek.. Listeye gelen öğrencilerin sayisi 30 olsun. kullanici bu 30 kayit icerisinden 5 tane kaydi sildi, 2 tane kaydi degi$tirdi.. 7 tane de kayit ekledi.. Bu degi$iklikleri, kayit eklemeleri ve silmeleri nasil kontrol edebilirim. Kayitlari tek tek kontrol etmek olmaz, hepsini silip tekrar döngüyle insert etmek (yani sonuc olarak en son halini getirmek) de olmaz.. yani olur da hic saglikli olmaz.. O olmaz bu olmaz, peki nasil bir yöntem izlenir, en sagliklisi nedir?....
hepsini tek tek kontrol etmek neden olmuyor?
kullanıcı bir kaydı sildikçe, düzenledikçe ekledikçe kontrol işlemleri gerçekleştiriebilir. bunun böyle olmasını gerektiren başka özel durumlar var diyorsanız ayrı bir mevzu tabi. o zaman clientdataset gibi bi bileşen kullanılabilir. clientdataset ile hangi kayıtların değiştiğini, silindiğini vs. öğrenebilirsiniz.

Glen yazdı: Bu arada not a bir not daha ekliyeyim :) Acikladigin yontem updateleri deleteleri insertleri bu noktada SQL kullanarak degil de Edit. Post vs. table ile yapmakti ancak... sorun $urada ba$liyor. Ben Edit ve post yapmadan once her$eyi sp ile yaptirdigim icin bir takim kontroller yaptiriyorum ve bana bu bir suru kolayliklar sagliyor.. Örneğin bir öğretmen / öğrenci kaydederken o öğretmenin bulunduğu ili başka bir tablodan okutup daha sonra kayit esnasinda o il'in hala durup durmadigini kontrol etmek, eger varsa kaydi tamamlamak degilse kaydi iptal etmek gibi.. Edit ve Post islemlerinde sanirim bunu yapamiyorum.. Evet yapabiliyorum ama delphi kismindan yani kayit yapmadan once Query ile bir select islemi yapmak, sonucunda Recordcount > 0 ise edit post degilse iptal.. Ama delphi kismindan bu kontrolü yapmak sanirim performans acisindan bayagi bir dezavantaj..
öncelikle sp'leri kayıt ekleme,silme,düzeltme, iş mantıklarını oluşturma gibi yerlerde kullanılmasına pek sıcak bakmayan bir insanım. sp leri genelde raporlama için ve vt üzerinde bazı testleri gerçekleştirmek için kullanmayı daha çok benimsemiş durumdayım. neyse konumuza dönersek sp ile yaptırdığınız kontrolleri zaten fb kendisi yapabilir. bunun için uygun fk, pk tanımlamalarını yapmanız yeterli. bunları yaparsanız delphi tarafında Recordcount > 0 gibi bir işlem yapmak zorunda kalmazsın. post dersin. kendisine bağlı öğrencileri olan bir öğretmeni kullanıcı silmek istediği zaman fb buna zaten izin vermeyecektir.
"Sevmek, ne zaman vazgececegini bilmektir." dedi, bana.

---
http://sadettinpolat.blogspot.com/
Glen
Üye
Mesajlar: 277
Kayıt: 12 Eki 2005 11:58

Mesaj gönderen Glen »

MSSQL veritabani kullaniyorum,

Aslina bakarsaniz bu olayi tek bir formda yapmak zorundayim.. Yani bahsettiginiz $ekilde yapmak da i$imi goruyor ki ben bir cok bolumde 2 farkli formdan kayit yapiyoru. Ancak sorun $u ki bu sefer tek bir formdan yapmak zorundayim...

Aklima gelen

declare @id int
INSERT INTO .......
VALUES.......
SELECT @id = @@IDENTITY
gibi bir i$lemle Id ye degeri atip ondan sonra delphi kismindan OGRETMEN'in Primary keyini bulabilir ve bir donguyle kayit islemini tamamlaybilirim yani tek tek butun ogrencilerin kaydini yaptirmakta..

Transaction sorumu sanirim anlatamadim.. Bir tablo uzerinde bir transaction baslattigimda baska bir kullanici herhangi bir i$lem yapabiliyor mu?
Cevapla