UDF

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
zalimsevki
Üye
Mesajlar: 38
Kayıt: 02 Ara 2005 07:36
Konum: Denizli

UDF

Mesaj gönderen zalimsevki »

function yas_hesap(var x:TDate):Word;
Var
yil, ay, gun: word;
begin
DecodeDate(x,yil, ay, gun);
Result:=yil;
end;

yukarıdaki fonksiyonu içeren bir UDF hazırladım .. Fonksiyona veri tabanındaki Doğum Tarihini gönderdiğimde 1899 alıyorum .. Parametre geçirirkenmi hata yapıyorum ..
Akin_Delphi
Üye
Mesajlar: 163
Kayıt: 06 Nis 2006 12:22

Re: UDF

Mesaj gönderen Akin_Delphi »

zalimsevki yazdı:function yas_hesap(var x:TDate):Word;
Var
yil, ay, gun: word;
begin
DecodeDate(x,yil, ay, gun);
Result:=yil;
end;

yukarıdaki fonksiyonu içeren bir UDF hazırladım .. Fonksiyona veri tabanındaki Doğum Tarihini gönderdiğimde 1899 alıyorum .. Parametre geçirirkenmi hata yapıyorum ..
Sayın Arkadaşım,

Bildiğim kadarıyla bilgisayarlardaki saat/takvim 1900'den başlıyor. Dolayısıyla hesaplamayı ona göre yapmalısınız. Delphi'de TDate tipini incelerseniz bu konuda bilgi elde edebilirsiniz.

Saygılar ve Başarılar
Kullanıcı avatarı
White Rose
Üye
Mesajlar: 726
Kayıt: 06 Tem 2005 09:41
Konum: Güneyden
İletişim:

Mesaj gönderen White Rose »

Bildiğim kadarıyla 1899 değeri
boş tarih alanlarındaki yılbilgisidir.
Boş tarih bilgileri 31/12/1899 olarak gözüküyor
zalimsevki
Üye
Mesajlar: 38
Kayıt: 02 Ara 2005 07:36
Konum: Denizli

Mesaj gönderen zalimsevki »

1899 boş tarih değeri bu doğru ..
Oysa veri tabanından girilmiş bir doğum tarihini gönderiyorum
ben ve hazırladığım fonksiyon gelen değeri NULL olarak algıyor
fonksiyonun parametresi ilgili bi hatamı yapıyorum ..
Bu konuda yardımcı olursanız sevinirirm ..
shadowmann
Üye
Mesajlar: 508
Kayıt: 30 Oca 2004 10:49

Mesaj gönderen shadowmann »

Bilgisayarınız tarih formatı gün.ay.yıl mı yoksa gün/ay/yıl şeklinde mi? Sorunun kaynağı bu olabilir.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
vatandaşın doğum tarihi ve yaşının hangi tarihte hesaplanmasını istiyorsan
o tarihleri parametre olarak veriyorsun.

Kod: Tümünü seç

function SPYASBUL(var ib_date,ib_date2: TISC_TIMESTAMP): Smallint;
var
  tm_date,sado: TM;
dt,dt2:tdate;
yas:Smallint;
begin
  isc_decode_timestamp(@ib_date, @tm_date); //vatandaş
  isc_decode_timestamp(@ib_date2, @sado);   //now
  tm_date.tm_year := tm_date.tm_year+1900;
  sado.tm_year :=sado.tm_year+1900;
  tm_date.tm_mon := tm_date.tm_mon+1;
  sado.tm_mon := sado.tm_mon+1;
  dt:= encodedate(tm_date.tm_year,tm_date.tm_mon,tm_date.tm_mday);
  dt2 :=encodedate(sado.tm_year,sado.tm_mon,sado.tm_mday);

  if dt>dt2 then begin result:=-1; exit; end;
  yas:=sado.tm_year-tm_date.tm_year;
  if sado.tm_mon<tm_date.tm_mon then yas:=yas-1;
  if sado.tm_mon=tm_date.tm_mon then
  Begin
    if sado.tm_mday<tm_date.tm_mday then yas:=yas-1;
  end;
  result:=yas;
end;
uses kısmında aşağıdaki unitler var belki lazım olur

Kod: Tümünü seç

uses
dialogs,  IBExternals, IBHeader, IBIntf,windows,sysutils,dateutils,controls;
buda ddl.

Kod: Tümünü seç

DECLARE EXTERNAL FUNCTION SPYASBUL
    DATE,
    DATE
RETURNS SMALLINT BY VALUE
ENTRY_POINT 'SPYASBUL' MODULE_NAME 'UDFNAME'
bu udf için @SadettinPolat arkadaşımıza teşekkür ediyoruz.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
zalimsevki
Üye
Mesajlar: 38
Kayıt: 02 Ara 2005 07:36
Konum: Denizli

Mesaj gönderen zalimsevki »

function yasal (VAR bg_gun, bg_ay, bg_yil, dt_gun, dt_ay,dt_yil:Integer):smallint;
Var
yas: integer;
begin

yas:=bg_yil-dt_yil;
if dt_ay< bg_ay
then yas:=yas- 01;
if ((dt_ay=bg_ay) and (dt_gun<bg_gun))
then yas:=yas- 01;
result:=yas;

end;

Verilen fonksiyon hata verdi ..
Fonksiyona altı parametre göndererek sorun çözüldü ..
Fonksiyona tarih parametresi geçirip fonksiyonda ayrıştırmak
daha mantıklı ama olmadı ..
yardımcı olan herkesten allah razı olsun ..
zalimsevki
Üye
Mesajlar: 38
Kayıt: 02 Ara 2005 07:36
Konum: Denizli

Mesaj gönderen zalimsevki »

Kod: Tümünü seç

unit UnitHek;

interface
uses  IBExternals, IBHeader,sysutils,dateutils,controls;
type
 TM = record
    tm_sec : integer;   // Seconds
    tm_min : integer;   // Minutes
    tm_hour : integer;  // Hour (0--23)
    tm_mday : integer;  // Day of month (1--31)
    tm_mon : integer;   // Month (0--11)
    tm_year : integer;  // Year (calendar year minus 1900)
    tm_wday : integer;  // Weekday (0--6) Sunday = 0)
    tm_yday : integer;  // Day of year (0--365)
    tm_isdst : integer; // 0 if daylight savings time is not in effect
     end;

  PTM             = ^TM;

  ISC_TIMESTAMP = record
    timestamp_date : Long;
    timestamp_time : ULong;

end;
  PISC_TIMESTAMP = ^ISC_TIMESTAMP;
function SPYASBUL(var ib_Bugun,ib_DogTar: TISC_TIMESTAMP): Smallint;cdecl;export;

implementation
procedure isc_decode_timestamp  (ib_date: PISC_TIMESTAMP; tm_date: PTM); stdcall; external IBASE_DLL;


function SPYASBUL(var ib_Bugun,ib_DogTar: TISC_TIMESTAMP): Smallint;
var
  Bugun, DogTar: TM;
  dt_Bugun, dt_DogTar:tdate;
yas:Smallint;
begin
  isc_decode_timestamp(@ib_Bugun, @Bugun);   //Bugun
  isc_decode_timestamp(@ib_DogTar, @DogTar); //DogumTarihi
  DogTar.tm_year := DogTar.tm_year+1900;
  Bugun.tm_year :=Bugun.tm_year+1900;
  DogTar.tm_mon := DogTar.tm_mon+1;
  Bugun.tm_mon := Bugun.tm_mon+1;
  dt_Bugun :=encodedate(Bugun.tm_year,Bugun.tm_mon,Bugun.tm_mday);
  dt_DogTar:= encodedate(DogTar.tm_year,DogTar.tm_mon,DogTar.tm_mday);
  yas:=yearsbetween(dt_Bugun, dt_DogTar);
  result:=yas;
end;


end.
isc_decode_timestamp gibi fonksiyonlarn benim gibi nerden geldiğini ilk anda kavrayamayan arkadaşlarımız için .. Çalışan üniti bütün olarak gönderiyorum .. Umarım yararlı olur ..

Not: kodların okunaklı olması için [ code ] [ /code ] etiketleri / tag ları içinde yazalım :!: rsimsek
Cevapla