![]() |
Datenbank: Access • Zugriff über: ADO
Checkbox - Problem mit der Reihenfolge
Hallo
Ich habe vier Checkboxen. Checkbox 1 = wert1 2 = wert2 3 = wert3 4 = wert4 Die kann ich anklicken und dann auf einen Button "Weiter" klicken. So dann auf der nächsten Form werden die Daten angezeigt. Bis jetzt habe ich das immer so gelöst:
Delphi-Quellcode:
So nun ist mir aufgefallen das wenn in der DB in einer Zeile "wert1 wert2" steht sucht er trotzdem alle Datensätze raus wo es auch so stehen kann "wert1 wert2 wert3 wert4".
sText := sText + 'wert LIKE ' + QuotedStr('%' + Boxes[i].Name + '%') + ' AND ';
Klar hab ich mir gedacht ich weiß ja woran es liegt. Es liegt hier dran
Delphi-Quellcode:
So habe ich mir mal wieder gedacht machst du die einfach weg. Gesagt getan.
'%' + Boxes[i].Name + '%'
Klappt auch. Ein wenig getestet und festgestellt: er findet die Datensätze jetzt nicht mehr wenn die Reihenfolge anders ist. Also z.B Checkbox 1 und 2 sind angeklickt = steht dann in der Datenbank "wert2 wert1" findet er die nicht mehr. Weil ja kein % mehr davor steht. So nun zum Problem. Wie bekomme ich es hin das die Reihenfolge wieder egal ist aber er dafür er auch nur das gesuchte findet? |
Re: Checkbox - Problem mit der Reihenfolge
Das ist mir etwas zu wirr beschrieben. Wie sieht denn die Tabelle in der DB aus (evtl. mal ein paar Beispieldatensätze)?
|
Re: Checkbox - Problem mit der Reihenfolge
Ok kommt sofort!
NAME WERT Test1 wert1 wert2 Test2 wert3 wert4 Test3 wert2 wert4 Test4 wert2 wert1 Und wenn die Werte nicht in Reihenfolge z.B wie bei Test4 findet er sie nicht mehr. |
Re: Checkbox - Problem mit der Reihenfolge
Deine DB ist nicht normalisiert, aber das nur am Rande. Heißen die Checkboxen "Checkbox1" bis "Checkbox4"? Wenn ja, dann kannst Du den String über eine Schleife mit FindComponent generieren.
|
Re: Checkbox - Problem mit der Reihenfolge
Hallo,
abgesehen von den Entwurfssünden lässt sich das Problem eigentlich nur so lösen, dass das Feld Wert auf die einzelnen Literale hin untersucht wird und mehrere Tests mit AND verknüpft werden. Solange kein Literal als Substring eines anderen auftritt, kann auf einen obligatorischen Delimiter verzichtet werden, ansonsten muss auch am Anfang und am Ende von wert ein Delimiter (Leerzeichen) stehen. Grüße vom marabu |
Re: Checkbox - Problem mit der Reihenfolge
@Deddy
nein die heißen alle anders. Und es sind auch ein wenig mehr als 4. @marabu Dein Vorschlag gefällt mir. Kannst du da noch mal genauer erklären oder eventuell wenn es nicht so viel Mühe macht ein Beispiel posten? |
Re: Checkbox - Problem mit der Reihenfolge
Hallo DelphiCodeAnfänger,
vielleicht kannst Du Deine Werte VOR dem Schreiben in die Datenbank und vor dem Suchen in eine eindeutige Struktur bringen. Das könnte eine Funktion übernehmen, die Du jeweils vor dem Speichern und Suchen in der Datenbank benutzt: Wert1 + Wert3 + Wert4 -> "x xx" Wert4 + Wert1 + Wert3 -> "x xx" Wert4 + Wert1 -> "x x" -ODER- Wert1 + Wert3 + Wert4 -> "Wert1+Wert3+Wert4" Wert4 + Wert1 + Wert3 -> "Wert1+Wert3+Wert4" Wert4 + Wert1 -> "Wert1+Wert4" Die ersten beiden Fälle würden dann als identisch bewertet. stahli |
Re: Checkbox - Problem mit der Reihenfolge
Hier die gewünschte Erklärung in Code-Form:
Delphi-Quellcode:
Getippt und nicht getestet.
var
s: TStrings begin // ... for i := 0 to Pred(MAX_BOXES) do s.Add(Format('%s wert %s LIKE %s', [ IfThen(s.Count = 1, ' AND'), IfThen(not Boxes[i].Checked, 'NOT'), QuotedStr('%' + Boxes[i].Name + '%') ])); sText := sText + s.Text; s.Free; // ... end; |
Re: Checkbox - Problem mit der Reihenfolge
Danke! :spin2:
Ich habe nur ein Problem. :oops: Ich kann den Code nicht in meinen einbauen. Ich weiß nicht so recht wie ich das umbauen soll. Die Codestelle die ich benutze habe ich irgendwo aus diesem Forum. Weiß leider nicht mehr genau woher. Das ist der Code:
Delphi-Quellcode:
So habe ich das jetzt gemacht:
procedure TForm1.Button1Click(Sender: TObject);
const InitialText = 'SELECT * FROM tabelle WHERE '; var Boxes: array[0..20] of TCheckbox; sText: string; i: integer; s: TStrings // hier habe ich es definiert begin Boxes[0] := wert1; Boxes[1] := wert2; Boxes[2] := wert3; Boxes[3] := wert4; ..... sText := InitialText; for i := Low(Boxes) to High(Boxes) do if Boxes[i].Checked then sText := sText + 'wert LIKE ' + QuotedStr('%' + Boxes[i].Name + '%') + ' AND '; if Length(sText) > Length(InitialText) then begin Delete(sText,Length(sText) - 4, Length(sText)); Query.SQL.Text := sText; Query.Open; end; end;
Delphi-Quellcode:
Hm ich glaube da habe ich einen kompletten Denkfehler drinn.
sText := InitialText;
for i := 0 to Pred(MAX_BOXES) do s.Add(Format('%s wert %s LIKE %s', [ IfThen(s.Count = 1, ' AND'), IfThen(not Boxes[i].Checked, 'NOT'), QuotedStr('%' + Boxes[i].Name + '%') ])); sText := sText + s.Text; s.Free; if Length(sText) > Length(InitialText) then begin Delete(sText,Length(sText) - 4, Length(sText)); Query.SQL.Text := sText; Query.Open; end; end; Ich glaube das geht so gar nicht. Sorry ich hätte schon am Anfang den ganzen Code schreiben sollen. :oops: |
Re: Checkbox - Problem mit der Reihenfolge
Hallo,
die von mir temporär benutzte StringList muss auch erzeugt werden. Ich würde die Änderungen am Code ungefähr so einbauen:
Delphi-Quellcode:
Gute Nacht
begin
// ... s := TStringList.Create; for i := 0 to Pred(MAX_BOXES) do s.Add(Format('%s wert %s LIKE %s', [ IfThen(s.Count = 1, ' AND'), IfThen(not Boxes[i].Checked, 'NOT'), QuotedStr('%' + Boxes[i].Name + '%') ])); sText := InitialText + s.Text; s.Free; Query.SQL.Text := sText; Query.Open; // ... end; |
Re: Checkbox - Problem mit der Reihenfolge
Hey Cool Danke!
Eine Frage habe ich noch. Was ist IfThen? Das muss ich doch auseinander schreiben oder? Wenn ich das dann mache stimnmt es mit den klammern nicht mehr. |
Re: Checkbox - Problem mit der Reihenfolge
Was sagt deine Delphi-Hilfe, wenn du IfThen über deren Index suchst?
|
Re: Checkbox - Problem mit der Reihenfolge
Also
erst kommt If dann die Bedingung then und ein Befehl. Aber was ist denn dann die Bedingung? |
Re: Checkbox - Problem mit der Reihenfolge
Zitat:
|
Re: Checkbox - Problem mit der Reihenfolge
Oh peinlicher Fehler meinerseits. Wird zusammen geschrieben. Gerade getestet. Da kommt diese Meldung:
E2003 Undefinierter Bezeichner: 'IfThen' Was muss ich denn da noch Definieren? |
Re: Checkbox - Problem mit der Reihenfolge
Schau mal, was da im Zitat unter "unit" steht.
|
Re: Checkbox - Problem mit der Reihenfolge
Oh ja habe ich nicht dran gedacht.
Bekomme jetzt aber diese Meldung: E2250 Es gibt keine überladene Version von 'IfThen', die man mit diesen Argumenten aufrufen kann |
Re: Checkbox - Problem mit der Reihenfolge
Du musst StrUtils einbinden, nicht Math!
|
Re: Checkbox - Problem mit der Reihenfolge
Oh ja daran lag es.
Jetzt kommt aber die Meldung: fehlender Operator im Abfrageausdruck. Habe die Stelle schon ausgemacht:
Delphi-Quellcode:
Aber für meine Augen fehlt da nichts. :shock:
s.Add(Format('%s wert %s LIKE %s', [
IfThen(s.Count = 1, 'AND'), IfThen(not Boxes[i].Checked, 'NOT'), QuotedStr('%' + Boxes[i].Name + '%') ])); |
Re: Checkbox - Problem mit der Reihenfolge
Versuch es mal so:
Delphi-Quellcode:
s.Add(Format('%s wert %s LIKE %s', [
IfThen(s.Count = 1, 'AND'), IfThen(not Boxes[i].Checked, 'NOT'), QuotedStr(Format('%%%s%%',[Boxes[i].Name])) ])); |
Re: Checkbox - Problem mit der Reihenfolge
An welcher Stelle genau wird der Fehler gemeldet?
Vielleicht steckt der Fehler in der Zeile davor? |
Re: Checkbox - Problem mit der Reihenfolge
Die Meldung kommt im Programm.
Ich drücke auf "Weiter" und dann kommt die Meldung: wert NOT LIKE '%Test1%' AND wert NOT LIKE '%Test2%' .... Die geht dann immer weiter. |
Re: Checkbox - Problem mit der Reihenfolge
Das Prozentzeichen, welches LIKE als Wildcard verwendet, wird auch von Format() interpretiert - mein Fehler.
Ändere das mal so ab:
Delphi-Quellcode:
Getippt und nicht getestet.
begin
// ... s.Add(Format('%s wert %s LIKE ', [ IfThen(s.Count = 1, 'AND'), IfThen(not Boxes[i].Checked, 'NOT') ]) + QuotedStr(Format('%%%s%%',[Boxes[i].Name])) ); |
Re: Checkbox - Problem mit der Reihenfolge
Gerade versucht. Kommt immer noch die gleiche Meldung.
|
Re: Checkbox - Problem mit der Reihenfolge
Lass Dir den resultierenden String (also das Statement) doch mal ausgeben bzw. abspeichern und versuche damit mal die DB-Abfrage. Funktioniert das?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz