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...........
Ähnliche Themen
MySQL: Zeilenumbrüche in MySQL
Tipp | 0 Kommentare
MySQL: Name einer Datenbank umbenennen
Tipp | 1 Kommentar
Quicksort: Zwei Spalten sortieren
Frage | 1 Antwort
PHP: Alle leeren Elemente aus String-Array entfernen
Tipp | 0 Kommentare
JavaScript: Array mit Zahlen sortieren
Tutorial | 0 Kommentare
MySQL: CSV Export als automatischer Download
Tutorial | 1 Kommentar
MySQL: Sortieren nach mehreren Spalten
Frage | 1 Antwort
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.
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
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
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
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