Delphi MySQL XDBGrid szűrés

Delphi MySQL XDBGrid szűrés
2014-02-21T15:30:04+01:00
2014-02-24T13:36:14+01:00
2022-11-30T14:20:41+01:00
ZohanKAA
Üdv!

Újabb problémába botlottam.

Az XDBGridbe szeretném szűkíteni a találatokat a következő módon (kép mellékelve)

Az ehhez használt összes komponens(lásd kép) OnChange eseményére tettem rá az utasításokat a következő módon:

procedure TForm7.DateTimePicker1Change(Sender: TObject); var d1:TDateTime; begin FDQuery2.Active:=False; d1:=DateTimePicker1.Date; FDQuery2.Params[2].AsDate:=d1; FDQuery2.Active:=True; Label6.Caption:=FDquery2.Params[0].AsString; //ez csak nekem segítség Label7.Caption:=FDquery2.Params[1].AsString; //ez csak nekem segítség Label8.Caption:=FDquery2.Params[2].AsString; //ez csak nekem segítség Label9.Caption:=FDquery2.Params[3].AsString; //ez csak nekem segítség Label10.Caption:=FDquery2.Params[4].AsString; //ez csak nekem segítség XDBGrid1.Columns[0].Width:=25; XDBGrid1.Columns[1].Width:=96; XDBGrid1.Columns[2].Width:=64; XDBGrid1.Columns[3].Width:=64; XDBGrid1.Columns[4].Width:=64; XDBGrid1.Columns[5].Width:=64; XDBGrid1.Columns[6].Width:=64; XDBGrid1.Columns[7].Width:=64; XDBGrid1.Columns[8].Width:=64; XDBGrid1.Columns[9].Width:=64; XDBGrid1.Columns[10].Width:=64; end; procedure TForm7.Edit1Change(Sender: TObject); Var n:String; begin FDQuery2.Active:=False; if Edit1.Text<>'' then n:='%'+Edit1.Text+'%'; FDQuery2.Params[0].AsString:=n; FDQuery2.Active:=True; Label6.Caption:=FDquery2.Params[0].AsString; //ez csak nekem segítség Label7.Caption:=FDquery2.Params[1].AsString; //ez csak nekem segítség Label8.Caption:=FDquery2.Params[2].AsString; //ez csak nekem segítség Label9.Caption:=FDquery2.Params[3].AsString; //ez csak nekem segítség Label10.Caption:=FDquery2.Params[4].AsString; //ez csak nekem segítség XDBGrid1.Columns[0].Width:=25; XDBGrid1.Columns[1].Width:=96; XDBGrid1.Columns[2].Width:=64; XDBGrid1.Columns[3].Width:=64; XDBGrid1.Columns[4].Width:=64; XDBGrid1.Columns[5].Width:=64; XDBGrid1.Columns[6].Width:=64; XDBGrid1.Columns[7].Width:=64; XDBGrid1.Columns[8].Width:=64; XDBGrid1.Columns[9].Width:=64; XDBGrid1.Columns[10].Width:=64; end;

és így tovább (összesen 5 paraméter van)

FDQuery-ben az sql a következő:  
SELECT keszlet.id,arucikk.nev,arucikk.jelleg,bolt_id,ny_keszl,be,vissz,z_keszl,eladott,ertek,datum FROM keszlet,arucikk WHERE arucikk.id=keszlet.bolt_id AND arucikk.nev LIKE :n AND arucikk.jelleg=:j AND datum BETWEEN :d1 AND :d2 AND bolt_id=:bid;

Ezzel csak az a probléma, hogy csak akkor kapok eredményt ha mindegyik paraméterre talál egyezést a SELECT utasítás

Viszont nekem úgy kellene, hogy akkor is kihozza a sort ha csak 1 feltételt adok meg pl TEdit-be egy betű, kifejezés, vagy a DateTimePicker-be egy megadott dátum.

Hogyan lehetne ezt megoldani?

Előre is köszönöm a segítséget!
Mutasd a teljes hozzászólást!
Csatolt állomány
A választ épp te magad adtad meg a kérdéseddel:

Nem egy fix select utasítás kell, hanem egy a feltételeidnek megfelelően a program által összerakott utasítás.
Egy megelőző programrészben/függvényben megvizsgálod, hogy mely mezők lettek kitöltve és ennek megfelelően egy változóban összeállítod a lekérdezést, amit elküldesz az sql szervernek.
Mutasd a teljes hozzászólást!

  • A select where részében ne AND hanem OR legyen, mert az
    AND azt jelenti, hogy mindegyik feltételnek egyenként teljesülni kell.

    vagy zároljellel lehet úgy, hogy pl kettőnek mindenképp teljesülni kell a 3. vagy kapcsolat.

    ((A feltétel) and (B feltétel)) OR (C feltétel)

    ilyenkor ha csak a C teljesül akkor is megjelenik, de ha a C nem teljesül, akkor 
    csak A és B együttes teljesülése esetén lesz igaz a végeredmény.


    "AND és OR Top Balance - A megoldás Ön-ben sejlik..."
    Mutasd a teljes hozzászólást!
  • Valóban, köszi! viszont nekem ez a megoldás sem jó, mert így ha beírok/kiválasztok több feltételt akkor is kihozza az eredményt ha csak az egyik igaz belőle, nekem pedig úgy kellene:

    ha 1-et választok ki teljesüljön.
    ha 2-t választok ki csak akkor hozza ha mindkettő teljesül
    ha 3-at akkor csak ha mindhárom!

    Hogyan írhatnám meg ezt?
    Mutasd a teljes hozzászólást!
  • A választ épp te magad adtad meg a kérdéseddel:

    Nem egy fix select utasítás kell, hanem egy a feltételeidnek megfelelően a program által összerakott utasítás.
    Egy megelőző programrészben/függvényben megvizsgálod, hogy mely mezők lettek kitöltve és ennek megfelelően egy változóban összeállítod a lekérdezést, amit elküldesz az sql szervernek.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd