çok kullanıcılı kayıtta otomatik kayıt no artışı

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
MicroChip
Kıdemli Üye
Mesajlar: 1119
Kayıt: 02 Ağu 2003 01:02
Konum: İstanbul
İletişim:

çok kullanıcılı kayıtta otomatik kayıt no artışı

Mesaj gönderen MicroChip »

Merhaba ilk kez denediğim değişik bir metodda bir sorum var

bir tabloda kayıtlar tutuluyor ve "kod" diye bir string alanım var ve key.

bir tabloda da tüm tabloların son kayıt no ları tutuluyo (tablo adı idno) ve diğer tablolara her kayıt eklendiğinde buradaki kayıt bir artırılıp ilgili tablonun koduna veriliyo.

fakat başıma şöyle ilginç bişey geldi ben bunu çok kullanıcılı yapsam nasıl olacak (tek kullanınca sorun yok)
mesela iki kişi aynı anda kayıt yaparsa tablo editerror hatası verecek çünkü idno tablosundaki ilgili kod artarken (kod '00001' oluyo '00002') edit olmuş oluyo ikinci kez de edit olursa (edit modunda iken) çakar :)

bende şöyle bişey yaptım:

if table1.state = dbedit then
begin
showmessage('lütfen tekrar kaydedin'); exit;
end
else
begin
table1.edit;
table1.fieldbyname('kod1').assting:=sifirekle(sonkayit+1);
table1.post;
end;

ama bu ve değişik table eventlarını denediğiö halde olmadı

aklıma kaydı locked yapmak geldi ama nasıl yapacağımı bilmiyorum.
yani bir kullanıcı edit modundayken diğer kullanıcıya tekrar dene yaptıracam.

table1 = adodataset idi (idno)
zaten bu tabloda tek kayıt var acaba sorgu mu kullansam ne yapsam,
before inserte kodu yazsam aynı anda yine kayıtta yine güm :)

Görüşlerinizi alabilirmiyim...

viewtopic.php?t=1089 linkini yazmayın da :)

Saygılar
Kafkas Kartalı Kabarday
Sitesi!= http://www.ahmetceylan.com
Resim
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Tablonda kayıt esnasında SQL ile no'yu sorgulatırsın kim önce kaytederse öncelik onun olur sorgu sonucundada kayıt varsa mesala 'CariKod'u' değiştirmesini önerebilirsin.
mesela iki kişi aynı anda kayıt yaparsa tablo editerror hatası verecek çünkü idno tablosundaki ilgili kod artarken (kod '00001' oluyo '00002') edit olmuş oluyo ikinci kez de edit olursa (edit modunda iken) çakar
Programlarda kullanıcı uygulamaları ayrı olacağı dataset ler de ayrı olacaktı bu sebepten dolayı bu tip hata ile karşılaşılmayacağı kanısındayım.

Kolay Gelsin...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7602
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

veritabanı nedir MicroChip? Cevap yazarken veritabanını bilerek yazmak çok daha iyi oluyor, cevapta da veritabanına göre özel çözümler olabiliyor.

Ben freeman35 abimin tavsiyesine uyarak, her tabloma oomatik artan integerbir key koyarım. Çok etkili bi yöntemdir.

1. Mümkünse alanını integer yap.

2. Key alan eğer öğrenci no gibiözel bir anlam taşımıyorsa, bence 1 den direk 3'e atlamasında sorun yok.

3. Eğer yeni bir kayıt aldın, no 5 ve sen kayıt ettiğinde 5 numaralı kaydı bir başkası girmişse, kontrol yaparak 6'ya, o da doluysa 7'ye gibi ilerleyip kaydedebilirsin.

4. Eğer benim yaptığım gibi otomatik artan integer bir alan verirsen, çoğu veritabanı bu işlemi kendisi hallediyor zaten. Senin bunları dert etmene gerek kalmıyor :)

Kolay gelsin.
Kullanıcı avatarı
MicroChip
Kıdemli Üye
Mesajlar: 1119
Kayıt: 02 Ağu 2003 01:02
Konum: İstanbul
İletişim:

Mesaj gönderen MicroChip »

şu anki veritabanım access sonra mysql'e geçiriyorum. (Access ile çalışmak hız kazandırıyor o yüzden)

maalesef veritabanımda auto inc bir integer alan koyamıyorum
illa 00001 , 00002 şeklinde olması ve artan bir şekilde olması gerekiyor. ve bu alan da key diğer tablolardaki kayıtlar da hep bu key ile ilişkili

ama program chok kullanıcı olarak kullanıldığında yine aynı veritabanı kullandığından sorunlar çıkıyo. evet senin dediğin gibi otomatik artan bir integer field kullansaydım bu sorunlar yaşanmayacaktı. Fakat kullanamıyorum.

yukarıda bahsettiğim olayı yapabilmek içinde artan sayı numaralarını bir tableda tutmak gerekiyo (her kullanıcı ulaşabilsin diye) ve kim önce kayıt yaparsa bu tablodaki değer bir artıyo ( bu esneda edit olayı meydana geliyo) ve diğer tablo bu kayıt noyu alıp kaydediyo. Fakat edit modundan çıkmadan diğer kullanıcı post ederse sorun yani hata meydana geliyo zaten gelmesi de lazım.

Fakat bu olayı engellemek için ;

1. hatayı kontrol altına alıp (try except ile) tekrar işlemi yaptırmak gerekiyo.

2. yada dataseti veya recordu kitleyerek diğer kullanıcı da post edeceği sırada hatta etmeden önce record kitli mi değilmi diye kontrol ettirip kullanıcıyı ona göre bir süre bekletmek gerekiyo.

Haksızsam hakkızsın deyin :)

Ama en son olarak yine söylemek istiyorum otomatik artan sayı kullanamıyorum.
Tabi anlattığımı da yapabilmek için küçük delphiye küçük taklalar attırmak gerekiyor.

(Bu konu acaip kafama takıldı)
Saygılarımla...
Kafkas Kartalı Kabarday
Sitesi!= http://www.ahmetceylan.com
Resim
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

Tüm Field larını kullanıcıya göstermek zorunda değilsin, IncField tanımla ve bunu kullanıcıya açma, arka planda tablolar arası linklerini bu alanla yap. Kullanıcıya '00001' gibi alanı çıkar. Bunu prkey Kullanmak zorunda değilsin, eğer bu alan sadece rakkam girilecekse yani 'A0001' gibi birşey olmıyacaksa. Bu alanı integer yap. Currency edit e format verdirtip bunu '0000' ekletirsin. Sana bunun avantaşı SQL yazım bu alanı Max(Alan) şeklinde query ile alırsan sana son girilmiş kaydı çözersin. Bu alanı kullanıcı girecekse ve ardışıksa, her zaman söylediğim gibi unique index tanımlayıp, onposterror event ında hatayı yakalayıp kullanıcıya bu daha önceden girilmiş benzeri bir mesaj döndürebilirsin.
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 !!!
Kullanıcı avatarı
MicroChip
Kıdemli Üye
Mesajlar: 1119
Kayıt: 02 Ağu 2003 01:02
Konum: İstanbul
İletişim:

Mesaj gönderen MicroChip »

incfield i başka uygulamalarımda kullandım fakat bu uygulamam da kullanamam.

otomatik sayı artışının avantajları olduğu gibi dezavantajları var

bu dezavantajlar canımı sıktığı için kullanmamaya da gayret gösteriyorum.

ama yukarıdaki soruma bir yanıt getirebildim ve kısa olarak çözdüm.
tabloyu kapatıyorum kayıt düzeltileceği zaman açıyorum nasılsa tek bir kayıttan oluşuyo. sonra kapatıyorum.
bu kullanıcı post (kayıt) yaparken tablo açık olduğundan diğer bir kullanıcı uyarılıyo ve bekletiliyo.

ama senin dediğin gibi hatta adminimin autoinc de bunların hiçbirine gerek kalmıyor.[/code]
Kafkas Kartalı Kabarday
Sitesi!= http://www.ahmetceylan.com
Resim
sair
Kıdemli Üye
Mesajlar: 288
Kayıt: 16 Haz 2003 04:41
Konum: Kastamonu
İletişim:

Mesaj gönderen sair »

Tek yapacağın şey şu:
Table ın beforepostunda diğer table dan değeri alacaksın,artıracaksın, dönüştüreceksin kaydedeceğin tableın fieldına yükleyeceksin. Bu kadar ancak tüm bu işlemleri table ın beforepost olayında gerçekleştireceksin. Edit modunda olmuşsun, insert modunda olmuşsun farketmeyecek. Ancak tek kötülüğü artırdığın kayıt numarasını kullanıcıya gösteremezsin....
Sevgiler..
Kullanıcı avatarı
MicroChip
Kıdemli Üye
Mesajlar: 1119
Kayıt: 02 Ağu 2003 01:02
Konum: İstanbul
İletişim:

Mesaj gönderen MicroChip »

başka bir dezavantajı :)
tabloya numara alırken yine post edilirken hata verebilecek olması (çok kullanıcı da aynı anda eşzamanlı kayıt olayında) yine aynı olaylar serisi
Kafkas Kartalı Kabarday
Sitesi!= http://www.ahmetceylan.com
Resim
Cevapla