Numeric bir alanın değerini her kayıt eklendiğinde 1 arttırm

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
mpolat
Üye
Mesajlar: 96
Kayıt: 30 Ağu 2003 01:19
Konum: Malatya

Numeric bir alanın değerini her kayıt eklendiğinde 1 arttırm

Mesaj gönderen mpolat »

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.

Kod: Tümünü seç

Table1.Insert;
Table1.Last;
Table1ISLEMNO.AsInteger:=Table1ISLEMNO.AsInteger+1;
Table1.Post;
yardım ederseniz sevinirim.
"İlmin anası sormaktır"
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selam,

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.

Kolay gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

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.

Kolay gelsin...
Kullanıcı avatarı
mpolat
Üye
Mesajlar: 96
Kayıt: 30 Ağu 2003 01:19
Konum: Malatya

Mesaj gönderen mpolat »

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?

Kod: Tümünü seç

var
aradegisken:integer;
begin
Table1.Last;
aradegisken:=Table1ISLEMNO.AsInteger;
Table1.Insert;
Table1.ISLEMNO.AsInteger:=aradegisken+1;
Table1.Post;
end;
"İlmin anası sormaktır"
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

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.
Kullanıcı avatarı
mpolat
Üye
Mesajlar: 96
Kayıt: 30 Ağu 2003 01:19
Konum: Malatya

Mesaj gönderen mpolat »

Ya çok teşekkür ederim Fahrettin Abi dediğiniz gibi yapınca çözüldü çok şükür.
"İlmin anası sormaktır"
sair
Kıdemli Üye
Mesajlar: 288
Kayıt: 16 Haz 2003 04:41
Konum: Kastamonu
İletişim:

Mesaj gönderen sair »

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...
Kullanıcı avatarı
mpolat
Üye
Mesajlar: 96
Kayıt: 30 Ağu 2003 01:19
Konum: Malatya

Mesaj gönderen mpolat »

Merhabalar sair abi başka bir table'da değer tutmak şeklindeki çözümünüzü daha detaylı anlatabilir misiniz?
"İlmin anası sormaktır"
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Olayın en basit ve kararlı yolu şair kardeşimizin de dediği gibi max kullanarak ve sadece AfterInsert te işi çözmektir.

Kod: Tümünü seç

with TQuery.Create(Self) do
try
  DatabaseName := DataSet.DatabaseName;
  SQL.Clear;
  SQL.Add('select max(kayit_no) from ' + DataSet.TableName);
  Active := True;
  DataSet.FieldByName('Kayit_No').AsInteger := Fields[0].AsInteger + 1;
  Active := False;
finally
  Free;
end;
....
Böylece her yeni kayıt bir sonraki numarayı almış olur.
Kullanıcı avatarı
mpolat
Üye
Mesajlar: 96
Kayıt: 30 Ağu 2003 01:19
Konum: Malatya

Mesaj gönderen mpolat »

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...
"İlmin anası sormaktır"
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

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...
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

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.
Kullanıcı avatarı
mpolat
Üye
Mesajlar: 96
Kayıt: 30 Ağu 2003 01:19
Konum: Malatya

Mesaj gönderen mpolat »

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

Kod: Tümünü seç

tblAna.Last;
aradeger:=tblAnaISLEMNO.AsInteger;
kodunu
Table'ın AfterInsert'ine de

Kod: Tümünü seç

tblAnaISLEMNO.AsInteger:=aradeger+1;
tblAna.Post;
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...
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

afterpost taki
Table'ın AfterInsert'ine de
Kod:
tblAnaISLEMNO.AsInteger:=aradeger+1;
tblAna.Post;
tblAna.Post satırı olmayacak!
Kullanıcı avatarı
mpolat
Üye
Mesajlar: 96
Kayıt: 30 Ağu 2003 01:19
Konum: Malatya

Mesaj gönderen mpolat »

Çok teşekkürler Recep Abi
"İlmin anası sormaktır"
Cevapla