ADO Bağlantıda Tarih Alanına Göre Kayıt Bulma Problemi

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
mmg
Üye
Mesajlar: 51
Kayıt: 19 Haz 2014 11:47

ADO Bağlantıda Tarih Alanına Göre Kayıt Bulma Problemi

Mesaj gönderen mmg » 16 Mar 2020 12:04

Merhabalar,

SQL Express ve database bağlantısı içinde ODBC kullanıyordum. Fakat ODBC ile ilgili yaşadığım bazı problemlerden dolayı doğrudan ADO ile SQL bağlantısı yapmak istedim. Bağlantı ile ilgili bir problem yok, kayıtlar geliyor, eklenebiliyor ve silinebiliyor. Fakat SQL Query'de tarih alanına göre arama yapamıyorum. Örneğin 16.03.2020 tarihinde girilmiş kayıtları listelemek istediğimde sorguya başlangıç ve bitiş tarihi olarak 16.03.2020 yazarsam eğer listelemiyor fakat başlangıç tarihine 15.03.2020 bitiş tarihine de 16.03.2020 yazarsam eğer 16.03.2020 tarihine ait kayıtları listeliyor. Acil yardımlarınızı rica ediyorum.

Şöyle bir durumu fark ettim; Eğer MonthCalender'dan veya DateTimePicker'dan seçilen tarihi önce bir değişkene atıp sonra query'de o değişkeni kullanırsam tarihe göre arama çalışıyor. Fakat bu şekilde yapmak demek tüm sistemde çok ciddi bir çalışma yapmak anlamına geliyor.

Kod: Tümünü seç

    DM1.DataConn.Connected:= False;
    DM1.DataConn.ConnectionString:= 'Provider=SQLNCLI11.1;Password=Abc.;Persist Security Info=True;User ID=sa;Data Source=SERVER\SQLEXPRESS;Auto Translate=False;Initial Catalog=SIRKET_2020;
    DM1.DataConn.Connected:= True;
Her zaman kullandığım kod aşağıda görülen, bu kod şu an çalışmıyor. Tarihe göre kayıt bulmuyor. Bu kodun çalışması gerekiyor. ODBC ile bağlantı kurduğum zamanda çalışıyor idi.

Kod: Tümünü seç

  DM1.KURLAR.SQL.CLEAR;
  DM1.KURLAR.SQL.Add('SELECT * FROM KURLAR');
  DM1.KURLAR.SQL.Add('WHERE TARIH= :pTARIH1');
  DM1.KURLAR.Parameters.ParamByName('pTARIH1').Value:= MonthCalender1.date;
  DM1.KURLAR.Open;
Bu şekilde yaparsam çalışıyor.

Kod: Tümünü seç

  DM1.KURLAR.SQL.CLEAR;
  DM1.KURLAR.SQL.Add('SELECT * FROM KURLAR');
  DM1.KURLAR.SQL.Add('WHERE TARIH>= :pTARIH1 AND TARIH<= :pTARIH2');
  DM1.KURLAR.Parameters.ParamByName('pTARIH1').Value:= MonthCalender1.date; //15.03.2020
  DM1.KURLAR.Parameters.ParamByName('pTARIH2').Value:= MonthCalender2.date; //16.03.2020
  DM1.KURLAR.Open;
Bu şekilde bir ara değişken tanımlarsam çalışıyor.

Kod: Tümünü seç

var
guntar:TDate;
begin
  guntar:= StrToDate(MonthCalender1.date);

  DM1.KURLAR.SQL.CLEAR;
  DM1.KURLAR.SQL.Add('SELECT * FROM KURLAR');
  DM1.KURLAR.SQL.Add('WHERE TARIH= :pTARIH1');
  DM1.KURLAR.Parameters.ParamByName('pTARIH1').Value:= guntar;
  DM1.KURLAR.Open;
end;  

zengin
Üye
Mesajlar: 206
Kayıt: 06 Ağu 2003 09:13

Re: ADO Bağlantıda Tarih Alanına Göre Kayıt Bulma Problemi

Mesaj gönderen zengin » 16 Mar 2020 02:43

Kod: Tümünü seç

DM1.KURLAR.SQL.Add('WHERE TARIH >='''+DateEdit1.Text+'''and TARIH <='''+ DateEdit2.text+'''');
bu şekil bir denermisin kolay gelsin
Zengin

mmg
Üye
Mesajlar: 51
Kayıt: 19 Haz 2014 11:47

Re: ADO Bağlantıda Tarih Alanına Göre Kayıt Bulma Problemi

Mesaj gönderen mmg » 16 Mar 2020 02:56

Merhaba,

Tam olarak bu yazılımdaki fark nedir anlayamadım, DateEdit1 nedir ? Ben doğrudan MonthCalender veya DatetimePicker değerlerini sql'de kullanıyorum. Sanırım bu problem bir parametre hatası olabilir. Kodda bir değişiklik yapmadan çözülebilir olması gerekebilir diye düşünüyorum. Benim kodu yukarıda da belirttiğim gibi bağlantı şekli ODBC iken sorunsuz çalışıyor idi.

Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2180
Kayıt: 12 Haz 2003 03:05
Konum: merkez camii yanı

Re: ADO Bağlantıda Tarih Alanına Göre Kayıt Bulma Problemi

Mesaj gönderen freeman35 » 16 Mar 2020 03:19

Date ve DateTime farklıdır. yani saat bilgisini hesaba katmalısın, yada alanları cast ile sadece tarih olarak işlemelisin.
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!

mmg
Üye
Mesajlar: 51
Kayıt: 19 Haz 2014 11:47

Re: ADO Bağlantıda Tarih Alanına Göre Kayıt Bulma Problemi

Mesaj gönderen mmg » 16 Mar 2020 03:34

Yalnız ben tabloya date olarak kaydediyorum, sql table'da alan tipi date, sorguda da MonthCalender.date'i aratıyorum. Bunda bir problem var mı ? Dediğim gibi bu problem odbc'yi terk edince ortaya çıktı.

zengin
Üye
Mesajlar: 206
Kayıt: 06 Ağu 2003 09:13

Re: ADO Bağlantıda Tarih Alanına Göre Kayıt Bulma Problemi

Mesaj gönderen zengin » 16 Mar 2020 04:15

kardeşim form da ( iki tarih arası filtreleme ) olarak arattırsan daha cabuk istediğin koda ulaşabilirsin kolay gelsin
Zengin

mmg
Üye
Mesajlar: 51
Kayıt: 19 Haz 2014 11:47

Re: ADO Bağlantıda Tarih Alanına Göre Kayıt Bulma Problemi

Mesaj gönderen mmg » 16 Mar 2020 04:38

Önce problemi anlamak lazım bence zengin, benim problemim iki tarih arası kayıt bulmak değil, yukardan aşağıya yazdıklarımı sırasıyla okursanız ne sorduğumu anlayabilirsiniz. İlginiz için teşekkürler.

zengin
Üye
Mesajlar: 206
Kayıt: 06 Ağu 2003 09:13

Re: ADO Bağlantıda Tarih Alanına Göre Kayıt Bulma Problemi

Mesaj gönderen zengin » 16 Mar 2020 05:32

mmg kardeşim öyle kızma filan yok amacımız burada birbirimize destek olmak konuyu belki ben yanlış anlamış olabilirim kişiden kişiye değişir sonucu sizden bekliyoruz İlginiz için teşekkürler
Zengin

ertank
Üye
Mesajlar: 1281
Kayıt: 11 Eyl 2015 11:45

Re: ADO Bağlantıda Tarih Alanına Göre Kayıt Bulma Problemi

Mesaj gönderen ertank » 16 Mar 2020 05:43

mmg yazdı:
16 Mar 2020 03:34
Yalnız ben tabloya date olarak kaydediyorum, sql table'da alan tipi date, sorguda da MonthCalender.date'i aratıyorum. Bunda bir problem var mı ? Dediğim gibi bu problem odbc'yi terk edince ortaya çıktı.
Merhaba,

Maalesef çok fazla kişi "variant" kullanarak parametre ve tablo kayıtlarında değer atamaları yapıyor. Bu tavsiye edilen bir kullanım şekli değil. Çünkü variant veri türü kesin değildir. Integer da olabilir string de olabilir. Hatta Null olabilir. Parametreler içinde kullanıldığı zaman parametre veri türü kullandığınız veri erişim bileşenlerine göre bilinmez "unknown" şeklinde işleme tabi tutulabilir.

Parametre atamalarınızı aşağıdaki şekilde veri türü eşleştirerek yeniden deneyebilir misiniz?

Kod: Tümünü seç

DM1.KURLAR.Parameters.ParamByName('pTARIH1').AsDateTime := MonthCalender1.Date; 
".AsDateTime" kullanımı ile sizin ".Value" şeklindeki kullanımınızın farkı sorgu bileşeninizin artık ne tür veri tipi ataması yapıldığını kesin olarak biliyor olması ve parametre için veri türüne göre gerekli dönüşümleri yapıyor olmasıdır.

Eğer bu şekilde de sorgu hatalı geliyor ise;
1- Aşağıdaki şekilde son bir deneme yapın:

Kod: Tümünü seç

DM1.KURLAR.Parameters.ParamByName('pTARIH1').AsString := FormatDateTime('yyyy-mm-dd', MonthCalender1.Date);
2- SQL Server üzerinde gelen/giden sorguları inceleyip SQL cümlesinin ve parametrelerin ne şekilde iletildiğini incelemenizde fayda var.

mmg
Üye
Mesajlar: 51
Kayıt: 19 Haz 2014 11:47

Re: ADO Bağlantıda Tarih Alanına Göre Kayıt Bulma Problemi

Mesaj gönderen mmg » 16 Mar 2020 06:21

ertank merhaba,

Sizin örnekleriniz derleme anında hata verdi, neden bilmiyorum, verdiği hatayı aşağıda paylaştım. Fakat sizin verdiğiniz örnekler yardımıyla sorun çözüldü sanırım.

Kod: Tümünü seç

DM1.KURLAR.Parameters.ParamByName('pTARIH1').AsDateTime := MonthCalender1.Date; 
veya

Kod: Tümünü seç

DM1.KURLAR.Parameters.ParamByName('pTARIH1').AsString := FormatDateTime('yyyy-mm-dd', MonthCalender1.Date);
Kullandığımda her ikisinde de, 'AsDateTime' ve 'AsString' ifadeleri için aşağıda görülen hatayı veriyor. Bu arada Delphi 10.2 kullanıyorum.

Kod: Tümünü seç

[dcc32 Error] U_Test.pas(115): E2003 Undeclared identifier: 'AsDateTime'
Sizin örneklerinizden yola çıkarak aşağıda ki kodu denedim ve sorgu doğru olarak çalıştı, sizce bir sorun gözüküyor mu ? Bu şekilde kullanmamda bir problem olur mu ? Yardımınız için çok teşekkür ediyorum.

Kod: Tümünü seç

DM1.KURLAR.Parameters.ParamByName('pTARIH1').Value := FormatDateTime('yyyy-mm-dd', DateTimePicker1.DateTime);

mmg
Üye
Mesajlar: 51
Kayıt: 19 Haz 2014 11:47

Re: ADO Bağlantıda Tarih Alanına Göre Kayıt Bulma Problemi

Mesaj gönderen mmg » 16 Mar 2020 06:41

zengin yazdı:
16 Mar 2020 05:32
mmg kardeşim öyle kızma filan yok amacımız burada birbirimize destek olmak konuyu belki ben yanlış anlamış olabilirim kişiden kişiye değişir sonucu sizden bekliyoruz İlginiz için teşekkürler
zengin kardeşim kesinlikle kızma filan yok, yanlış anlaşıldım, kusura bakmayın lütfen. Tabi ki amaç birbirimize yardımcı olmak, belki bizim sayemizde sorduğumuz soruyla aynı problemi yaşayan başka arkadaşlarımıza da yardımcı olabiliriz. Bir anda böyle bir tabloya düşünce istemeden de olsa gerginliğimi size yansıtmış olabilirim. Çabalarınız için çok teşekkür ederim, hakkınızı helal edin.

Cevapla