sql, tarih ve çoklu seçim

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
gercek_16
Üye
Mesajlar: 108
Kayıt: 19 Haz 2005 02:42
Konum: mersin

sql, tarih ve çoklu seçim

Mesaj gönderen gercek_16 »

Merhabalar şöyle bir kodum var ama doğru çalışmıyor.
yapmak istediğim belirtilen tarihler arasındaki kayıtların
checkboxtan seçili olanlarını almak. bu kodu nasıl düzeltmeliyim.


Kod: Tümünü seç

procedure TForm43.BitBtn1Click(Sender: TObject);
var
  t1,t2,sql,sql2:string;
  tarih1,tarih2:tdate;
  A:Byte;
begin
  datamodule3.IBQuery1.Close;
  datamodule3.IBQuery1.Open;
  DATAMODULE3.IBquery1.sql.Clear;
  tARIH1:=(DateTimePicker1.date);
  TARIH2:=(DateTimePicker2.date);
  t1:=DateToStr(tarih1);
  t2:=DateToStr(tarih2);

  A:=1;
  sql:='select * from emlak where 1=1 ';
  if a=1  then   sql:= sql+ ' and emlak_CINSI=''x''';

  if CheckBox1.Checked  then  sql := sql + ' OR EMLAK_CINSI = ''KIRALANAN EVLER''';
  if CheckBox2.Checked then   sql := sql + ' OR EMLAK_CINSI = ''KIRALANAN DÜKKANLAR''';
  if CheckBox3.Checked then   sql := sql + ' OR EMLAK_CINSI = ''SATILAN EVLER''';
  if CheckBox4.Checked then   sql := sql + ' OR EMLAK_CINSI = ''SATILAN DÜKKANLAR''';
  if CheckBox5.Checked then   sql := sql + ' OR EMLAK_CINSI = ''SATILAN VİLLALAR''';
  if CheckBox6.Checked then   sql := sql + ' OR EMLAK_CINSI = ''SATILAN ARSALAR''';
  if CheckBox7.Checked then   sql := sql + ' OR EMLAK_CINSI = ''SATILAN DİĞER EML''';

  DataModule3.IBquery1.sql.add(sql);
  DataModule3.IBQuery1.SQL.ADD ('and TARIHISLEM > '''+T1+'''');
  DataModule3.IBQuery1.SQL.ADD ('AND TARIHISLEM < '''+T2+'''');

  datamodule3.ibquery1.open;
  form44.quickrep1.preview;
end;



yani checboxtan kiralık ev ve satılık ev seçilmişse belirtilen tarihler arasındaki kiralık ev ve satılık evleri filitrelesin.
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

merhaba...

Kod: Tümünü seç

procedure TForm43.BitBtn1Click(Sender: TObject); 
var
  sql: string;
begin
    with datamodule3.IBQuery1 do
    begin
      sql.Clear;
       sql := 'select * from emlak where EMLAK_CINSI=''x'' ';
      if CheckBox1.Checked then sql := sql + ' OR EMLAK_CINSI = ''KIRALANAN EVLER'' ';
      if CheckBox2.Checked then sql := sql + ' OR EMLAK_CINSI = ''KIRALANAN DÜKKANLAR'' ';
      if CheckBox3.Checked then sql := sql + ' OR EMLAK_CINSI = ''SATILAN EVLER'' ';
      if CheckBox4.Checked then sql := sql + ' OR EMLAK_CINSI = ''SATILAN DÜKKANLAR'' ';
      if CheckBox5.Checked then sql := sql + ' OR EMLAK_CINSI = ''SATILAN VİLLALAR'' ';
      if CheckBox6.Checked then sql := sql + ' OR EMLAK_CINSI = ''SATILAN ARSALAR'' ';
      if CheckBox7.Checked then sql := sql + ' OR EMLAK_CINSI = ''SATILAN DİĞER EML'' ';
      SQL.Add(sql);
      SQL.Add('and TARIHISLEM Between ''' + DateToStr(DateTimePicker1.Date) + ''' and ');
      SQL.Add(' ''' + DateToStr(DateTimePicker2.Date) + ''' ');
      Close;
      Prepare;
      Open;
      form44.quickrep1.preview;
    end;
end;
Burada fazlalık gördüklerimi kaldırdım...Denemedim ama mantığı bu şekilde olması lazım...

iyi günler...
gercek_16
Üye
Mesajlar: 108
Kayıt: 19 Haz 2005 02:42
Konum: mersin

Mesaj gönderen gercek_16 »

merhabalar kodunuzu aynen yazdım.

Kod: Tümünü seç

      sql := 'select * from emlak where EMLAK_CINSI=''x''';
bu satırda

Kod: Tümünü seç

[Error] sat_kir_em_rap.pas(59): Incompatible types: 'TStrings' and 'String'
hatası veriyor.
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

merhaba...

Kod: Tümünü seç

var
  sql: string; 
Yukarıda tanımlanan sql değişkeni hatalı...Delphi komutlarını değişken olarak tanımlamamak gerekir ..Hata da bundan kaynaklanması lazım..Değişkenin ismini değiştirmelisiniz..'Sqlcumlesi' gibi...
gercek_16
Üye
Mesajlar: 108
Kayıt: 19 Haz 2005 02:42
Konum: mersin

Mesaj gönderen gercek_16 »

şimdide şöyle bir hata veriyor.

Kod: Tümünü seç

    sql1.Clear;
bu satırda

Kod: Tümünü seç

[Error] sat_kir_em_rap.pas(55): Record, object or class type required

hatasını veriyor.
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

gercek_16 yazdı:

Kod: Tümünü seç

 sql1.Clear;
Görülüyor ki 'sql' leri 'sql1' yapmışsınız...

Kod: Tümünü seç

SQL.Clear 
olması lazım..
Tanımladığınız Sql1 değişkeni ile SQL.Clear daki SQl ifadesi aynı değil.
Onlar sabit kalsın sadece tanımladığınız 'sql' değişkenini 'sql1' olarak değiştirin;
gercek_16
Üye
Mesajlar: 108
Kayıt: 19 Haz 2005 02:42
Konum: mersin

Mesaj gönderen gercek_16 »

evet kodunuz çalıştı ama benim yazdığım kodda aynı şekilde çalışıyordu.
Bu çok daha temiz bir kod oldu, teşekkürler.
kodda şöyle bir mantık hatası var
eğer bir tane checkbox seçersem doğru olarak çalışıyor. >tarih ve seçenek doğru

2 checbox seçersem yanlış çalışıyor. bu sefer tarih koşuluna bakmadan bütün kayıtları veriyor.

tarih sorgusunu biraz değiştirerek başa bir yere yazmak gerekiyor galiba :?:
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

merhaba...
2 checbox seçersem yanlış çalışıyor. bu sefer tarih koşuluna bakmadan bütün kayıtları veriyor
Belki tarihle diğer karşılaştırmaları 'OR' işlemine tutuyor desem arada 'AND' kelimesi var...... :roll:..Bir de böyle deneyebilirsin...

Kod: Tümünü seç

procedure TForm43.BitBtn1Click(Sender: TObject); 
begin
    with datamodule3.IBQuery1 do
    begin
      SQL.Clear;
      SQL.Add('select * from emlak where');
      SQL.Add('TARIHISLEM Between ''' + DateToStr(DateTimePicker1.Date) + ''' and ');
      SQL.Add(' ''' + DateToStr(DateTimePicker2.Date) + ''' ');
      SQL.Add('and EMLAK_CINSI=''x'' ');
      if CheckBox1.Checked then SQL.Add('OR EMLAK_CINSI = ''KIRALANAN EVLER'' ');
      if CheckBox2.Checked then SQL.Add('OR EMLAK_CINSI = ''KIRALANAN DÜKKANLAR'' ');
      if CheckBox3.Checked then SQL.Add('OR EMLAK_CINSI = ''SATILAN EVLER'' ');
      if CheckBox4.Checked then SQL.Add('OR EMLAK_CINSI = ''SATILAN DÜKKANLAR'' ');
      if CheckBox5.Checked then SQL.Add('OR EMLAK_CINSI = ''SATILAN VİLLALAR'' ');
      if CheckBox6.Checked then SQL.Add('OR EMLAK_CINSI = ''SATILAN ARSALAR'' ');
      if CheckBox7.Checked then SQL.Add('OR EMLAK_CINSI = ''SATILAN DİĞER EML'' ');
      Close;
      Prepare;
      Open;
      form44.quickrep1.preview;
    end;
end;
gercek_16
Üye
Mesajlar: 108
Kayıt: 19 Haz 2005 02:42
Konum: mersin

Mesaj gönderen gercek_16 »

evet
bu sefer tarihi hiç dikkate almıyor, seçilen checkboxtaki tüm kayıtları getiriyor.
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

Kod: Tümünü seç

SQL.Add('and (EMLAK_CINSI=''x'' '); 

Kod: Tümünü seç

  if CheckBox7.Checked then SQL.Add('OR EMLAK_CINSI = ''SATILAN DİĞER   EML'' ');
  SQL.Add(')'); 
  Close;
Bu şekilde değiştirmeniz lazım sanırım.
Uğur1982
Üye
Mesajlar: 383
Kayıt: 11 Mar 2005 03:18
Konum: İzmir

Mesaj gönderen Uğur1982 »

merhaba...

500 tane kayıtın içinden istediğim kayıtları doğru olarak getiriyor(10 ayrı or kullandım)....
Kayıtları bir kontrol edin,denemelik kayıt girip deneyin...Benim doğru çalışıyor... :idea:
gercek_16
Üye
Mesajlar: 108
Kayıt: 19 Haz 2005 02:42
Konum: mersin

Mesaj gönderen gercek_16 »

t-hex arkadaşım kodu dediğiniz gibi değiştirdim ve gözlerime inanamadım. :shock:

Gerçekten çalışıyor... çok teşekkür ederim.
eklediğiniz kodun mantığını birazcık anlatabilirseniz çok sevinirim.

Uğur arkadaşımada katkılarından dolayı çok teşakkür ediyorum.
t-hex
Kıdemli Üye
Mesajlar: 531
Kayıt: 18 Mar 2005 02:45
Konum: İstanbul/Antalya
İletişim:

Mesaj gönderen t-hex »

Merhaba,

Sadece OR ile bağlanan EMLAK_CINSI koşullarını parantez içine almanız lazımdı.

Kod: Tümünü seç

 TARIHISLEM BETWEEN ... AND .... and (EMLAK_CINSI=... or EMLAK_CINSI=..)
Cevapla