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;
SQL LIKE komutu sorunu
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
SQL LIKE komutu sorunu
[ F X E R K A N © - E r k a n Ç İ F T Ç İ ]
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
Kolay gelsin.
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

Kolay gelsin.
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.
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.

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;
ş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.
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 Ç İ ]