[Delphi/ZEOS] Filter werkt niet goed

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 10-09 14:45
Ik heb iets geks.
Voor een project waar ik met m'n buurman aan hobby gebruiken we Delphi 2010 (nieuw voor mij, ik ben C# slet) + SQLite (dmv ZEOS).

Nu hebben we een mooie ranzige query (of naja, deel van) voor de filtering, en daar gaat iets mis.

Onderstaande code werkt, behalve dat je dus niet kan filteren op huisnummer:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
    AdressenTable.FilterOptions:= [foCaseInsensitive];
    filterQuery := 'Naam     LIKE ' + QuotedStr('*' + ZoekEdit.Text + '*') +
               ' OR Straat   LIKE ' + QuotedStr('*' + ZoekEdit.Text + '*') +
//               ' OR Nummer   LIKE ' + QuotedStr('*' + ZoekEdit.Text + '*') +
               ' OR Postcode LIKE ' + QuotedStr('*' + ZoekEdit.Text + '*') +
               ' OR Plaats   LIKE ' + QuotedStr('*' + ZoekEdit.Text + '*') +
               ' OR Telefoon LIKE ' + QuotedStr('*' + ZoekEdit.Text + '*') +
               ' OR Mobiel   LIKE ' + QuotedStr('*' + ZoekEdit.Text + '*') +
               ' OR Email    LIKE ' + QuotedStr('*' + ZoekEdit.Text + '*') +
               ' OR URL      LIKE ' + QuotedStr('*' + ZoekEdit.Text + '*') +
               '';
    AdressenTable.Filter := filterQuery;
    AdressenTable.Filtered := true;


Zodra ik de comment tags voor het nummer veld weghaal, matched ie compleet random lijkt het, je kan zoeken op wat je wil, je krijgt de meest wazige resultaten, zelfs als je zoekt op 'hatseflatsbladiebla' wat toch echt nergens in de tabel voorkomt, krijg je resultaten :+.

Alle velden in de achterliggende database zijn VARCHAR velden, meeste met 22 tekens, Nummer veld heeft 5 tekens.

Iemand een idee? :P Ik heb een paar uur Google misbruikt, maar kom daar niks relevants tegen (of ik zoek scheel).

Acties:
  • 0 Henk 'm!

  • Solopher
  • Registratie: December 2002
  • Laatst online: 11-09 14:55
Nu heb ik geen ervaring met Delphi of ZEOS maar weet je zeker dat je * geen % moet zijn?

Ik kwam overigens ook deze post tegen:
http://lazarus.freepascal.org/index.php?topic=8565.0

Misschien dat hierin een oplossing staat?

Acties:
  • 0 Henk 'm!

  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 10-09 14:45
Helaas, dat was ook mijn eerste gedachte, maar na enig zoekwerk blijkt dit via ZEOS toch echt met een * te zijn ipv een % (zie ook http://forum.lazarus.freepascal.org/index.php?topic=6267.0 ).

De andere pagina gaat meer over lowercase/uppercase voor zover ik kan zien. :)

Acties:
  • 0 Henk 'm!

  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 10-09 14:45
Klein duwtje omhoog, iemand een idee? :-)

Acties:
  • 0 Henk 'm!

  • Z-Dragon
  • Registratie: December 2002
  • Laatst online: 01:12
Wat gebeurt er als je al het andere uitschakelt en alleen zoeken op nummer mogelijk maakt? Laat ook de speciale FilterOptions eens weg. Zet er eens een nummer hardcoded in; maakt dat uit?

Het eerste resultaat m.b.t. zoeken in SQLite met ZEOS geeft me overigens een voorbeeld waar alleen aan het einde een '*' wordt toegevoegd, dus niet aan het begin.

^ Wat hij zegt.


Acties:
  • 0 Henk 'm!

  • Boss
  • Registratie: September 1999
  • Laatst online: 10:56

Boss

+1 Overgewaardeerd

Wat is het resultaat als je de opgebouwde query direct uitvoert op MySQL (via phpMyAdmin of andere MySQL admin tools)? Wellicht helpt dat om de uitkomst te debuggen.

Is Nummer ook een tekst-veld of een numeriek veld?

The process of preparing programs for a digital computer is especially attractive, not only because it can be economically and scientifically rewarding, but also because it is an aesthetic experience much like composing poetry or music.


Acties:
  • 0 Henk 'm!

  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 10-09 14:45
Z-Dragon schreef op woensdag 08 februari 2012 @ 17:40:
Wat gebeurt er als je al het andere uitschakelt en alleen zoeken op nummer mogelijk maakt? Laat ook de speciale FilterOptions eens weg. Zet er eens een nummer hardcoded in; maakt dat uit?

Het eerste resultaat m.b.t. zoeken in SQLite met ZEOS geeft me overigens een voorbeeld waar alleen aan het einde een '*' wordt toegevoegd, dus niet aan het begin.
Alleen zoeken op nummer zal ik even moeten testen, de filteroptions is alleen voor case sensitive wel of niet, dit heeft verder geen invloed.
Hardcoded nummer werkt niet, aangezien het tekst moet zijn. Nummer tussen quotes kan ik even testen, maar daar zit het probleem niet. Zoeken op nummers gaat goed, het is juist dat ze gek genoeg lijken te matchen op tekst. :P

Wat de plaats van die * betreft, dat wil zeggen hoe je wildcard werkt.

Bijv je hebt een tabel met:

hihahoi
hoi
hahi
hih

Dan vind je met hi* dus hihahoi + hih, maar met *hi* ook hahi. Met *hi zou je alleen hahi vinden.
Boss schreef op woensdag 08 februari 2012 @ 19:11:
Wat is het resultaat als je de opgebouwde query direct uitvoert op MySQL (via phpMyAdmin of andere MySQL admin tools)? Wellicht helpt dat om de uitkomst te debuggen.

Is Nummer ook een tekst-veld of een numeriek veld?
Het is geen MySQL maar SQLite, maar ik zal inderdaad een soort gelijke query eens direct in de db testen.
Het is ook een tekstveld zoals aangegeven in de OP, VARCHAR(5) in dit geval.

Acties:
  • 0 Henk 'm!

  • Z-Dragon
  • Registratie: December 2002
  • Laatst online: 01:12
Noxious schreef op woensdag 08 februari 2012 @ 20:56:
[...]

Alleen zoeken op nummer zal ik even moeten testen, de filteroptions is alleen voor case sensitive wel of niet, dit heeft verder geen invloed.
Mijn punt is dat je het hele mechanisme tijdelijk zo veel mogelijk moet versimpelen. Ook iets schijnbaar irrelevants als hoofdletterongevoeligheid moet dan even wijken. Zelfs de interactie met een String van buitenaf is een mogelijkheid voor problemen, hoe klein ook. Het liefst zou ik beginnen met iets zo simpel als dit:
code:
1
2
AdressenTable.Filter := 'Nummer LIKE ' + QuotedStr('12345'); 
AdressenTable.Filtered := true;
Als dat al niet juist werkt, weet je dat je op een heel ander niveau moet gaan zoeken. Als het wel werkt, kun je langzaam uit gaan bouwen. Een wildcard opnemen. Nog een wildcard opnemen. Een tweede veld opnemen. Net zo lang tot je ziet dat het misgaat. Van daaruit weer zo veel mogelijk eerder toegevoegde elementen wegnemen en zien of het probleem toch blijft. Bijvoorbeeld het tweede veld laten, maar een wildcard eruit. Uiteindelijk heb je de minimale condities voor het probleem.

Neem ook deze pagina nog even goed door. Het lijkt erop dat je % moet gebruiken met LIKE en * met GLOB. Er staat ook wat afwijkend gedrag beschreven.

[ Voor 11% gewijzigd door Z-Dragon op 08-02-2012 22:57 ]

^ Wat hij zegt.


Acties:
  • 0 Henk 'm!

  • Noxious
  • Registratie: Juli 2002
  • Laatst online: 10-09 14:45
Kleine update:

Alles is getest en meer, het blijkt een bug te zijn in ZEOS 7.0.0 (beta).

Zie ook: http://zeos.firmos.at/viewtopic.php?t=3414 daar staan ook screenshots en een project download. :)

Oh en, * en % verhaal van SQLite is niet van toepassing hier, daar het door ZEOS heen gaat.

[ Voor 19% gewijzigd door Noxious op 08-02-2012 23:35 ]

Pagina: 1