Access veritabanında iki tarih arasında listeleme yapmak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
memoli79
Üye
Mesajlar: 29
Kayıt: 05 Nis 2007 01:29

Access veritabanında iki tarih arasında listeleme yapmak

Mesaj gönderen memoli79 »

benim sorum şöyle.
Access veritabanım var.
burda 1 tane kayit_tarihi isimli alanım var.
ben form üzerinde 1 adet buton 2 adet edit ve 2 adet datetimepicker koydum.
butona basınca datetimepickerlarda belirttiğim tarihleri editlara yazmak ve belirtilen tarihler arasında listeleme yapmak istiyorum.
delphide daha acemi olduğum için yapamadım.

yardımlarınızı bekliyorum.
herkese kolay gelsin
Kullanıcı avatarı
kadirkurtoglu
Üye
Mesajlar: 748
Kayıt: 22 May 2005 01:20
Konum: Uzakta Görünen Tepeden...

Mesaj gönderen kadirkurtoglu »

Kod: Tümünü seç

adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('select * from TABLO');
adoquery1.sql.add('where kayit_tarihi >=:tarih1 and kayit_tarihi <=:tarih2');
adoquery1.params[0].asdate := datetimepicker1.date;
adoquery1.params[1].asdate := datetimepicker2.date;
adoquery1.open;
Bir mum, yanındaki mumları tutuşturmakla,
ışığında hiç bir şey kaybetmez.

Mevlana

OS win.10, IDE Delphi 10.3, RDBMS Firebird and MSSQL, BROWSER Chrome
memoli79
Üye
Mesajlar: 29
Kayıt: 05 Nis 2007 01:29

Mesaj gönderen memoli79 »

adoquery1.params[0].asdate := datetimepicker1.date;
adoquery1.params[1].asdate := datetimepicker2.date;

programı çalıştınca params kısmında hata veriyor.tanımlanmamış diyor.

params ları nerde tanıtacağım
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

ADO'da params değil

Parameters.Params[n].Value
veya
Parameters.ParamByName('parametre').Value

şeklinde bir yapı vardır...
Resim
Resim ....Resim
Kullanıcı avatarı
baypipox
Üye
Mesajlar: 122
Kayıt: 16 Eki 2006 04:23
İletişim:

Mesaj gönderen baypipox »

kadirkurtoglu yazdı:

Kod: Tümünü seç

adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('select * from TABLO');
adoquery1.sql.add('where kayit_tarihi >=:tarih1 and kayit_tarihi <=:tarih2');
adoquery1.params[0].asdate := datetimepicker1.date;
adoquery1.params[1].asdate := datetimepicker2.date;
adoquery1.open;
bu kodu ben anlayamadım (herhalde stored procedure deki input parametresi senin prosedure'ün yok veya içinde o input parametren yok) ama sen şu şekilde yapsan da olur. (Eğer procedure kullanmıyorsan.)
ben alttaki gibi yapıyorum...

adoquery1.sql.clear;
adoquery1.sql.add('select * from TABLO');
adoquery1.sql.add('where kayit_tarihi >='+39#+datetimepicker1.date +39#+'and kayit_tarihi <='+39#+datetimepicker2.date+39#);
adoquery1.open;

bu şekilde bir dene istersen
En son baypipox tarafından 09 Nis 2007 11:36 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@baypipox

- Bu şekilde olmaz.

1.- DateTimePicker'in DATE tipinde çıktısı vardır. Sen String tipindeymiş gibi işleme almışsın. Kendin bu şekilde kullandığına emin misin ?

2.- ( tek tırnak işareti ) koymaya çalışıyorsun 39# şeklinde değil #39 yani # karakteri kod öncesinde olmalı.

3.- Veritabanı tarih alanı DATE tipinde ise, bu işlemi direkt yapamazsın, SQL sorgu içerisinde de karşılaştırması yapılan BETWEEN'den sonraki tarihleri, iki tane # karakteri arasına alman gerekir.

4.- Yerine göre de AY ile GUN'ü de yer değiştiremen gerekebilmektedir

5.- Ayraç olarak / karakteri kullanmak gerekebilmektedir.

- Sonuç : Bunu bu şekilde denemek daha büyük sorunlarla boğuşmak demektir. Parametre kullanımı bu olumsuzların önüne geçecektir.
Resim
Resim ....Resim
Kullanıcı avatarı
baypipox
Üye
Mesajlar: 122
Kayıt: 16 Eki 2006 04:23
İletişim:

Mesaj gönderen baypipox »

muharrem abi haklısın ben onu başka işler için kullanıyormuşum.
Bu arada böyle bir yanlış yaptığım için çok utandım (39#) düzeltmelerin için saol abi.
Bu işler içinde fireberdde stored procedure'deki parametreme alttaki gibi bir gönderim yapmışım.... Pardon..
(ama sanki ben onu o şekilde başka bir yerde kullanmışım gibi hatırlıyom veya biraz değişiğini)

Kod: Tümünü seç

datam.SP_Ariza_Raporu.close;
datam.SP_Ariza_Raporu.ParamByName('ip_tarih1').asdatetime:=DateTimePicker1.Date;
datam.SP_Ariza_Raporu.ParamByName('ip_tarih2').asdatetime:=DateTimePicker2.Date;
datam.SP_Ariza_Raporu.Open;
memoli79
Üye
Mesajlar: 29
Kayıt: 05 Nis 2007 01:29

Mesaj gönderen memoli79 »

bir türlü yapamadım ya.iki tarih arası listeleme bu kadar zormudur ya.Değdim gibi delphide daha yeniyim.

2 tane datetimepicker olacak.butona basınca kayıt_tarihi alanıdaki kayıtları getirecek.

aşağıdaki sorguda 39#kısmında ")" expected but identifer 'date' found mesajı veriyor.


adoquery1.sql.clear;
adoquery1.sql.add('select * from TABLO');
adoquery1.sql.add('where kayit_tarihi >='+39#+datetimepicker1.date +39#+'and kayit_tarihi <='+39#+datetimepicker2.date+39#);
adoquery1.open;



aşağıdaki kodda

adoquery1.close;
adoquery1.sql.clear;
adoquery1.sql.add('select * from TABLO');
adoquery1.sql.add('where kayit_tarihi >=:tarih1 and kayit_tarihi <=:tarih2');
adoquery1.params[0].asdate := datetimepicker1.date;
adoquery1.params[1].asdate := datetimepicker2.date;
adoquery1.open;

params kısmında hata veriyor.
adoquery kısmını query kullanarak yaptım.
query nin params kısmına field ekledim.
0
1

diye fakat yine olmadı.
arkdaşlar biliyorum çok uğraştıryorum sizi ama insan yapamayınca şevki kırılıyor.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Kod: Tümünü seç

  AdoQuery1.Close;
  AdoQuery1.SQL.clear;
  AdoQuery1.SQL.add('select * from TABLO');
  AdoQuery1.SQL.add('where kayit_tarihi BETWEEN :tarih1 and :tarih2');
  AdoQuery1.Parameters.Parambyname('tarih1').DataType := ftDate;
  AdoQuery1.Parameters.Parambyname('tarih1').Value    := datetimepicker1.date;
  AdoQuery1.Parameters.Parambyname('tarih2').DataType := ftDate;
  AdoQuery1.Parameters.Parambyname('tarih2').Value    := datetimepicker2.date;
  AdoQuery1.Open;
Resim
Resim ....Resim
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

valla bende access deki bu tarih kıstasını o zaman lar çözememiştim şöle bir uzunca yol ile halletmiştim ozamanlar. :) :lol: :oops:

Kod: Tümünü seç

procedure TfrmRapor.BtnRaporgorClick(Sender: TObject);
var 
tarih1, tarih2 :String;
ay1,ay2,gun1,gun2,yil1,yil2:integer;
begin
Frmrapquery.Active:=False;
SayQuery.Active:=False;
ay1:=MonthOf(DateTimePicker1.Date);
gun1:=DayOf(DateTimePicker1.Date);
yil1:=YearOf(DateTimePicker1.Date);
ay2:=MonthOf(DateTimePicker2.Date);
gun2:=DayOf(DateTimePicker2.Date);
yil2:=YearOf(DateTimePicker2.Date);
tarih1:='#'+IntToStr(ay1)+'/'+IntToStr(gun1)+'/'+IntToStr(yil1)+'#';
tarih2:='#'+IntToStr(ay2)+'/'+IntToStr(gun2)+'/'+IntToStr(yil2)+'#';
Frmrapquery.SQL.Clear;
SayQuery.SQL.Clear; 
Frmrapquery.SQL.text:='SELECT  TBLISTEK_ANA.ISTEK_SECIM, count (TBLISTEK_ANA.TARIH) FROM TBLISTEK_ANA'+ 
' WHERE TBLISTEK_ANA.TARIH between '+tarih1+' And '+tarih2+''+ 
' group by TBLISTEK_ANA.ISTEK_SECIM ;'; 
SayQuery.SQL.text:='SELECT  count (TBLISTEK_ANA.TARIH)  FROM TBLISTEK_ANA '+ 
' WHERE TBLISTEK_ANA.TARIH between '+tarih1+' And '+tarih2+';'; 
SayQuery.Active:=True; 
Frmrapquery.Active:=True; 
end;
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
memoli79
Üye
Mesajlar: 29
Kayıt: 05 Nis 2007 01:29

Mesaj gönderen memoli79 »

arkadaşlar benim databesim acceess database.
Bunun için sanırım iki tarih arası listeleme de access tarih için # koynak gerekiyor.
ama bir türlü yapamadım.

AdoQuery1.Close;
AdoQuery1.SQL.clear;
AdoQuery1.SQL.add('select * from TABLO');
AdoQuery1.SQL.add('where kayit_tarihi BETWEEN :tarih1 and :tarih2');
AdoQuery1.Parameters.Parambyname('tarih1').DataType := ftDate;
AdoQuery1.Parameters.Parambyname('tarih1').Value := datetimepicker1.date;
AdoQuery1.Parameters.Parambyname('tarih2').DataType := ftDate;
AdoQuery1.Parameters.Parambyname('tarih2').Value := datetimepicker2.date;
AdoQuery1.Open;

yukarıdaki kodu denedim kıpırdama yok.

aşağıdaki kodu yazıyorum
Monthof da hata veriyor
procedure TfrmRapor.BtnRaporgorClick(Sender: TObject);
var
tarih1, tarih2 :String;
ay1,ay2,gun1,gun2,yil1,yil2:integer;
begin
Frmrapquery.Active:=False;
SayQuery.Active:=False;
ay1:=MonthOf(DateTimePicker1.Date);
gun1:=DayOf(DateTimePicker1.Date);
yil1:=YearOf(DateTimePicker1.Date);
ay2:=MonthOf(DateTimePicker2.Date);
gun2:=DayOf(DateTimePicker2.Date);
yil2:=YearOf(DateTimePicker2.Date);
tarih1:='#'+IntToStr(ay1)+'/'+IntToStr(gun1)+'/'+IntToStr(yil1)+'#';
tarih2:='#'+IntToStr(ay2)+'/'+IntToStr(gun2)+'/'+IntToStr(yil2)+'#';
Frmrapquery.SQL.Clear;
SayQuery.SQL.Clear;
Frmrapquery.SQL.text:='SELECT TBLISTEK_ANA.ISTEK_SECIM, count (TBLISTEK_ANA.TARIH) FROM TBLISTEK_ANA'+
' WHERE TBLISTEK_ANA.TARIH between '+tarih1+' And '+tarih2+''+
' group by TBLISTEK_ANA.ISTEK_SECIM ;';
SayQuery.SQL.text:='SELECT count (TBLISTEK_ANA.TARIH) FROM TBLISTEK_ANA '+
' WHERE TBLISTEK_ANA.TARIH between '+tarih1+' And '+tarih2+';';
SayQuery.Active:=True;
Frmrapquery.Active:=True;
end;

yapamıyorum ya ne zormuş ya bu iş.
Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 03:10
Konum: İstanbul & Gebze Karışık

Mesaj gönderen conari »

Benim kod için uses a

Kod: Tümünü seç

DateUtils
eklemen lazım.
:lol: :wink:
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

@memoli79

- Göndermiş olduğum kodun çalışmaması gibi bir durum olmaz. Yaklaşımın ışığında daha basit bir kaç test noktası belirledim. Bunları deneyeceksin. Her test için müsatkil bir Tbutton koy ve o butona bastığında test işlemi olsun. BU üçlü test yaptığın hatayı ortaya çıkartacak.

1. TABLO isimli tablonda kayit_tarihi alanının içeriğini görmek için test amaçlı aşağıdaki kodu dene.

Kod: Tümünü seç

  AdoQuery1.Close; 
  AdoQuery1.SQL.clear; 
  AdoQuery1.SQL.add('select * from TABLO ORDER BY kayit_tarihi'); 
  AdoQuery1.Open; 


- Burada kayit_tarihi alanının dolu olup olmadığını kontrol et ve örnek iki tane tarihi (tarih aralığı testi için) bir kağıda not et.

2. Tarih aralığı kontrolü yaptığın DateTimePicker1 ve DateTimePicker2 yerine bu not aldığın tarihleri yazacaksın.

- Not aldığın tarihler 01.01.2007 ve 03.03.2007 olsaydı şöyle olacaktı. (Bu sadece örnek sen kendi örneğini kullanacaksın).

Kod: Tümünü seç

  AdoQuery1.Close; 
  AdoQuery1.SQL.clear; 
  AdoQuery1.SQL.add('select * from TABLO'); 
  AdoQuery1.SQL.add('where kayit_tarihi BETWEEN :tarih1 and :tarih2'); 
  AdoQuery1.Parameters.Parambyname('tarih1').DataType := ftDate; 
  AdoQuery1.Parameters.Parambyname('tarih1').Value    := StrToDate( '01.01.2007' ); 
  AdoQuery1.Parameters.Parambyname('tarih2').DataType := ftDate; 
  AdoQuery1.Parameters.Parambyname('tarih2').Value    := StrToDate( '03.03.2007' ); 
  AdoQuery1.Open;
- Burada o iki tarih aralığını liste halinde göreceksin.

3. Daha önce verdiğim kodu kullanmaya hazırsın.

Kod: Tümünü seç

  
  ShowMessageFmt('Sorgusu Yapılan Tarih Aralığı %s - %s', [ DateToStr(datetimepicker1.date), DateToStr(datetimepicker1.date)]);
AdoQuery1.Close; 
  AdoQuery1.SQL.clear; 
  AdoQuery1.SQL.add('select * from TABLO'); 
  AdoQuery1.SQL.add('where kayit_tarihi BETWEEN :tarih1 and :tarih2'); 
  AdoQuery1.Parameters.Parambyname('tarih1').DataType := ftDate; 
  AdoQuery1.Parameters.Parambyname('tarih1').Value    := datetimepicker1.date; 
  AdoQuery1.Parameters.Parambyname('tarih2').DataType := ftDate; 
  AdoQuery1.Parameters.Parambyname('tarih2').Value    := datetimepicker2.date; 
  AdoQuery1.Open;
  ShowMessageFmt(Listelenen Tarih Aralığı %s - %s', [ DateToStr(datetimepicker1.date), DateToStr(datetimepicker1.date)]);
- DateTimePicker1 nesnesinde bir kenara not aldığın ve 2. aşamada listesini alabildiğin başlangıç tarihini, DateTimePicker2 nesnesine de yine not aldığın ikinci tarihi seçip sorgulamayı gerçekleştir.

- Bu adımda liste alamazsan sorunlar

a. Formunda daha fazla DateTimePicker var ve sen seçim yaptıkların olan değil başka iki tanesini kullanıyorsun. Örneğin DateTimePicker5 ve DateTimePicker6'da seçim yapıyorsun ama DateTimePicker1 ve DateTimePicker2'yi sorguluyorsun.

b. DateTimePicker1 ve DateTimePicker2 değerlerin sorgudan hemen önce yazdığın hatalı başka bir koddan ötürü seçilenden başka değerler alıyor.
Resim
Resim ....Resim
memoli79
Üye
Mesajlar: 29
Kayıt: 05 Nis 2007 01:29

Mesaj gönderen memoli79 »

arkadaşlar sonunda oldu.İki tarih arsı listeleniyor.
database access olduğu için separator kullandım.

formda 2 tane datetimepicker ve bir adet buton ile yapılan kod aşağıdaki gibidir.


DateSeparator := '/';
ShortDateFormat := 'dd/mm/yyyy';
ADOQuery1.Active := False;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.add('SELECT * FROM arsivtbl');
ADOQuery1.sql.add('WHERE Kayit_tarihi BETWEEN #' + FormatDateTime('mm/dd/yyyy', dtp1.Date) + '#');
ADOQuery1.SQL.Add(' and #' + FormatDateTime('mm/dd/yyyy', dtp2.Date) + '#');
ADOQuery1.Active := True;
Kullanıcı avatarı
Murat DİCLE
Kıdemli Üye
Mesajlar: 702
Kayıt: 19 Nis 2006 04:12
Konum: İstanbul
İletişim:

Mesaj gönderen Murat DİCLE »

Faydalı olması dileğimle..

Kod: Tümünü seç

Uses DateUtils, ..., ..., ....

var 
   C: TADOQuery;
begin
.
.
.
   // Bu ayki veriler...
   C.SQL.Text    := 'SELECT * FROM T1 WHERE DATEDIFF("m", Tar, :A) = 0';
   C.Parameters.ParamByName('A').Value := Now;
   C.Open;
.
.
.
   // Geçen ayki veriler...
   C.SQL.Text    := 'SELECT * FROM T1 WHERE DATEDIFF("m", Tar, :A) = 1';
   C.Parameters.ParamByName('A').Value := Now;
   C.Open;
.
.
.
   // Bir gün öncesinin verileri...
   C.SQL.Text    := 'SELECT * FROM T1 WHERE DATEDIFF("d", Tar, :A) = 1';
   C.Parameters.ParamByName('A').Value := Now;
   C.Open;
.
.
.
   // Bu günün verileri...
   C.SQL.Text    := 'SELECT * FROM T1 WHERE DATEDIFF("d", Tar, :A) = 0';
   C.Parameters.ParamByName('A').Value := Now;
   C.Open;
.
.
.
   // Alternatif: Bu aykiler
   C..SQL.Text    := 'SELECT * FROM T1 WHERE TAR >= :A AND TAR <= :B ';
   C.Parameters.ParamByName('A').Value := StartOfTheMonth(Now);
   C.Parameters.ParamByName('B').Value := EndOfTheMonth(Now);
   C.Open;
.
.
.
   // Alternatif: Geçen aykiler
   C..SQL.Text    := 'SELECT * FROM T1 WHERE TAR >= :A AND TAR <= :B ';
   C.Parameters.ParamByName('A').Value := StartOfTheMonth(IncMonth(Now, -1));
   C.Parameters.ParamByName('B').Value := EndOfTheMonth(IncMonth(Now, -1));
   C.Open;
.
.
.
   // İki tarih Arası
   // DTP1 ve DTP2; DateTimePicker'dır...
   C..SQL.Text    := 'SELECT * FROM T1 WHERE TAR >= :A AND TAR <= :B ';
   C.Parameters.ParamByName('A').Value := DTP1.Date;
   C.Parameters.ParamByName('B').Value := DTP2.Date;
   C.Open;
.
.
.
end;
Saygılar..
Cevapla