Database saatler arası search

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
Serhat
Üye
Mesajlar: 203
Kayıt: 27 Tem 2014 11:10

Database saatler arası search

Mesaj gönderen Serhat »

Selamlar.

Günlük databaseye yaklaşık 1500 ile 2000 arası kayıt yapılıyor, iki saat arasında, 24 saat baz alınarak arama yaptırmak için nasıl bir döngü kullana bilirim.

Örnek:
12:00:00 - 13:00:00 arasında 5 adet "Roller kalem" satılmışsa listview listelenecek...

Kod: Tümünü seç

procedure TForm2.SearchKeyPress(Sender: TObject; var Key: Char);
begin
  try
    ListView1.Items.Clear;
    with AMODELQuery do
    begin
      Close;
      SQL.Clear;
      SQL.Add('Select * From MODELLER');
      SQL.Add('Where MODEL Like ' + QuotedStr('%' + Search.Text + '%'));
      SQL.Add('Order By ID DESC');
      SQL.Add('LIMIT ' + '100');
      Open;
      if Not IsEmpty then
      begin
        while Not Eof do
        begin
          with ListView1.Items.Add do
          begin
            SubItems.Add(FieldByName('SAAT').AsString);
            SubItems.Add(FieldByName('MODEL').AsString);
            Next;
          end;
        end;
En son Serhat tarafından 18 Kas 2015 07:37 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: Databse saatler arası search

Mesaj gönderen xxxjedixxx »

Merhaba,

Döngü içinde aratmak yerine SQL komutundaki Where cümlesine SAAT sınırı yazabilirsin.

Kod: Tümünü seç

procedure TForm2.SearchKeyPress(Sender: TObject; var Key: Char);
begin
  try
    ListView1.Items.Clear;
    with AMODELQuery do
    begin
      SQL.Text := 'Select * from modeller where model like ' + QuotedStr('%' + Search.Text + '%') + 
              ' and saat between :psaat1 and :psaat2 Order by id desc limit 100';
      Parameters.ParamValues['psaat1'] := EncodeTime(12, 0, 0, 0);  //12:00      
      Parameters.ParamValues['psaat2'] := EncodeTime(13, 0, 0, 0);  //13:00
      Open;   
      ...
      ...   
end;            

Eğer döngü içinde kontrol etmek istersen, sorgu da bir değişiklik yapmadan da şu şekilde yapabilirsin

Kod: Tümünü seç

  ...
        while Not Eof do
        begin
          if (FieldByName('SAAT').AsTime >= EncodeTime(12, 0, 0, 0)) and (FieldByName('SAAT').AsTime < EncodeTime(13, 0, 0, 0)) then
          begin
            with ListView1.Items.Add do
            begin
              SubItems.Add(FieldByName('SAAT').AsString);
              SubItems.Add(FieldByName('MODEL').AsString);
            end;
          end;
          Next;
        end;  
  ...
Kodları yazarken SAAT alanının saat tipinde olduğunu varsaydım. Eğer farklı bir tipte yazıyorsan ona göre değişiklik yapmalısınız. Saatleri statik (12 ve 13) olarak yazdım. Bunları değişkene bağlayabilirsiniz.
Kullanıcı avatarı
Serhat
Üye
Mesajlar: 203
Kayıt: 27 Tem 2014 11:10

Re: Database saatler arası search

Mesaj gönderen Serhat »

Selam, teşekkür ederim cevap için, ancak her saat için bu sefer ayrı bir kod yoğunluğu oluşacak...

24 tane ayrı ayrı kodlama yapmak gerek...
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: Database saatler arası search

Mesaj gönderen xxxjedixxx »

Neden 24 tane yapmak gerekiyor anlamadım. Ben EncodeTime(12,0,0,0) 'ı örnek olsun diye vermiştim ve özellikle statik olarak yazdığımı da belirtmiştim. Bunu bir değişkene bağlayabilirsiniz diye de belirtmiştim.

Formunuzda Saat1 ve Saat2 isimli iki adet edit nesnesi olsun. Bu nesnelere sadece saat değerini (1, 5, 15 gibi) girdiğimizi var sayarsak, Kodunuzdaki EncodeTime fonksiyonunun geçtiği yerleri aşağıdaki gibi değiştirin.

Parameters.ParamValues['psaat1'] := EncodeTime(StrtoIntDef(Saat1.Text, 0), 0, 0, 0);
Parameters.ParamValues['psaat2'] := EncodeTime(StrtoIntDef(Saat2.Text, 0), 0, 0, 0);
veya
if (FieldByName('SAAT').AsTime >= EncodeTime(StrtoIntDef(Saat1.Text, 0), 0, 0, 0)) and (FieldByName('SAAT').AsTime < EncodeTime(StrtoIntDef(Saat2.Text, 0), 0, 0, 0)) then

Eğer editlere saat formatında giriş yapılacaksa (15:00:00, 08:30:00 gibi) EncodeTime yerine StrtoTime fonksiyonunu kullanabilirsiniz.
StrtoTime(Saat1.Text) gibi
Cevapla