Többszintű SQL szűrés

Többszintű SQL szűrés
2007-01-13T11:01:36+01:00
2007-01-14T08:26:32+01:00
2022-11-02T21:50:45+01:00
*deleted_42098963
Sziasztok!

Szeretnék készíteni egy részletes szűrést, miszerint:
Van egy Firebird/Interbase adatbázisom.
A Gépjárművek táblát szeretném szűrni, amiben a követező mezők vannak: ID, TulajID, Típus, Dátum, Forgalmi érvényessége, Zöldkártya érvényessége, Köbcenti, Óra állása.
Van a formon egy ComboBox(Tulajdonos választása), egy Edit(Gépjármű típusának beírása), két SpinEdit(a köbcenti x és y között), még két SpinEdit (az óra állása x és y között), két DateTimePicker (Forgalmi érvényessége x és y dátum között), még két DateTimePicker (Zöldkártya érvényessége x és y dátum között).
Meg szeretném csinálni a többszörös szűrést a mezők között úgy, hogy Pl kiválasztok egy tulajdonost, annak kilistázza az összes gépjárművét, ami pl 3 db. Azon belül ki van töltve az óra állása is, és eszerint tovább szűri.
Előfordul az is, hogy én köbcenti szerint szeretném kilistáztatni azokat az autókat, amiknek a megadott időintervallumban lejár a zöldkártyájuk.

Ki hogyan csinálná meg ezt a lekérdezés-halmazt?

Ui.: Azt még meg tudnám csinálni, hogy van 1-2 edit, vagy ComboBox, és azok között ellenőrzöm, hogy melyik van kitöltve, és melyik nem, és aszerint szűröm, de ennyi mezőnél, ami itt van?? Kicsit bonyolultan tudnám.....
Mutasd a teljes hozzászólást!
Az a a bajod, hogy ami egyforma (Mindig select * from ugyfelek-el kezdesz, ott van az open, a close, sql.clear, params.clear stb...) azt nem vonod össze.

pl.:
With Query1 Do Begin Close; Sql.Clear; Sql.Add('Select * From Tabla Where'); If NevAlapjanKereses Then Sql.Add('Nev='Kis Pista'); If KobcentiIsKell Then Sql.Add('Kobcenti=167898923'); If ZoldKartyaDatum Then Sql.Add('Datum Between 2569-12-30 And 2698-0101'); End;

Ha csak ezt megcsinálod, máris fele ekkora lesz a kód.

Természetesen a paramétereket, nem volt kedvem bepötyögni, azzal szórakozz te.

És mégeccer, ezt a problémát másképpen nem fogod tudni megoldani, vagy visszább kell venni az igényekből...
Mutasd a teljes hozzászólást!

  • Kicsit bonyolultan tudnám.....


    Ezt bizony csak így fogod tudni megcsinálni.

    A lényeg az, hogy a select utáni where feltételeket, neked kell hozzápakolnod programból. Nem tudom lesz-e olyan szerencsétlen, aki a leírásod alapján generál neked egy kódot, de nem nagyon reménykednék a helyedben.

    Mutass kódot, hogy meddig jutottál, akkor tudunk segíteni, de így...

    Mutasd a teljes hozzászólást!
  • Sok-sok eseménykezelt if.

    Viccet félretéve a megfelelő eseményekhez (pl. tulajdonos választás) lekérdezed a következőbe (pl. gépjárművei) szükséges infókat.

    Tehát szépen összerakod a feltételt, if-el vizsgálva, hogy az űrlapodon valami kiválasztottak-e, és ha igen, akkor az kell az sql-be.
    Mutasd a teljes hozzászólást!
  • Hehe gyorsabb voltam Micunál! Yes!! Ezt is megértem. Már érdemes volt felkellnem.
    Mutasd a teljes hozzászólást!
  • Nos az Ügyfelek esetében, hogy van a Cégnév(ComboBox), az Ügyfélnév(Edit),és egy E-mail címmel rendelkezik-e? (CheckBox).
    Mindegyiknél betettem ezt az utasításhalmazt:

    // Először is lekérdezzük a beírt cég azonosítóját a későbbi használathoz with DM.Cegek do begin Close; SQL.Clear; SQL.Add('SELECT *'); SQL.Add('FROM CEGEK'); SQL.Add('WHERE (NEV = :Ceg_Neve)'); ParamByName('Ceg_Neve').AsString := CegNeve.Text; Open; end; Ceg_Azonosito := DM.Cegek.FieldByName('Ceg_Azon').AsString; // Ha nincs Ügyfélnév beírva if (UgyfelNeve.Text = '') then begin // Ha nincs Ügyfélnév beírva, és az öszes cég ki van választva if (CegNeve.Text = '--== Összes cég ==--') then begin // Ha nincs Ügyfélnév beírva, és az öszes cég ki van választva, valamint False az e-mail cím if (Mailcim.Checked = False) then begin // Az összes ügyfelet kilistázzuk with DM.Ugyfelek do begin Close; SQL.Clear; SQL.Add('SELECT *'); SQL.Add('FROM Ugyfelek'); SQL.Add('ORDER BY Nev'); Open; end; end // Ha nincs Ügyfélnév beírva, és az öszes cég ki van választva, valamint True az e-mail cím else begin // Az összes olyan Ügyfelet kilistázzuk, akiknek meg van adva az E-mail címük with DM.Ugyfelek do begin Close; SQL.Clear; SQL.Add('SELECT *'); SQL.Add('FROM Ugyfelek'); SQL.Add('WHERE (MAILCIM <> ''-'')'); SQL.Add('ORDER BY Nev'); Open; end; end; end // Ha nincs Ügyfélnév beírva, de ki van választva egy cég else // Ha nincs Ügyfélnév beírva, de ki van választva egy cég, valamint False az e-mail cím if (MailCim.Checked = False) then begin // Megszűrjük a Cégazonosító alapján az Ügyfeleket with DM.Ugyfelek do begin Close; SQL.Clear; SQL.Add('SELECT *'); SQL.Add('FROM Ugyfelek'); SQL.Add('WHERE'); SQL.Add(' (CEG_AZON = :Ceg_Azonosito)'); SQL.Add('ORDER BY Nev'); ParamByName('Ceg_Azonosito').AsString := Ceg_Azonosito; Open; end; end // Ha nincs Ügyfélnév beírva, de ki van választva egy cég, valamint True az e-mail cím else begin // Megszűri a cégazonosító, és az e-mail cím alapján az Ügyfeleket with DM.Ugyfelek do begin Close; SQL.Clear; SQL.Add('SELECT *'); SQL.Add('FROM Ugyfelek'); SQL.Add('WHERE'); SQL.Add(' (CEG_AZON = :Ceg_Azonosito) AND (MAILCIM <> ''-'')'); SQL.Add('ORDER BY Nev'); ParamByName('Ceg_Azonosito').AsString := Ceg_Azonosito; Open; end; end; end // Ha be van írva Ügyfélnév else begin // Ha be van írva Ügyfélnév, és az összes cég ki van választva if (CegNeve.Text = '--== Összes cég ==--') then begin // Ha be van írva Ügyfélnév, és az összes cég ki van választva, valamint False az e-mail cím if (MailCim.Checked = False) then begin // Megszűrjük az ügyfélnév alapján a táblát with DM.Ugyfelek do begin Close; SQL.Clear; SQL.Add('SELECT *'); SQL.Add('FROM Ugyfelek'); SQL.Add('WHERE NEV LIKE :nev'); SQL.Add('ORDER BY Nev'); ParamByName('nev').AsString := UgyfelNeve.Text + '%'; Open; end; end // Ha be van írva Ügyfélnév, és az összes cég ki van választva, valamint True az e-mail cím else begin // Megszűri az ügyfélnév, és az E-mail cím alapján az Ügyfeleket with DM.Ugyfelek do begin Close; SQL.Clear; SQL.Add('SELECT *'); SQL.Add('FROM Ugyfelek'); SQL.Add('WHERE (NEV LIKE :nev) AND (MAILCIM <> ''-'')'); SQL.Add('ORDER BY Nev'); ParamByName('nev').AsString := UgyfelNeve.Text + '%'; Open; end; end; end // Ha be van írva Ügyfélnév, és cég is ki van választva else begin // Ha be van írva Ügyfélnév, és cég is ki van választva, valamint False az e-mail cím if (MailCim.Checked = False) then begin // Megszűrjük az Ügyfeleket név, és Cégazonosító alapján with DM.Ugyfelek do begin Close; SQL.Clear; SQL.Add('SELECT *'); SQL.Add('FROM Ugyfelek'); SQL.Add('WHERE'); SQL.Add(' (CEG_AZON = :Ceg_Azonosito) AND'); SQL.Add(' (NEV LIKE :Nev)'); SQL.Add('ORDER BY Nev'); ParamByName('Ceg_Azonosito').AsString := Ceg_Azonosito; ParamByName('Nev').AsString := UgyfelNeve.Text + '%'; Open; end; end // Ha be van írva Ügyfélnév, és cég is ki van választva, valamint True az e-mail cím else begin // Megszűrjük az ügyfélnév, a cégazonosító, és az e-mail cím alapján az Ügyfeleket with DM.Ugyfelek do begin Close; SQL.Clear; SQL.Add('SELECT *'); SQL.Add('FROM Ugyfelek'); SQL.Add('WHERE'); SQL.Add(' (CEG_AZON = :Ceg_Azonosito) AND'); SQL.Add(' (NEV LIKE :Nev) AND'); SQL.Add(' (MAILCIM <> ''-'')'); SQL.Add('ORDER BY Nev'); ParamByName('Ceg_Azonosito').AsString := Ceg_Azonosito; ParamByName('Nev').AsString := UgyfelNeve.Text + '%'; Open; end; end; end; end;

    Na de ennél csak 3 vezérlő van, amit figyelni kell, és ilyen hosszú a kód.....
    Mutasd a teljes hozzászólást!
  • Az a a bajod, hogy ami egyforma (Mindig select * from ugyfelek-el kezdesz, ott van az open, a close, sql.clear, params.clear stb...) azt nem vonod össze.

    pl.:
    With Query1 Do Begin Close; Sql.Clear; Sql.Add('Select * From Tabla Where'); If NevAlapjanKereses Then Sql.Add('Nev='Kis Pista'); If KobcentiIsKell Then Sql.Add('Kobcenti=167898923'); If ZoldKartyaDatum Then Sql.Add('Datum Between 2569-12-30 And 2698-0101'); End;

    Ha csak ezt megcsinálod, máris fele ekkora lesz a kód.

    Természetesen a paramétereket, nem volt kedvem bepötyögni, azzal szórakozz te.

    És mégeccer, ezt a problémát másképpen nem fogod tudni megoldani, vagy visszább kell venni az igényekből...
    Mutasd a teljes hozzászólást!
  • Köszi Srácok!
    Bizony, zsoltr1, gyorsabb voltál, mint Micu!
    Ezért ott a pont!

    Köszi mégegyszer!
    Mutasd a teljes hozzászólást!
  • Hehe gyorsabb voltam Micunál

    Legyek ünneprontó?

    1. Én még nem használtam Delphit-t.

    2. Szerintem a hálózatod a gyorsabb:

    Micu hozzászólása 2007.01.13. 11:11
    zsoltr1 hozzászólása 2007.01.13. 11:11

    3. Remélem nem ez a legnagyobb örömöd

    Mutasd a teljes hozzászólást!
  • 1. Hm...akkor hogyhogy ennyire vágod?
    Mutasd a teljes hozzászólást!
  • Nézd már meg a pontjait légyszi...
    Mutasd a teljes hozzászólást!
  • Nem, nem ez a legnagyobb örömöm. (A két pici lányom a legnagyobb örömöm)
    Mutasd a teljes hozzászólást!
  • Micu anyukájának a hasában ,már programozott De nem tartom kizárt dolognak, hogy már az apukájában elkezdte
    Mutasd a teljes hozzászólást!
  • Helyes! Tökéletes hozzáállás
    Mutasd a teljes hozzászólást!

  • Tehát egy Isten!
    Mutasd a teljes hozzászólást!
  • Á, csak kb. 11 éves koromba (1976) tűztem ki magamnak célként (Aztán még vagy 3 évig nem, mert csak utána lett egy ZX-81-em.)
    Azóta már volt időm pár programnyelvet túléni.
    Mutasd a teljes hozzászólást!
  • Jézus ereje, én akkor voltam 1 éves (1976)
    Mutasd a teljes hozzászólást!
  • Ilyen az élet
    Akkoriban is kellett születni jó fejeknek. Képzeld el, ha minden számítástechnikához értő egyszerre születik
    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