Konuyu Paylaş : facebook gplus twitter

Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
DB de Günlük Artan Autoinc Alan
#1
Merhaba Arkadaşlar..

Firebird de, 1 tabloda id ve id_gun  2 alanım var. id autoinc bir alan.. id_gun ise: hergün sıfırlayan bir autoinc alan olmasını istiyorum.

ilk aklıma gelen: bir after insert triggerı yazıp 

new.id_gun = (select count(*) from tablom where tarih=current_date)+1; 

geldi. Fakat gün geçtikce yavaşlatacaığını düşündüm.. Sizin bir öneriniz varmıdır bu konuda?

Teşekkürler.
WWW
Cevapla
#2
Merhaba,
önce günlük sayaçta kullanmak üzere generator yarat
before insert trigger'da
günün tarihini kontrol et,
yoksa günlük günlük generator sıfırla ve ilk değeri kullan
varsa günlük generator'dan değer alıp kullan
Cevapla
#3
(01-02-2018, Saat: 22:23)mcuyan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhaba Arkadaşlar..

Firebird de, 1 tabloda id ve id_gun  2 alanım var. id autoinc bir alan.. id_gun ise: hergün sıfırlayan bir autoinc alan olmasını istiyorum.

ilk aklıma gelen: bir after insert triggerı yazıp 

new.id_gun = (select count(*) from tablom where tarih=current_date)+1; 

geldi. Fakat gün geçtikce yavaşlatacaığını düşündüm.. Sizin bir öneriniz varmıdır bu konuda?

Teşekkürler.

Merhaba,

Neden böyle bir şeye ihtiyaç duyuyorsunuz?
Cevapla
#4
Bence serino diye bir tablo yap orda tarih ve sonno yu tut trigger ile de ana tablonun ilgili alanına son değeri yazarsin boylece gün geçtikçe yavaşlama olmaz ve takibin kolay olur
Cevapla
#5
(02-02-2018, Saat: 09:29)uparlayan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
(01-02-2018, Saat: 22:23)mcuyan Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Giriş yap veya Üye OlMerhaba Arkadaşlar..

Firebird de, 1 tabloda id ve id_gun  2 alanım var. id autoinc bir alan.. id_gun ise: hergün sıfırlayan bir autoinc alan olmasını istiyorum.

ilk aklıma gelen: bir after insert triggerı yazıp 

new.id_gun = (select count(*) from tablom where tarih=current_date)+1; 

geldi. Fakat gün geçtikce yavaşlatacaığını düşündüm.. Sizin bir öneriniz varmıdır bu konuda?

Teşekkürler.

Merhaba,

Neden böyle bir şeye ihtiyaç duyuyorsunuz?

İlginize Teşekkürler ilk etapta.. Stok satış uygulamasında müşteri tarafından Fiş üzerinde her gün 0 an başlayan bir fiş no çıkması isteniyor onun için yapmak zorunda kaldım..

Şu anda delphi tarafında 1 query ile o günki adetini alıp +1 ekleyip ilgili alana yazdırıyorum. Fakat kayıt sayısı çoğalınca (milyonlar) nasıl tepki verir bilemiyorum.

Peki günlük sıfırlamayı nasıl planlamalıyım?.. Çünki Sunucuları hep açık değil.. bazı kişiler sabah 8 de açıyor makinalarını bazı kişiler 9 10 vs.. yoksa o a aklıma gelmişti fakat sonradan vazgeçtim.. Uygulamada sadece bu iş için 1 tablo kullanmak da ne kadar mantıklı onu bilmiyorum

Before insert trigger da ise o dediğimiz olay yemedi.. 

CREATE trigger satgun for sbaslik
active after insert position 0
AS
begin
old.satfatnogun = select count(*) from sbaslik where SATTARIHI=current_date + 1 ;
end

hata mesaj:

can't format message 13:896 -- message file D:\onemli yedek\HK-Software\firebird.msg not found.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 5, column 19.
select.

AS
begin
if (old.satid is not null) then
begin
update sbaslik set satfatnogun = (select count(*) from sbaslik where SATTARIHI=current_date) + 1
where satid= old.satid;
end
end

Bu da olmuyor. satid autoinc alan benzersiz.. fakat old lu tarafta hata veriyor.. before insert de diyemeyiz çünki daha satid datsı hazır değil.. sanırım fb de bir bug bu after insert trigger olayı.
WWW
Cevapla
#6
(select count(*) from sbaslik where SATTARIHI=current_date)
Firebird kullanmadığım için test etme imkanım yok fakat yukarıdaki kısım NULL değer üretiyor olabilir. "NULL + 1" = NULL'dur diye biliyorum.
Cevapla
#7
Uğur bey, FB de hiç kayıt yoksa bile 0 değerini üretiyor. orda sorun yok.. SQL im biraz zayıf bu konuda..

Fakat dediği gibi halen FB de after insert triggerini konumlandıramadım kafamda..
WWW
Cevapla
#8
Firebird de db sorgusundan dönen değer direk işleme alınamıyor, bunun yerine sorgudan dönen değeri bir değişkene atıp o şekilde kullanmanız gereklidir.
AS
declare variable sayi Integer;
begin
if (old.satid is not null) then
begin
SELECT COUNT(*) from sbaslik WHERE SATTARIHI=current_date INTO :sayi;
If (Sayi Is Null) Then Sayi = 0; // eger null çıkıyorsa ki çıkmaz.
UPDATE sbaslik set satfatnogun = (:sayi+1)
where satid= old.satid;
end
end

şeklinde yapabilirsiniz.
Linkleri Görebilmeniz İçin Giriş yap veya Üye Ol
WWW
Cevapla
#9
 SELECT COUNT(*) from sbaslik WHERE SATTARIHI=current_date INTO :sayi;
yerine
SELECT max(satfatnogun) from sbaslik WHERE SATTARIHI=current_date INTO :sayi;
daha mantıklı olabilir.
satır silinme durumunda COUNT(*) değeri silinme adedine göre azalacak bu da önceden verilmiş değerin yeniden verilmesine neden olur.
Cevapla
#10
haklısınız.. Teşekkürler..
WWW
Cevapla

Konuyu Paylaş : facebook gplus twitter





Konuyu Okuyanlar: 1 Ziyaretçi