40.000 kayıtın yaşını hesaplama ?

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
delphi.net
Üye
Mesajlar: 67
Kayıt: 01 Nis 2007 05:30
Konum: mUĞLa

40.000 kayıtın yaşını hesaplama ?

Mesaj gönderen delphi.net »

merhaba arkadaşlar

firebird veri tabanında 40.000 kayıt var ve bu kişilerin yaşlarının hesaplanması günde bir kez yapılması gerekmekte en hızlı şekilde bu işlemi nasıl yapabiliriz ? sql mi yoksa ek bi programı mı yazmalıyız forumda arama yaptım ama yeterli bi cvp bulamadım ....
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

sql mi yoksa ek bi programı mı yazmalıyız
olayında tercih konusu nedir anlamadım ?

- Forumda ne tür bir arama kriteri kullandığını da merak ettim. "40000 kayıtta yaş bulma" şeklinde değil herhalde ? :lol:

- Bir SQL kodu ile bunu yapma imkanın var ancak tam olarak ne istediğini ifade edememişsin...

1. Belirli bir yaşta olanların listesi mi isteniyor ?
2. Her yaş grubundan kaçar kişi olduğunu görmek mi isteniyor ? Yani istatistiki bir bilgi mi istenen ?
3. Tüm kayıtların dökümü her gün yapılıyor mu ki her kaydın sonuna yaş görünsün isteniyor ? Neden 40000 ifadesi kullandın ? Gösterilen kayıt kadarını da gösterme sırasında hesaplatabilirsin ondan sordum.
4. Yaş aralıkları var da o yaş aralığındaki kişilerin listesi mi isteniyor ?

- Bak benim aklıma hemen 4 soru geldi ? Şimdi soruyu soran sen olduğuna göre bir dahaki sefere daha açık ifade kullanırsan kafamızda oluşan bu sorular yerine çabuk bir cevap bulabilirsin. :idea:
Resim
Resim ....Resim
Kullanıcı avatarı
delphi.net
Üye
Mesajlar: 67
Kayıt: 01 Nis 2007 05:30
Konum: mUĞLa

Mesaj gönderen delphi.net »

veri tabanında diyelimki

doğum tarihi : yaş : olmak üzere iki tane alan var

yaklaşık 40.000 tane bu veri tabanına kayıtlı doğum tarihi ve yaş alanları var bunların yaş bilgilerinin sürekli olarak güncellenmesi gerekmekte... yani tercih konusu olarak ek program yada sql farketmez yeterki kısa sürede işi halletsin en uygun şu olur şeklinde sizin fikrinizi ve birazda bilginizi almak istiyorum ? (arama kriteri olarak ta "yaş" olarak bi arama yaptım... bazı açıklamalar var udf den falan bahsetmiş ama bişi anladım açıkçası)... (program yeşil kart bürlorında kullanılıyor günlük olarak yaş bilgilerinin güncellenmesi gerekmekte)

kısacası kayıtlı kişilerinin yaşları hesaplanacak...

inş. kafanızda tek bir soru oluşmuştur şimdi :D
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Kabaca bir yaş hesabı ise (yani yılların farkı) şu SQL komutu işini görecektir

Kod: Tümünü seç

SELECT ad, soyad, (Year(Date())-Year(DogumTarihi)) AS yas FROM Tablo
dediğinde "ad" "soyad" ve "yas" haneleri göreceksin. Eğer işini görüyorsa cevabın budur. Aksi halde bunu "UPDATE TABLE" komutu ile başlayan bir SQL komut dizisi işini görecektir.

- Ayrıca bu işlemler dinamik olabilecek iken neden veritabanında güncelleme gereği duyduğunu bilmediğimden yorum yapamıyorum...
Resim
Resim ....Resim
Kullanıcı avatarı
undefined
Moderator
Mesajlar: 565
Kayıt: 06 Eki 2003 12:01
Konum: Bursa
İletişim:

Mesaj gönderen undefined »

Tüm verileri günlük olarak hesaplatmak yerine, tabloya Calculated field ekleyip verilerin sadece talep edildiğinde hesaplanmasını sağlayabilirsiniz.
Kullanıcı avatarı
delphi.net
Üye
Mesajlar: 67
Kayıt: 01 Nis 2007 05:30
Konum: mUĞLa

Mesaj gönderen delphi.net »

hocam çok teşekkürler işi ben karıştırırıp sorunları başka yerlere çekmişsimmm... verdiğiniz sql kodu biraz değiştirince sorun hallodu 40.000 kayıtın yaşı 5 sn içerisinde hesaplanıyor...
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

Merhaba,

Sorunum aynı olduğu için yeni başlık açmak istemedim. Tabloya ilk veri girişinde

Kod: Tümünü seç

procedure TFrmSicilKayitGirisi.cxDBDateEdit2Exit(Sender: TObject);
var
  islem,gun,ay,yil:integer ;
  artiklar:integer;
  basyili,basAyi,basGunu,bitYili,bitAyi,bitGunu:word;
  begin
    if sicilverigirisdm.sicilgirisIBDSet.State in [dsinsert, dsedit] then
    begin
      artiklar:=0;
      decodedate(trunc(cxdbdateedit2.Date),basyili,basayi,basgunu);
      decodedate(trunc(date),bityili,bitayi,bitgunu);


    if isleapyear(basyili) then artiklar:=artiklar+1;

      artiklar:=artiklar+trunc((bityili-basyili)/4);



    islem := trunc(date) - trunc(cxdbdateedit2.Date);
    islem:=islem-((bityili-basyili)*5)-artiklar;




  gun  := islem mod 30;  //her ayın 30 gün olduğu kabul edildi.
  ay   := (islem div 30) mod 12;
  yil  := (islem div 30) div 12;

   sicilverigirisdm.sicilgirisIBDSet.FieldByName('YGUN').AsInteger:=gun;
   sicilverigirisdm.sicilgirisIBDSet.FieldByName('YAY').AsInteger:=ay;
   sicilverigirisdm.sicilgirisIBDSet.FieldByName('YYIL').AsInteger:=yil;
  end;
end;
şeklinde yine forumdan bulduğum kodlar ile kişinin yaş hesabını yaptırarak tabloya yazdırıyorum. buraya kadar her şey normaldi fakat kullanıcı güncel yaşı ile sorgulama ve bu sorgununda iki ayrı yaş aralığı olarak istemesi üzerine iki saati aşkındır forumda dolanıyorum. bir çok yöntem gördüm ve udf ile daha güzel olduğunu anladım ama nafile bilgim o derece iyi değil. calc alan oluşturdum ve yaş yılını calc alanda hesaplattım ama ayrı bir formda Query ile yapılan yaş aralığı sorgusunda calc alanı göremiyor ve sonuç alamıyorum.

kafamda yaş için yıl, ay, gün alanlarını sistem tarihi ile güncellemek var ama nasıl yapacağımı kurgulayamadım. yol gösterme adına bir ipucu verebilirmisiniz. zira soruyu ilk soran arkadaşım sorununu çözdüğünü belirtmiş ama nasıl çözdüğünü açıklayıcı olarak yazmamış.

kolay gelsin
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

Merhaba,

Biraz tırmalayınca oluyor sanırım. Bu tırmalama alışkanlığını veren forum üyelerine teşekkür ederim.

Kod: Tümünü seç

procedure TFrmSplash.cxButton1Click(Sender: TObject);
var
  islem,gun,ay,yil:integer ;
  artiklar:integer;
  basyili,basAyi,basGunu,bitYili,bitAyi,bitGunu:word;
begin
try
    sicilverigirisdm.ArsivLogIBDSet.Active:=true;
    sicilverigirisdm.SicilGirisIBDSet.Active:=true;
    sicilverigirisdm.SicilGirisIBDSet.First;
    while not sicilverigirisdm.SicilGirisIBDSet.Eof do
    begin
      sicilverigirisdm.SicilGirisIBDSet.Edit;
      artiklar:=0;
      decodedate(trunc(sicilverigirisdm.SicilGirisIBDSet.fieldbyname('DOGUM_TARIHI').AsDateTime),basyili,basayi,basgunu);
      decodedate(trunc(date),bityili,bitayi,bitgunu);
          if isleapyear(basyili) then artiklar:=artiklar+1;
            artiklar:=artiklar+trunc((bityili-basyili)/4);

            islem := trunc(date) - trunc(sicilverigirisdm.SicilGirisIBDSet.fieldbyname('DOGUM_TARIHI').AsDateTime);
            islem:=islem-((bityili-basyili)*5)-artiklar;

            gun  := islem mod 30;  //her ayın 30 gün olduğu kabul edildi.
            ay   := (islem div 30) mod 12;
            yil  := (islem div 30) div 12;

            sicilverigirisdm.sicilgirisIBDSet.FieldByName('YGUN').AsInteger:=gun;
            sicilverigirisdm.sicilgirisIBDSet.FieldByName('YAY').AsInteger:=ay;
            sicilverigirisdm.sicilgirisIBDSet.FieldByName('YYIL').AsInteger:=yil;
      sicilverigirisdm.SicilGirisIBDSet.Post;
      sicilverigirisdm.SicilGirisIBDSet.Next;
    end;
    finally
      sicilverigirisdm.SicilGirisIBDSet.Active:=false;
      sicilverigirisdm.ArsivLogIBDSet.Active:=false;
    end;
şeklinde sistem tarihi ile yıl, ay, gün olarak yaşını güncelledim. Yalnız burada eleştirilerinizi bekliyorum. ne kadar sağlıklı bir yapı. ne kadar yavaş veya hızlı çalışan yöntem. ileride sorun oluşabilirmi. elimde yeteri kadar vt ye girecek veri yok bu yüzden tavsiyelerinizi bekliyorum.

kolay gelsin
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
Kullanıcı avatarı
mudipasa
Üye
Mesajlar: 169
Kayıt: 13 Tem 2004 02:25
Konum: Batman

Mesaj gönderen mudipasa »

bobasturk kardeş bu işlemi while do ile bütün kayıtları tek tek mi yapıyorsun...? bu işlem uzun sürmüyormu. (senin kodlarından bunu anladım.)
SQL de o kadarda bilgim yok ama bunun daha kısa bir yolu yokmu. bende de bir takım hesaplamalar yaşıyorum. Sormaya çekinmiştim doğrusu..?
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Mesaj gönderen bobasturk »

merhaba,

@mudipasa ustam doğru söylersin. bu şekilde çok uzun süreceği belli. hele birde ileride 150 000 bin kayıt girilecek ve her geçen gün artıyor. tırmalamadan bahsetmiştim, update sql içerisine kafamda yukarıda verdiğim yıl, ay, gün işlemini yerleştiremedim ve geçici olarak bu yöntemi seçtim.

bir ipucu ile update sql içerisine yıl, ay, gün hesaplamayı gömmeyi gösterebilirse ustalar gayet güzel olacak.

teşekkür ve saygı ile
kolay gelsin
Şefkat-u Merhamette Güneş Gibi Ol.
Başkalarının Kusurunu Örtmekte Gece Gibi Ol.
Sehavet-u Cömertlikte Akarsu Gibi Ol.
Hiddet-u Asabiyette Ölü Gibi Ol.
Tevazu-u Mahviyette Toprak Gibi Ol.
Ya Olduğun Gibi Görün Ya Göründüğün Gibi Ol.

Resim
Cevapla