Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Problem mit checkboxen (https://www.delphipraxis.net/100555-problem-mit-checkboxen.html)

Jack23 30. Sep 2007 11:24

Datenbank: Access • Version: 2003 • Zugriff über: ADO

Problem mit checkboxen
 
Hallo

Ich möchte über ein paar checkboxen eine Datenbank abfrage machen.

Ich versuche es mal zu erklären.

Die Tabelle sieht so aus:

name datum text
test 24.7.67 1,2,3,4
test2 12.7.98 1,2,3
test3 32.7.45 1

Nun habe ich verschiedene checkboxen. Anzahl ist egal.
Beispiel checkbox:

checkbox 1 wert: 1
checkbox 2 wert: 2
checkbox 3 wert: 3
checkbox 4 wert: 4

Nehmen wir jetzt mal an checkbox 1,2,3 wären angekreuzt. Dann drücken ich unten auf den Button suchen und werden die Datensätze in einem dbgrid ausgeben die den text 1,2,3 haben(das können durchaus mehrere sein). Nicht die anderen obwohl die auch die werte teilweise haben.

Noch ein Beispiel:
Alle Chekcboxen(1,2,3,4) sind ausgewählt.
Dann müsste dieser Datensatz ausgegeben werden:
test 24.7.67 1,2,3,4

Natürlich können auch dies wieder mehrere sein.

Wie fange ich das am besten an?

Ich hoffe ich konnte das Problem verständlich rüberbringen.

DeddyH 30. Sep 2007 11:55

Re: Problem mit checkboxen
 
Mir scheint, Deine DB ist nicht normalisiert. Selbst, wenn man nun ad hoc eine Lösung zu diesem konkreten Problem findet, wird es nicht lange dauern, bis das nächste Problem auftritt.

marabu 30. Sep 2007 11:56

Re: Problem mit checkboxen
 
Hi,

wenn du kannst, dann ändere die Speicherung der CheckBox-Zustände von TEXT auf INTEGER und speichere die Zustände als Bit-Vektor. Wenn du über deine CheckBoxen iterierst, dann könntest du im Tag-Property der CheckBox die BitPosition angeben und so deinen Bit-Vektor in einer Variable vom Typ Cardinal (oder Word oder Byte) per SHL zusammenschieben.

Grüße vom marabu

Jack23 30. Sep 2007 12:02

Re: Problem mit checkboxen
 
Zitat:

Zitat von DeddyH
Mir scheint, Deine DB ist nicht normalisiert. Selbst, wenn man nun ad hoc eine Lösung zu diesem konkreten Problem findet, wird es nicht lange dauern, bis das nächste Problem auftritt.

Was meinst du damit? Läuft doch alles.


Zitat:

Zitat von marabu
Hi,

wenn du kannst, dann ändere die Speicherung der CheckBox-Zustände von TEXT auf INTEGER und speichere die Zustände als Bit-Vektor. Wenn du über deine CheckBoxen iterierst, dann könntest du im Tag-Property der CheckBox die BitPosition angeben und so deinen Bit-Vektor in einer Variable vom Typ Cardinal (oder Word oder Byte) per SHL zusammenschieben.

Grüße vom marabu

Verstehe leider kein Wort. :pale: Ich möchte doch nur ein DB Abfrage in der die Checkboxen berücksichtigt werden.

DeddyH 30. Sep 2007 12:08

Re: Problem mit checkboxen
 
Zitat:

Zitat von Jack23
test 24.7.67 1,2,3,4

Hier sollen mehrere Werte in einem Tabellenfeld gespeichert werden (wenn ich das richtig verstanden habe). Das ist schlechtes DB-Design, wie Du gerade selbst feststellst. Schau mal z.B. bei Wikipedia nach dem Begriff "Normalisierung", dann wirst Du sehen, dass Du 2 weitere Tabellen brauchen wirst, um Dein Modell "sauber" abzubilden. Eine andere Möglichkeit wäre, wie von marabu angesprochen, die Daten als Zahl abzuspeichern (genauer: als Bitmaske), sofern es nicht mehr als 32 bzw. 64 Möglichkeiten gibt. Durch Binärvergleiche könntest Du Dein Ziel dann auch erreichen. Ich verweise dazu mal wieder auf mein Tutorial.

Jack23 30. Sep 2007 12:11

Re: Problem mit checkboxen
 
sorry da habe ich wohl etwas falsch erklärt. Das sollen eigentlich nur Wörter sein. Keine zahlen.

statt 1 hallo und so weiter war nur ein beispiel.

DeddyH 30. Sep 2007 12:15

Re: Problem mit checkboxen
 
Also in etwa so?
Zitat:

test 24.7.67 "Dies ist ein Text"
Und die Checkboxen haben dann den "Wert" Dies, ist, etc.?

Jack23 30. Sep 2007 12:27

Re: Problem mit checkboxen
 
Ja genau so.

test 24.7.67 "Dies ist ein Text" dann hat checkbox 1 den wert "dies" u.s.w. Wenn man nur checkbox 1 ausgewählt hat dürfte nur der datensatz wenn vorhanden:
test 24.7.67 "Dies" ich hoffe das ist jetzt klar.

DeddyH 30. Sep 2007 12:42

Re: Problem mit checkboxen
 
Hmm... obwohl ich Dein Konzept nicht verstanden habe, hier eine Möglichkeit:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var Boxes: array[0..3] of TCheckbox; //Array definieren
    sText: string;
    i: integer;
begin
  //Array belegen
  Boxes[0] := CheckBox1;
  Boxes[1] := CheckBox2;
  Boxes[2] := CheckBox3;
  Boxes[3] := CheckBox4;
  //String initialisieren
  sText := '';
  //Anhand des Zustandes String zusammenbauen mit Leerzeichen als Trenner
  for i := Low(Boxes) to High(Boxes) do
    if Boxes[i].Checked then
      sText := sText + Boxes[i].Caption + #32;
  //letztes Leerzeichen löschen
  if Length(sText) > 0 then
    Delete(sText,Length(sText),1);
  //nur zum Testen, ggf. in SQL-Statement einfügen
  ShowMessage(sText);
end;

Jack23 30. Sep 2007 12:48

Re: Problem mit checkboxen
 
Ok danke das hilft mir schon mal sehr viel weiter. Nur wie bekomme ich das dann aus der Datenbank abgefragt? Und welche Checkbox muss ich dazu nehmen?

DeddyH 30. Sep 2007 12:52

Re: Problem mit checkboxen
 
Zitat:

Zitat von Jack23
Nur wie bekomme ich das dann aus der Datenbank abgefragt?

Mittels einer Query-Komponente, der Du das SQL zuweist:
Delphi-Quellcode:
with Query do
  begin
    Close;
    SQL.Text := 'SELECT * FROM Tabelle WHERE text=:text';
    ParamByName('text').AsString := sText;
    Open;
  end;

Jack23 30. Sep 2007 12:53

Re: Problem mit checkboxen
 
Sorry aber ich verstehe das ganze noch nicht. Wo muss denn die
Delphi-Quellcode:
with Query do
  begin
    Close;
    SQL.Text := 'SELECT * FROM Tabelle WHERE text=:text';
    ParamByName('text').AsString := sText;
    Open;
  end;
hin?

DeddyH 30. Sep 2007 13:04

Re: Problem mit checkboxen
 
Anstelle des ShowMessage. Dabei bin ich davon ausgegangen, dass die Query auch "Query" heißt.

Jack23 30. Sep 2007 13:10

Re: Problem mit checkboxen
 
Meinst du das so?
Delphi-Quellcode:
var Boxes: array[0..3] of TCheckbox; //Array definieren
    sText: string;
    i: integer;
begin
  //Array belegen
  Boxes[0] := CheckBox1;
  Boxes[1] := CheckBox2;
  Boxes[2] := CheckBox3;
  Boxes[3] := CheckBox4;
  //String initialisieren
  sText := '';
  //Anhand des Zustandes String zusammenbauen mit Leerzeichen als Trenner
  for i := Low(Boxes) to High(Boxes) do
    if Boxes[i].Checked then
      sText := sText + Boxes[i].Caption + #32;
  //letztes Leerzeichen löschen
  if Length(sText) > 0 then
    Delete(sText,Length(sText),1);
  //nur zum Testen, ggf. in SQL-Statement einfügen
  with Query do
  begin
    Close;
    SQL.Text := 'SELECT * FROM tabellea WHERE text=:text';
    ParamByName('text').AsString := sText;
    Open;
  end;
  end;

Dann sagt er aber Undefinierter Bezeichner: 'ParamByName'

DeddyH 30. Sep 2007 13:11

Re: Problem mit checkboxen
 
Du hast aber eine TQuery auf der Form?

Jack23 30. Sep 2007 13:12

Re: Problem mit checkboxen
 
Eine ADO Query. Die heißt Query.

DeddyH 30. Sep 2007 13:18

Re: Problem mit checkboxen
 
Da geht das etwas anders.
Delphi-Quellcode:
  with Query do
  begin
    Close;
    SQL.Text := 'SELECT * FROM tabellea WHERE text=:text';
    Parameters.ParamByName('text').DataType := ftString;
    Parameters.ParamByName('text').Value := sText;
    Open;
  end;

Jack23 30. Sep 2007 13:22

Re: Problem mit checkboxen
 
Ah ok danke. Nur eine Frage noch. Wo kann ich den Wert für die ckeckboxen definieren.

Weil wenn ich das jetzt test kommt die Meldung: Für mindestens einen erforderlichen Parameter wurde kein Wert angegeben.

DeddyH 30. Sep 2007 13:24

Re: Problem mit checkboxen
 
Liste der Anhänge anzeigen (Anzahl: 1)
In meinem Beispiel habe ich die Werte einfach in die Caption geschrieben (siehe Anhang).

Jack23 30. Sep 2007 13:29

Re: Problem mit checkboxen
 
Hm geht leider nicht ich bekomme immer noch die gleiche Meldung wie oben beschrieben.

DeddyH 30. Sep 2007 13:32

Re: Problem mit checkboxen
 
Dann anders:
Delphi-Quellcode:
with Query do
  begin
    Close;
    SQL.Text := 'SELECT * FROM tabellea WHERE text=' + QuotedStr(sText);
    Open;
  end;

Jack23 30. Sep 2007 13:35

Re: Problem mit checkboxen
 
Ah ok. Danke das klappt. Nur noch eine letzt frage. Wie bekomme ich die Ausgabe in einem dbgrid dargestellt?

Jack23 30. Sep 2007 13:38

Re: Problem mit checkboxen
 
Problem gelöst. Mit Hilfe einer DataSource. Danke für deine Hilfe!


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:12 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-2025 by Thomas Breitkreuz