implementation
uses DateUtils;
{$R *.dfm}
//function EndOfAMonth ( const Year, Month : Word ) : TDateTime;
//function EndOfTheMonth(const AValue: TDateTime): TDateTime;
function EndOfTheMonth(const AValue: TDate): TDate;
begin
end;
function StartOfTheMonth(const AValue: TDateTime): TDateTime;
begin
end;
procedure TForm1.Button1Click(Sender: TObject);
var
ilkgun: TDateTime;
songun: TDateTime;
mydate1 : TDateTime;
mydate2 : TDateTime;
begin
//myDate1 := StartOfTheMonth(2013, 7);
//myDate2 := EndOfAMonth(2013, 7);
ilkgun:=StartOfTheMonth(Now);
songun:= EndOfTheMonth(Date);
ShowMessage(DateToStr(ilkgun)+'-'+DateToStr(songun));
ShowMessage(DateToStr(myDate1));
ShowMessage(DateToStr(myDate2));
end;
aynı ayın ilkgünü ve son gününü bulma ile ilğili bir şeyler buldum
bu ayki kayıtlar için ayın ilk gününü bulursak iki tarih arası sorgulama yaparak buğüne kadarki kayıtsayısını bulabilirim denemelere devam
yanlız yukardaki kodlarda tarih 1899 gibi garip geliyor??
Selam;
ayın ilk günü veya son gününü bulmanıza gerek yok, ayın ilk günü her halukarda ayın 1 i olduğundan, sorgularınızı şöyle yaparsanız sorunsuz çalışır,
mesela 3. ay için ; tarih>='01.03.2013' AND tarih<'01.04.2013' gibi, yani ayın 1inden büyük ve eşit olanları ve diğer ayın 1inden küçük olanları ver diyebilirsiniz.
Fazla detaya girmeye gerek yok yani.
//***********************************************************************
function AyinIlkGunu(Date: TDateTime): TDateTime;
var
Year, Month, Day: Word;
begin
DecodeDate(Date, Year, Month, Day);
Result := EncodeDate(Year, Month, 1);
end;
function AyinSonGunu(Date: TDateTime): TDateTime;
var
Year, Month, Day: Word;
begin
DecodeDate(Date, Year, Month, Day);
if Month = 1 then
else
begin Month := 1; inc(Year) end;
Result := EncodeDate(Year, Month, 1) - 1;
end;
//***********************************************************************
procedure buAykiOturumSayisi;
var
top:integer;
tarih1,tarih2:string;
begin
tarih1:=DateToStr(AyinIlkGunu(Now));
tarih2:=DateToStr(Now);
DMvt.IBQuery1.Close;
DMvt.IBQuery1.sql.Clear;
DMvt.IBQuery1.sql.add('select count(*) from TBL_HESAP');
DMvt.IBQuery1.sql.add('WHERE TARIH between :t1 and :t2');
DMvt.IBQuery1.Params.ParamByName('t1').Value:=tarih1;
DMvt.IBQuery1.Params.ParamByName('t2').Value:=tarih2;
DMvt.IBQuery1.Open;
DMvt.IBTransaction1.CommitRetaining;
top := DMvt.IBQuery1.Fields[0].AsInteger;
ShowMessage(IntToStr(top));
end;
kodu yukardaki şekilde toparladım tek bir sorun kaldı 12 tane kayıt var 2 adeti 6'ıncı aya ait 10 tanesi 7'inci aya sonucun 10 olarak dönmesi gerekirken
12 olarak dönüyor..
//***********************************************************************
function AyinIlkGunu(Date: TDateTime): TDateTime;
var
Year, Month, Day: Word;
begin
DecodeDate(Date, Year, Month, Day);
Result := EncodeDate(Year, Month, 1);
end;
function AyinSonGunu(Date: TDateTime): TDateTime;
var
Year, Month, Day: Word;
begin
DecodeDate(Date, Year, Month, Day);
if Month = 1 then
else
begin Month := 1; inc(Year) end;
Result := EncodeDate(Year, Month, 1) - 1;
end;
//***********************************************************************
procedure buAykiOturumSayisi;
var
top:integer;
tarih1,tarih2:string;
begin
tarih1:=DateToStr(AyinIlkGunu(Now));
tarih2:=DateToStr(Now);
DMvt.IBQuery1.Close;
DMvt.IBQuery1.sql.Clear;
DMvt.IBQuery1.sql.add('select count(*) from TBL_HESAP');
DMvt.IBQuery1.sql.add('WHERE TARIH between '+quotedstr(tarih1)+' and '+quotedstr(tarih2));
DMvt.IBQuery1.Open;
top := DMvt.IBQuery1.Fields[0].AsInteger;
ShowMessage(IntToStr(top));
end;
şeklinde deneyiniz. parametreleri sizin yazdığınız şekilde kullanamazsınız. Ayrıca sorgu ile veri çekerken commit yapmanıza gerek yoktur, sadece veri kaydı yada değişikliği yaptığınızda commit edin.
tarih1:=DateToStr(AyinIlkGunu(Now));
tarih2:=DateToStr(Now);
DMvt.IBQuery1.Close;
DMvt.IBQuery1.sql.Clear;
DMvt.IBQuery1.sql.add('select count(*) from TBL_HESAP');
DMvt.IBQuery1.sql.add('WHERE TARIH between '+quotedstr(tarih1)+' and '+quotedstr(tarih2));
DMvt.IBQuery1.Open;
top := DMvt.IBQuery1.Fields[0].AsInteger;
ShowMessage(IntToStr(top));
hocam dediğiniz şekilde denedim tekrar 12 döndü..
şu satır //// DMvt.IBQuery1.Fields[0].AsInteger;//// ile ilğili bir sorun olma ihtimali var mı acaba..
tarih1:=DateToStr(AyinIlkGunu(Now));
tarih2:=DateToStr(Now);
DMvt.IBQuery1.Close;
DMvt.IBQuery1.sql.Clear;
DMvt.IBQuery1.sql.add('select count(*) from TBL_HESAP');
DMvt.IBQuery1.sql.add('WHERE TARIH>='+quotedstr(tarih1)+' and TARIH<='+quotedstr(tarih2));
DMvt.IBQuery1.Open;
top := DMvt.IBQuery1.Fields[0].AsInteger;
ShowMessage(IntToStr(top));
şeklinde deneyin birde, between kullanmayın. Fakat şuna da dikkat edin, TARIH alanı tabloda mutlaka "DATE" olarak ve sorgunuzdaki tarih formatı ile aynı olmalı. Yani gün.ay.yıl veya yıl.ay.gun neyse her ikiside aynı olmalı.
DMvt.IBQuery1.Fields[0].AsInteger; satırında sorun olamaz, zira zaten bir alan dönüyor geriye.
procedure buAykiOturumSayisi;
var
top:integer;
tarih1,tarih2:string;
begin
tarih1:=DateToStr(AyinIlkGunu(Date));
tarih2:=DateToStr(Date);
DMvt.IBQuery1.Close;
DMvt.IBQuery1.sql.Clear;
DMvt.IBQuery1.sql.add('select count(*) from TBL_HESAP');
DMvt.IBQuery1.sql.add('WHERE TARIH>='+quotedstr(tarih1)+' and TARIH<='+quotedstr(tarih2));
DMvt.IBQuery1.Open;
top := DMvt.IBQuery1.Fields[0].AsInteger;
ShowMessage(IntToStr(top));
end;
tüm uyarılarınızı dikkate aldım hocam
ama gene 12 dönüyor