Merhaba Arkadaşlar,
Tablomda numeric bir alan olan ISLMENO alanını tabloya yeni bir kayıt eklendiğinde daha da özel anlatırsam: DBNavigator bileşeninin "+" butonuna tıklandığında kod yardımıyla 1 arttırmaya çalışıyorum. Ama beceremedim. Bu alan için AutoInc tipini kullanamıyorum. Kullanıcının manuel olarak girmesi de şık olmuyor. Bu yüzden kod içerisinden bu işi yapmak zorundayım. Table'ın OnNewRecord olayına aşağıdaki kodu yazdım fakat çalıştırdığımda program sonsuz bir döngüye giriyor.
Table1.Insert dedikten sonra Table1.Last dediğinde Insert modundan çıkarsın, bu sebeple sana cannot edit vs. gibi bir hata verir.
Onnewrecord'da ayda before insert eventinde, son numarayı buldurman ondan sonra Insert değerine atama yapman lazım.
Insert isleminden sonra kayıtlar arasında hareket etmemelisiniz.
Yani once son kayda gidip son kayıt degerini aldiktan sonra insert islemini yapmanız gerekir.
Sevigili Kuri_TLJ Abi ve Sevgili Fahrettin Abi,
her ikinize de yardımlarınız için çok teşekkür ediyorum. İkinizin de tavsiyelerinden yola çıkarak kodu aşağıdaki gibi düzenledim fakat programı çalıştırıp DBNavigator'ın "+" tuşuna tıkladığımda düğme bir süre basılı kalıyor ve arkasından "Stack owerflow" diye bir hata mesajı alıyorum. Bunun anlamı nedir? Çözmek için ne yapabilirim?
var
aradegisken:integer;
begin
Table1.Last;
aradegisken:=Table1ISLEMNO.AsInteger;
Table1.Insert;
Table1.ISLEMNO.AsInteger:=aradegisken+1;
Table1.Post;
end;
Soyle yapmayi bir dene...
teble'in before insert eventinde son degeri al.
After insert eventinde de kullan.
Tamam sanirim sorun su ki hem sen zaten Arti tusu ile insert isi yapiyorsun. ve event tetiklenince bir daha insert kodu var derken al sana kısır dongu.
Before insert ve after inserti kullanabilirsin. Ayrica Table1.Insert gibi bir komuta gerek yok. Zaten senin navigator'daki arti tusu insert anlamina geliyor.
Arkadaşların söylediklerini eleştiri mahiyetinde anlaşılmasın ama yukarda söylenen işlemi son derece mahsurlu görüyorum. Table ın en sonuna gidip en sondaki kaydın değerini almak doğru bir çözüm değil bence. Çünkü son kayıt her zaman en büyük kayıt olmayabilir. Ben bu işlemi 2 şekilde uyguluyorum duruma bağlı olarak. Ya bir başka table da değer tutuyorum ve her kayıtta bu değeri artırıp hem geri kaydediyorum hemde kullandığım table a kaydediyorum. Ya da Bir Query de (MAX) ile en büyük sayıyı bulup artırarak kaydediyorum. Bence bu iki yöntemden birini kullanmak daha stabil bir yapı sağlayacaktır.
Sevgiler...
Sevgili Recep Abi, affınıza mahcuben bir hatırlatma yapmak istiyorum. Query nesnesini kullandığımızda sorun yok da Table nesnesi ile çalışıyorsak max kayıt_no 'yu nasıl bulabiliriz?
Saygılarımla...
table ile yapmak istendigi zaman
max bulunması gereken alana gore bir index olusturman gerekli evvela
sonra artan yada azalan (index hangisine gore belirlenmisse) sekilde sıralayıp
son yada ilk kaydı alarak yapabilirsin
bunun haricinde benimde aklıma baska bir cozum gelmiyor...
Eğer mevzu-bahsı geçen alan bir key olarak tanımlanmışsa ve asc (artan) sıradaysa Table1.Last ile tablonun sonuna gidip son kayıtı bir artırmak yeterli olur. Fakat bu işlemi afterinsert te yapamazsın!! o zaman önceki mesajlarda bahsedildiği gibi global bir değişken tanımlanıp, beforeinsert te son (max) kayıt nosu bu değişkene atanıp; afterinsert te de insert edilen yeni kayıta bir artırılarak atanır.
Abi daha iyi anlaşılması için şöyle izah edeyim sevgili Fahrettin abi ve sevgili Kuri_TLJ abinin tavsiyeleriyle şöyle yaptım PrimaryKey olarak tanımlanmış olan ISLEMNO alanını her yeni kayıtta bir arttırmak için Table'ın BeforeInsert olayına
kodunu yazdım
buradaki aradeger dediğiniz gibi global bir değişken fakat max no'yu değil son kayıt no'ya atanıyor. Sizce doğru yolda mıyım?
Saygılarımla...