Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Suchfunktion realisieren (https://www.delphipraxis.net/96769-suchfunktion-realisieren.html)

Postman1986 30. Jul 2007 18:46

Datenbank: MySQL • Version: 5.0.32 • Zugriff über: MyDAC

Suchfunktion realisieren
 
Hallo,

hab hier ein blödes Problem mit einer Suchfunktion die ich entworfen habe. Die Suche soll ein DbGrid, mit jedem Buchstaben aktualisieren, den ein User eintippt.

Auf dem Formular liegen einige Editfenster, die die Daten aus dem DbGrid anzeigen. Wenn ein User ein best. Panel anklickt, soll die Suchfunktion quasi "aktiviert" werden, die Editfelder sollen als Suchkriterien dienen.

Das Problem: Wenn ich die Suchfunktion aktiviere, ist noch der aktuelle Datensatz in den DbEdit-Feldern geladen, wodurch die Datasource annimmt, ich wollte eine Änderung am jenem Eintrag machen. Tippe ich also ein Suchkriterium ein, wird nur der aktuelle Datensatz geändert :?

Delphi-Quellcode:
procedure TmaxMain.DbEdTitelChange(Sender: TObject);
var sTitel, sStandort: string;
begin
  if PnSearch.BevelOuter = bvLowered
  then begin
    sTitel := DbEdTitel.Text;
    sStandort := DbCbStandort.Text;
    try
    dbquery(QuSearch,SrcSearch,'SELECT * FROM `ma_marchiv_'+maxlogin.mydacSourceLogin.DataSet.Fields[0].AsString+'` WHERE Titel LIKE "%'+sTitel+'%" AND Standort LIKE "%'+sStandort+'%" ORDER BY Titel');
    DbGrMain.DataSource := SrcSearch;
    except
      On E:Exception Do begin
      MessageDlg('Fehler aufgetreten: '+E.Message+'', mtError, [mbOK], 0); end
    end;
  end;
end;

Hoffentlich versteht jemand was ich meine ^^
Gruß Daniel

FAlter 30. Jul 2007 19:03

Re: Suchfunktion realisieren
 
Hi,

Zwar nicht die Antwort, aber:

Ich bin der böse User der

Code:
"; DROP TABLE `ma_marchiv_XYZ`; --
eingibt. Vielleicht habe ich ja glück und erwische das richtige XYZ ;)

Soll heißen: Bitte nicht direkt den Inhalt des Edits in deine SQL-Anweisung einbauen. Dann kann man beliebig herummanipulieren. Bei Google suchensql injection

Reicht es in dem Fall nicht, "normale" Edits zu nehmen? Ich kenn ja dein Programm nicht, aber für eine Suchfunktion würde ich es so machen, solange die Edits nur und ausschließlich zum Suchen da sind.

Mfg
FAlter

Postman1986 30. Jul 2007 19:11

Re: Suchfunktion realisieren
 
Jo danke für den Hinweis, ist noch alles im Anfangsstadium, hab mir daher bisher noch keine Gedanken über solche Dinge gemacht :wink:


Extra Felder für die Suchfunktion wollte ich eigentlich nicht erstellen, da die vorhandenen Editfelder (welche zum Eingeben/Anschauen der Daten im DbGrid gedacht sind) genauso gut die Suche übernehmen könnten.

Natürlich könnte ich einfach "normale" Editfelder über die DbEdits legen und bei Bedarf sichtbar/unsichtbar machen, aber das scheint mir nicht gerade als die professionellste Lösung :roll:

hoika 30. Jul 2007 19:34

Re: Suchfunktion realisieren
 
Hallo,

naja, drüberlegen ist ja auch nicht proffessionell ;)

Nur ein DBEdit zeigt nun mal ein Feld des aktuellen Datensatzes an.
Dafür ist der da.

Ihn zum Suchen zu missbrauchen, ist nicht professionell.


Heiko

Postman1986 30. Jul 2007 20:51

Re: Suchfunktion realisieren
 
Und es gibt keine Möglichkeit, das temporär zu deaktivieren? Die Suche funktioniert ja mit dem DbEdit-Feld eigentlich schon, sofern man halt den automatisch geladenen Datensatz wegmacht und dann seine eigenen Eingaben eintippt. Nur wird dann halt der noch geladene Datensatz überschrieben, während die Suche läuft.

Sobald ich aber die Verbindung des Feldes zur Datasource kappe, ist das Edit-Feld auch nicht mehr editierbar :x

Als brutale Lösung ginge sicherlich auch sowas wie:
Delphi-Quellcode:
procedure TmaxMain.DBEdit1KeyPress(Sender: TObject; var Key: Char);
begin
if key = '1' then DbEdit1.Text := '1';
end;
Aber dann gibt's wieder 100 Sonderfälle zu beachten und es wird viel zu viel Code :wall:

Postman1986 31. Jul 2007 15:10

Re: Suchfunktion realisieren
 
Ok hab ne Lösung gefunden:

Einfach ne Art Fake Tabelle in der Datenbank erstellt, die die gleiche Struktur wie der eigentlich abzufragende Datensatz hat. Danach die DBFelder mit diesem Fake verknüpft, dadurch kann man in die DBFelder reinschreiben. Da das OnChange Ereignis sich ja nicht darum schert mit was das DBFeld verknüpft ist, sondern nur den aktuellen Text abfragt, klappt die Suche einwandfrei :)

Trotzdem danke für die Denkanstöße :cheers:


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:18 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