SQL LIKE komutu sorunu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
FXERKAN
Üye
Mesajlar: 178
Kayıt: 26 Tem 2003 11:06
Konum: Sivas - Konya
İletişim:

SQL LIKE komutu sorunu

Mesaj gönderen FXERKAN »

SQL LIKE komutu sorunu

like için bir procedure yazmaya çalıştım(aşağıda)

tek bir alan adı gönderdiğim zaman hiçbir sorun yok anack iki lana gönderdiğim zaman kitliyo. kodda bir hata var ama sql de yeni olduğum için tam olarak bilemiyorum

--> filitrele2(cmb_tur.Text,'TUR','',1); //BUNU KULLANINCA BİR SORUN YOK

--> filitrele2(arabul.Text,'KOD','BASLIK',2); //AMA BUNDA VAR İŞTE VE BEN SORUNUN NE OLDUĞUNU BİLİMİYORUM

KODA BİR BAKARMISINIZ ACABA


procedure filitrele2(flt : string; alan1 : string; alan2 : string; alansayisi : integer);
var
SQLvalue : string;
begin

//İŞTE SORUN BURDA NE OLUYORSA BURDA OLUYOR YA KESİN BİR YAZIM YANLIŞLIĞI VAR AMA BEN BULAMADIM
if (alansayisi = 2) then
begin

if secim = 1 then
begin
SQLValue := 'Select * from DATA\DELPHI where ';
SQLValue := SQLValue + alan1 + 'LIKE ''' + '%' + flt + '%' + '''' + ' and';
SQLValue := SQLValue + alan2 + 'LIKE ''' + '%' + flt + '%' + '''';
end;

end;

//BURASI HİÇ SORUNSUZ ÇALIŞIYOR
if alansayisi = 1 then
begin
if secim = 1 then
begin
SQLValue := 'Select * from DATA\DELPHI where ';
SQLValue := SQLValue + alan1 + ' LIKE ''' + '%' + flt + '%' + '''';
end;
end;

if sqlvalue <> '' then
begin
dm.qer.Close;
dm.qer.SQL.Clear;
dm.qer.SQL.Add(sqlvalue);
dm.qer.Open;
dm.qer.Active := true;
end;

end;
[ F X E R K A N © - E r k a n Ç İ F T Ç İ ]
P206
Kıdemli Üye
Mesajlar: 395
Kayıt: 17 Haz 2003 12:36
Konum: İstanbul

Mesaj gönderen P206 »

Merhaba,

Sana verdiği bir hata mesajı varmı. Kitleniyor demişsin ama..
Sql bittikten sonra onu Showmessage ile bir ekrana getirip bir kontrol et
and den sonra önce boşluk falan vermemiş olabilirsin.
Sadece bir bir fikir.
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7588
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

Bence de Query'i açmadan önceden

ShowMessage (dm.ger.sql.text);

komutu ile oluşan SQL cümlesine bak ve yanlışın nerde olduğunu bul.

EK NOT : Query'i Open ile açtıktan sonra Active := True; gibi bir ifadeye gerek yok.

SORU : Hepsi birbirinden alakasız bu kadar soru var, sen aynı anda kaç projeyle çalışıyorsun hocam :o

Kolay gelsin.
mrCeng
Üye
Mesajlar: 7
Kayıt: 24 Tem 2003 12:10
Konum: Kayseri
İletişim:

Mesaj gönderen mrCeng »

Hocam bu kullandığınız yönteme göre
procedure filitrele2(flt : string; alan1 : string; alan2 : string; alansayisi : integer);
alansayisi=1 veya 2 olabiliyor. Ama bu şekilde sadece 2 alanı filteleyebilirsin. (seçimlik). üstelik eğer bir alan filtrelemek istiyorsan yinede prosedüre alan1 ve alan2 kodlarını göndermen gerekiyor. Peki iki diilde 5 alanı filtrelemen gerekirse o zamanda alan1,alan2,alan3,alan4,alan5 olarak 5 parametre gönderen bir procedure hazırlaman gerekecek. Bir alanı filtrelediğin anda diğer gelen parametreler boşa gelmiş olacak.
Bilmiyorum haksızmıyım.
Bunu çalışma ve programlamayı geliştirme amaçlı yaptığını düşündüm. :) Bu yüzdende fikir vermek istedim.

Aşağıda dediğiniz işlemi seçime bağlı olarak yapan (5 adet) bir kod hazırladım. Açık olması için filtrelenecek alanların nasıl elde edildiğini açık açık yazdım. Aslında onada gerek olmadan bir parametre ile fonksiyondan çekilebilirdi fakat mantık olarak doğru olan ve biraz uzun olan kodu (açık olması için uzun uzun hazırlandı) gönderiyorum. Umarım faydalı olur.

Şu mantıkla formu hazırlayacaksınız:
1. form üzerine 5 checkbox yerleştirip captionlarını fieldName olarak ayarlayacaksınız. Filtrelenecek alanın fieldName i.
2. yanlarına birer Edit koyun.
3. birde query :)
4. queryden görmek için ne gerekiyorsa onlar (datasource,dbgrid, dbchart, .. ps)

Tabi burada 5 değilde 15 checkbox, 15 edit yerleştirebilirsiniz, onun içinde aşağıdaki button klik olayında dinamik Array verilerini ona göre yerleştirecek kodları hazırlamak gerekir. Ama filtrele isimli procedure sadece iki parametre gönderilecek her seferinde. Ne seçerse seçsin.
Umarım faydası olur.

saygılar.
kolay gelsin.

Kod: Tümünü seç



procedure filtrele(gArray:array of string; gDeger:array of string);
var
    sqlCumle:string;
    k:integer;
begin
    sqlCumle:='select * from customer';
    sqlCumle:=sqlCumle+' where 1=1';
    for k:=0 to (Length(gArray)-1) do begin
        sqlCumle:=sqlCumle+' and '+gArray[k]+' Like '+chr(39)+'%'+gDeger[k]+'%'+chr(39)
    end;
    showmessage(sqlCumle);
    if form1.Query1.Active then form1.Query1.Active:=false;
    form1.Query1.SQL.Clear;
    form1.Query1.SQL.Add(sqlCumle);
    form1.Query1.Open;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
    FiltrelenecekAlanAdi:array of string;
    BuAlaninDegeri: array of string;
begin
    setLength(FiltrelenecekAlanAdi,0);
    setLength(BuAlaninDegeri,0);
    if CheckBox1.Checked then begin
        SetLength(FiltrelenecekAlanAdi,Length(FiltrelenecekAlanAdi)+1);
        SetLength(BuAlaninDegeri,Length(FiltrelenecekAlanAdi)+1);
        FiltrelenecekAlanAdi[Length(FiltrelenecekAlanAdi)-1]:=CheckBox1.Caption;
        BuAlaninDegeri[Length(FiltrelenecekAlanAdi)-1]:=edit1.text;
    end;
    if CheckBox2.Checked then begin
        SetLength(FiltrelenecekAlanAdi,Length(FiltrelenecekAlanAdi)+1);
        SetLength(BuAlaninDegeri,Length(FiltrelenecekAlanAdi)+1);
        FiltrelenecekAlanAdi[Length(FiltrelenecekAlanAdi)-1]:=CheckBox2.Caption;
        BuAlaninDegeri[Length(FiltrelenecekAlanAdi)-1]:=edit2.text;
    end;
    if CheckBox3.Checked then begin
        SetLength(FiltrelenecekAlanAdi,Length(FiltrelenecekAlanAdi)+1);
        SetLength(BuAlaninDegeri,Length(FiltrelenecekAlanAdi)+1);
        FiltrelenecekAlanAdi[Length(FiltrelenecekAlanAdi)-1]:=CheckBox3.Caption;
        BuAlaninDegeri[Length(FiltrelenecekAlanAdi)-1]:=edit3.text;
    end;
    if CheckBox4.Checked then begin
        SetLength(FiltrelenecekAlanAdi,Length(FiltrelenecekAlanAdi)+1);
        SetLength(BuAlaninDegeri,Length(FiltrelenecekAlanAdi)+1);
        FiltrelenecekAlanAdi[Length(FiltrelenecekAlanAdi)-1]:=CheckBox4.Caption;
        BuAlaninDegeri[Length(FiltrelenecekAlanAdi)-1]:=edit4.text;
    end;
    if CheckBox5.Checked then begin
        SetLength(FiltrelenecekAlanAdi,Length(FiltrelenecekAlanAdi)+1);
        SetLength(BuAlaninDegeri,Length(FiltrelenecekAlanAdi)+1);
        FiltrelenecekAlanAdi[Length(FiltrelenecekAlanAdi)-1]:=CheckBox5.Caption;
        BuAlaninDegeri[Length(FiltrelenecekAlanAdi)-1]:=edit5.text;
    end;
    filtrele(FiltrelenecekAlanAdi,BuAlaninDegeri);
end;
Kullanıcı avatarı
FXERKAN
Üye
Mesajlar: 178
Kayıt: 26 Tem 2003 11:06
Konum: Sivas - Konya
İletişim:

Mesaj gönderen FXERKAN »

şimdi ben şu anda 5 yada daha fazla proje ile uğraşıyorum.

gerçi çoğu birbiri ile bağlantılı ama olsun.

ben filitrele procedurüne bir string dizisinin nasıl gönderildiği bilmediğim için filitrele kodunu sadece iki alan göre ayarladım. yoksa aklımdaki gönderdiğim alan sayısı kaç olursa olsun kendisinin ototmatik anlamasıydı neyse gönderdiğiniz kodu anladım yani

sorunun ne olduğunu analdım LIKe'dan önce bir boşluk bırakmamışım ama yardımlarınız olmasa anlayamazdım teşekkürler.
[ F X E R K A N © - E r k a n Ç İ F T Ç İ ]
Cevapla