00 Stimmen

ObjectPascal: Filtern und Sortieren von Feldwerten einer Datenbank

Frage von Muschelknacker | 29.12.2020 um 19:03

Guten Abend,

ich habe einen Filter für eine Datenmenge erstellt wie folgt:

procedure TfilterForm.filterTextBoxChange(Sender: TObject);
var
  strSQL: String;
  ascSQL: String;
begin
  ascSQL:='SELECT * FROM lager ORDER BY Durchmesser ASC';
  
  case filterForm.filterComboBox.ItemIndex of
  0: if filterTextBox.Text='' then begin
        strSQL:= ascSQL;
     end else begin
        strSQL:= 'SELECT * FROM lager WHERE Gegenstand = ' + QuotedStr(filterTextBox.Text) + 'ORDER BY Durchmesser ASC';
     end;
  1: if filterTextBox.Text='' then begin
        strSQL:=ascSQL;
     end else begin
        strSQL:= 'SELECT * FROM lager WHERE Durchmesser = ' + filterTextBox.Text + 'ORDER BY NR ASC'; // Fehler
     end;
  2: if filterTextBox.Text ='' then
     begin
        strSQL:= ascSQL;
     end else begin
        strSQL:= 'SELECT * FROM lager WHERE NR = ' + filterTextBox.Text + 'ORDER BY Durchmesser ASC'; // Fehler
     end;
  3: if filterTextBox.Text ='' then
     begin
        strSQL:= ascSQL;
     end else begin
        strSQL:= 'SELECT * FROM lager WHERE Segmenttyp = ' + QuotedStr(filterTextBox.Text) + 'ORDER BY Durchmesser ASC';
     end;
  4: if filterTextBox.Text ='' then begin
        strSQL:= ascSQL;
     end else begin
        strSQL:= 'SELECT * FROM lager WHERE Ort = ' + QuotedStr(filterTextBox.Text) + ' ORDER BY Durchmesser ASC';
     end;
  5: if filterTextBox.Text ='' then begin
        strSQL:= ascSQL;
     end else begin
        strSQL:= 'SELECT * FROM lager WHERE Fahrer = ' + QuotedStr(filterTextBox.Text) + ' ORDER BY Durchmesser ASC';
     end;
  6: if filterTextBox.Text ='' then begin
        strSQL:= ascSQL;
     end else begin
        strSQL:= 'SELECT * FROM lager WHERE Erstellt = ' + QuotedStr(filterTextBox.Text) + 'ORDER BY Durchmesser ASC';
     end;
  7: if filterTextBox.Text ='' then begin
        strSQL:= ascSQL;
     end else begin
        strSQL:= 'SELECT * FROM lager WHERE Bearbeitet = ' + QuotedStr(filterTextBox.Text) + 'ORDER BY Durchmesser ASC';
     end;
  8: if filterTextBox.Text ='' then begin
        strSQL:= ascSQL;
     end  else begin
        strSQL:= 'SELECT * FROM lager WHERE NeuBelegt = ' + QuotedStr(filterTextBox.Text) + 'ORDER BY Durchmesser ASC';
     end;
  end;

  Form1.bestandQuery.Close;

  try
    Form1.bestandQuery.SQL.Clear;
    Form1.bestandQuery.SQL.Text:= strSQL;
    Form1.bestandQuery.Open;
  except
  end;

  Form1.bestandQuery.SQL.Clear;
  Form1.bestandQuery.SQL.Text:=ascSQL;
  Form1.bestandQuery.Open;
  Form1.RxDBGrid1.Refresh;
end;

Das Ergebnis sieht auszugsweise so aus :

Durchmesser NR
------------------------------
90          4
90          1
90          3
90          2     

Für den Anwender wäre es jetzt schön, wenn die Spalte 'NR' sortiert dargestellt werden würde.

Hier gibt es eine Fehlermeldung.

SQLite3Connection1: unrecognized token:"3ORDER"

Ich denke dass mein SQL-String falsch ist.

Kann da mal bitte jemand nachhelfen ??

MfG Danke...........

AntwortenPositivNegativDatumStimmen
Avatar
11 Stimme

Wieso schreibst du in jedem Fall "QuotedStr(filterTextBox.Text)" aber in dem Fall, wo die Fehler auftreten nicht? Da schreibst du nur "filterTextBox.Text".

Kann es vielleicht daran liegen?
29.12.2020 um 19:57

AntwortenPositiv Negativ
Avatar
00 Stimmen

Guten Tag, Gast,

von vielen Experten wird immer angemahnt, durchsucht erstmal das Internet, was ich auch immer tue.

Und da stand das eine oder andere mal, dass Integer-Werte nicht "gequoted" werden.

Soeben habe ich die beiden Positionen doch mal "gequoted", und siehe da, es klappt.

Danke dir, Gast...................
30.12.2020 um 13:42

AntwortenPositiv Negativ
Avatar
11 Stimme

Das ist normalerweise auch richtig, man muss nicht schreiben SELECT * FROM tab WHERE id = '1'. WHERE id = 1 ist vollkommen ausreichend.

Dennoch weiß ich jetzt natürlich nicht was das für Daten sind und wenn es Daten einer Benutzereingabe sind sollte man diese in jedem Fall vor der Verwendung testen und nicht einfach so übernehmen. Dann ist kein Verlass darauf, dass es wirklich nur eine Integer-Zahl ist, die da eingegeben oder übergeben wurde.
30.12.2020 um 14:17

AntwortenPositiv Negativ
Avatar
00 Stimmen

Ja, es handelt sich hier um eine Benutzereingabe.

Ich verwende die Eigenschaft "NumbersOnly" eines TEdit um an den Positionen Durchmesser und NR nur Integer-Werte zuzulassen.
30.12.2020 um 15:05

AntwortenPositiv Negativ
Antworten

Ähnliche Themen

Wichtiger Hinweis

Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.

Jetzt mitmachen

Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.