Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Checkbox - Problem mit der Reihenfolge (https://www.delphipraxis.net/107727-checkbox-problem-mit-der-reihenfolge.html)

Delphi Code Anfänger 1. Feb 2008 10:43

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:
sText := sText + 'wert LIKE ' + QuotedStr('%' + Boxes[i].Name + '%') + ' AND ';
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".

Klar hab ich mir gedacht ich weiß ja woran es liegt. Es liegt hier dran
Delphi-Quellcode:
'%' + Boxes[i].Name + '%'
So habe ich mir mal wieder gedacht machst du die einfach weg. Gesagt getan.

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?

DeddyH 1. Feb 2008 10:47

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)?

Delphi Code Anfänger 1. Feb 2008 10:55

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.

DeddyH 1. Feb 2008 11:06

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.

marabu 1. Feb 2008 11:10

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

Delphi Code Anfänger 1. Feb 2008 11:20

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?

stahli 1. Feb 2008 13:03

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

marabu 1. Feb 2008 13:30

Re: Checkbox - Problem mit der Reihenfolge
 
Hier die gewünschte Erklärung in Code-Form:

Delphi-Quellcode:
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;
Getippt und nicht getestet.

Delphi Code Anfänger 1. Feb 2008 15:55

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:
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;
So habe ich das jetzt gemacht:

Delphi-Quellcode:
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;
Hm ich glaube da habe ich einen kompletten Denkfehler drinn.

Ich glaube das geht so gar nicht.

Sorry ich hätte schon am Anfang den ganzen Code schreiben sollen. :oops:

marabu 1. Feb 2008 20:02

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:
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;
Gute Nacht


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:05 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz