Yaş güncelleme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Yaş güncelleme

Mesaj gönderen bobasturk »

Merhaba,

Kod: Tümünü seç

var
  islem,gun,ay,yil:integer ;
  artiklar:integer;
  basyili,basAyi,basGunu,bitYili,bitAyi,bitGunu:word;
begin
  if not assigned(frmarsivanagiris) then
  begin
    frmarsivanagiris:=Tfrmarsivanagiris.Create(self);
    frmarsivanagiris.Show;
    frmarsivanagiris.WindowState:=wsmaximized;
    sicilarsivverigirisdm.sicilarsivibdset.active:=true;
    sicilarsivverigirisdm.sicilgelisibdset.active:=true;
    sicilarsivverigirisdm.SahteSicillerIBDSet.Active:=true;
  end
  else
    frmarsivanagiris.BringToFront;
  try
    sicilarsivverigirisdm.sicilArsivibDSet.Active:=true;
    sicilarsivverigirisdm.sicilArsivibDSet.First;
    while not sicilarsivverigirisdm.sicilArsivibDSet.Eof do
    begin
      sicilarsivverigirisdm.sicilArsivibDSet.Edit;
      artiklar:=0;
      decodedate(trunc(sicilarsivverigirisdm.sicilArsivibDSet.fieldbyname('DOGUMTARIHI').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(sicilarsivverigirisdm.sicilArsivibDSet.fieldbyname('DOGUMTARIHI').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;

            sicilarsivverigirisdm.sicilArsivibDSet.FieldByName('YASGUN').AsInteger:=gun;
            sicilarsivverigirisdm.sicilArsivibDSet.FieldByName('YASAY').AsInteger:=ay;
            sicilarsivverigirisdm.sicilArsivibDSet.FieldByName('YASYIL').AsInteger:=yil;
      sicilarsivverigirisdm.sicilArsivibDSet.Post;
      sicilarsivverigirisdm.sicilArsivibDSet.Next;
    end;
    finally
      showmessage('Kayıtların Yaş Hesaplamaları Güncellendi.');
    end;
yukarıdaki kod ile ana menüden veri giriş sayfasına giriş butonuna basıldığında güncel tarih ile veritabanında bulunan doğum tarihini alarak kişinin yaşyıl, yaşay ve yaşgünün hesaplatıp tekrar güncelleyerek vt yi editliyorum.

hali hazırda 150 000 kayıt girilecek ve bu kayıt sayısı gün geçtikçe artacak. sanırım bu yapı biraz kasacak. yaş aralığında kayıt sorgulama için bu güncel yaş bilgileri de lazım olacağından en iyi, stabil ve hızlı yapı nasıl oluşturmalıyım?.

bu kodları yine bu forumdan paylaşımcı ustalarımdan elde ettim ve şu an için deneme kayıtlarında sorunsuz çalışıyor.

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
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Yaş güncelleme

Mesaj gönderen mrmarman »

Merhaba..

SQL içinden bu işi halledersen çok hızlı bir şekilde sonuç alacaksın. Şöyle ki, DateDiff() fonksiyonu vardır. İki tarih arasındaki farkı verir.

Aşağıdaki sorguda şunu yaptık. Örneğin 08.02.1973 doğumlu birisinin bugünkü yaşını bulucaz. Öncelikli olarak "YYYY" diyerek sadece yılların farkını aldık. 2009 - 1973 ve çıkan sonucu cebimize koyduk. :idea:

Sonra da "mmdd" diyerek AY ve GÜN olarak bu tarihleri karşılaştırıp eğer doğum tarihi güncel tarihten büyükse 1 değilse 0 sayısını çıkartıyoruz. Çünkü hak vereceksiniz ki güncel sorgu için bugünün tarihi itibariyle yaştan gün almış mı almamış mıyı kontrol etmek lazım gerek. :wink:

Kod: Tümünü seç

DateDiff("yyyy",[DogumTarihi],Date())-IIf(Format([DogumTarihi],"mmdd")>Format(Date(),"mmdd"),1,0) AS SimdikiYasi
syntax olarak denedim çalışıyor ancak hesabım yanlışsa düzeltin çünkü yaş hesaplarında ekseriyetle şu gün aldı veya almadı olayında nasıl davranacağımı karıştırıyorum. :lol:
Resim
Resim ....Resim
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Re: Yaş güncelleme

Mesaj gönderen bobasturk »

merhaba,

muharrem ustam herzamanki gibi kısa, öz ve mantığı ile birlikte anlatmışsın. Yaş işlemi, girilen verilerde "şu yaş aralığında şu isimli şu suçtan kişileri dök" gibi sorgu istenmekte. hali hazırda böyle olunca da sistemde yaşları güncelleme gerekti.

Vermiş olduğun değerli bilgiler doğrultusunda uğraşacağım. anlamışsınızdır ki hala acemiyim ve verdiğiniz fonksiyon tamamiyle bana yabancı.

kolay gelsin. saygı ve sevgi ile hayırlı bayramlar
Ş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

Re: Yaş güncelleme

Mesaj gönderen bobasturk »

merhaba,

ibexpert sql ekranında tırmaladım durdum ama beceremedim. çıkan sorunlar bi geldi yyyy lere taktı, bi geldi tırnaklara taktı olmadı, evir çevir kıt akılla yine olmadı. tırmalamaya devam edicez tabi ama şimdilik böyle kalacak gibi.

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

Re: Yaş güncelleme

Mesaj gönderen bobasturk »

merhaba,

başınızı ağrıttım sanırım şu güzel bayram günü ama biraz ilerleme kaydettim sanırım.

Kod: Tümünü seç

select DateDiff(year,DOGUMTARIHI, :Date) from SICILARSIV
şeklinde yol katettim ve yaşı verdi. ay ve gün den vaz geçeceğim sanırım. sıra geldi vt nin güncellenmesine. 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
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Yaş güncelleme

Mesaj gönderen aslangeri »

s.a.
eğer yaşı calculated alan olarak hesaplarsan bu tarz işlemlerden kurtulursun.
eğer veritabanına calculated alan eklemek istemezsen oluşturacağın bir viewda yaş alanınıda ekleyerek kullanabilirsin.
böylelikle her seferinde datadiff kullanmak yerine view e select çekersin.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Yaş güncelleme

Mesaj gönderen mrmarman »

Merhaba...

Zaten verdiğim örnek bir calculated alan örneği değil mi? Ciddi ciddi soruyorum, yanlış anlamayın :oops: . Hep table bünyesinde bulunmayan ancak bu gibi tanımların "AS" ifadesi ile sanki mevcut bir alanmış gibi eklediğimiz bu yapıyı Calculated alan olarak değerlendiriyordum.

Kod: Tümünü seç

SELECT DateDiff("yyyy",[DogumTarihi],Date())-IIf(Format([DogumTarihi],"mmdd")>Format(Date(),"mmdd"),1,0) AS SimdikiYasi
bunu dışardan table'a müdahale ederek veya içerden SQL satırında yapmak arasında pek fark yok çünkü. Tekrar ediyorum, merakımdan soruyorum terminolojik olarak aynı şey olması lazım, yanlış anlaşılmasın. Bunu view'e verirken de zaten aynı şekilde uygulanıyor. Karışıklık olmaması için farklı uygulamayı örneklemekte fayda var. Zaten View'e düştükten sonra SELECT içinde ürün alanın kullanımı aşikar görünüyor.
Resim
Resim ....Resim
Kullanıcı avatarı
bobasturk
Kıdemli Üye
Mesajlar: 1387
Kayıt: 20 May 2004 08:39
Konum: Düzce

Re: Yaş güncelleme

Mesaj gönderen bobasturk »

merhaba,

sorunun çözülüp çözülmemesini geçtim. ustalardan yeni ve güzel şeyler öğrenme mutluluğu var. tavsiyeleriniz doğrultusunda calc alan kullanacağım. hali hazırda muharrem ustanın verdiği kodlar ile yaşları hesaplatıp çekiyorum ve cxgrid in gelişmiş filtresinde yaş aralığını da listeleyebiliyorum.

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
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Yaş güncelleme

Mesaj gönderen aslangeri »

s.a.
evet calculated alan oluyor ama o alana göre sorgu yapmak için where kısmında aynı ifadeyi tekrar yazmak gerekiyor.
ancak view olursa arama ve sıralamalardada rahatlıkla kullanılabilir.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Yaş güncelleme

Mesaj gönderen mrmarman »

O zaman şöyle düzeltelim de yanlış fikir uyanmasın.

Bu DateDiff'li ifadeyi farklı sorgular için de kullanacaksanız, bir kereliğine View oluşturun ve AS ile yeni bir alan adıyla atayınız, sonra bu View içeriğinden bu yeni alan adını sorgulayarak diğer uygulama alanlarında kullanınız. :idea:
Resim
Resim ....Resim
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Re: Yaş güncelleme

Mesaj gönderen conari »

bende bu gibi durumlar için view oluşturuyorum Mesela fatura tarihlerini year() ile ayırıp viewde ayrı bir field olarak oluşturuyorum. Kullanıcı yıla göre aya göre gruplamak istiyor v.s.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Cevapla