Delphi-PRAXiS

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

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

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.

marabu 1. Feb 2008 20:28

Re: Checkbox - Problem mit der Reihenfolge
 
Was sagt deine Delphi-Hilfe, wenn du IfThen über deren Index suchst?

Delphi Code Anfänger 2. Feb 2008 09:58

Re: Checkbox - Problem mit der Reihenfolge
 
Also

erst kommt If
dann die Bedingung
then und ein Befehl.

Aber was ist denn dann die Bedingung?

DeddyH 2. Feb 2008 10:00

Re: Checkbox - Problem mit der Reihenfolge
 
Zitat:

Die Funktion gibt abhängig von einer Bedingung einen von zwei angegebenen Werten zurück.

Unit

Math oder StrUtils

Kategorie

Sonstige Routinen

Delphi-Syntax:

function IfThen(AValue: Boolean; const ATrue: Integer; const AFalse: Integer = 0): Integer; overload;

function IfThen(AValue: Boolean; const ATrue: Int64; const AFalse: Int64 = 0): Int64; overload;
function IfThen(AValue: Boolean; const ATrue: Double; const AFalse: Double = 0.0): Double; overload;
function IfThen(AValue: Boolean; const ATrue: string; const AFalse: string = ''): string; overload;

C++ Syntax:

extern PACKAGE int __fastcall IfThen(bool AValue, const int ATrue const int AFalse);
extern PACKAGE __int64 __fastcall IfThen(bool AValue, const __int64 ATrue const __int64 AFalse);
extern PACKAGE double __fastcall IfThen(bool AValue, const double ATrue const double AFalse);
extern PACKAGE AnsiString __fastcall IfThen(bool AValue, const AnsiString ATrue const AnsiString AFalse);

Beschreibung

IfThen überprüft den in AValue übergebenen Ausdruck und gibt AValue zurück, wenn die Auswertung true ergab. Ist die Auswertung false wird AFalse zurückgegeben. Wenn der Parameter AFalse weggelassen wird, gibt IfThen in Delphi 0 oder einen leeren String zurück, wenn die Auswertung von AValue False liefert.

Delphi Code Anfänger 2. Feb 2008 10:15

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?

DeddyH 2. Feb 2008 10:18

Re: Checkbox - Problem mit der Reihenfolge
 
Schau mal, was da im Zitat unter "unit" steht.

Delphi Code Anfänger 2. Feb 2008 11:48

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

marabu 2. Feb 2008 11:49

Re: Checkbox - Problem mit der Reihenfolge
 
Du musst StrUtils einbinden, nicht Math!

Delphi Code Anfänger 2. Feb 2008 13:07

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:
s.Add(Format('%s wert %s LIKE %s', [
      IfThen(s.Count = 1, 'AND'),
      IfThen(not Boxes[i].Checked, 'NOT'),
      QuotedStr('%' + Boxes[i].Name + '%')
    ]));
Aber für meine Augen fehlt da nichts. :shock:

DeddyH 2. Feb 2008 13:21

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]))
    ]));

marabu 2. Feb 2008 13:25

Re: Checkbox - Problem mit der Reihenfolge
 
An welcher Stelle genau wird der Fehler gemeldet?

Vielleicht steckt der Fehler in der Zeile davor?

Delphi Code Anfänger 2. Feb 2008 15:06

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.

marabu 2. Feb 2008 15:31

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:
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]))
  );
Getippt und nicht getestet.

Delphi Code Anfänger 2. Feb 2008 16:16

Re: Checkbox - Problem mit der Reihenfolge
 
Gerade versucht. Kommt immer noch die gleiche Meldung.

DeddyH 2. Feb 2008 16:49

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 19:07 Uhr.

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