![]() |
Datenbank: mySQL • Version: 5.x • Zugriff über: ZEOS
Abfragemaske designen
Hallo zusammen,
da ich mehrere Suchmasken für ein Programm erstellen will, wollte ich mal nachfragen, ob es dafür ein "technisches Design" gibt? Was ich damit meine ist folgendes: Nehmen wir z.B. eine "Kunden-Abfrage". Sagen wir ein Kunde verfügt über x Felder in der Tabelle. Nun soll es nicht nur so sein, dass man nur nach einem Kriterium mit einer Ausprägung suchen können können soll, sondern nach 1 bis n Kriterien (=Feldern). Das sieht dann z.B. so aus, wenn man die Felder in der Suchmaske als Auswahl zur Verfügung stellt:
Delphi-Quellcode:
Nehmen wir an, die Suchmaske bietet 10 Suchkriterien an, geht es dann "schlauer", als
Abfrage_1:
NAME = Meier // String Abfrage_2: NAME = Meier // String + ORT = Berlin // String Abfrage_3: NAME = Me* // String + ORT = Berlin // String + ALTER= 30 // integer 1. Abzufragen, welches Feld überhaupt eine Eingabe enthät 2. hier geht das Problem schon los: Die Eingabe muss validiert werden, heisst, ich muss wissen / prüfen, ob das DB-Feld einen String oder eine Zahl erwartet 3. wenn ich 2. weiss und die Eingabe einen String erwartet, dann bilde ich meinen Sub-Suchstring in der Art "... WHERE FELD1=:feld1" - ich müsste aber ausserdem prüfen, ob der String z.B. ein "*" enthält, denn dann müsste ich ein "... WHERE FELD1 LIKE ..." erstellen 4. anschließend alle Abfragekriterien zusammenfügen Das ist sehr aufwändig ;-) Wie macht ihr so etwas? Gruß Igotcha |
Re: Abfragemaske designen
Also bei mySQL konnte man den Suchsting auch als String angeben, selbst wenn es sich um 'ne Zahl im DB-Feld handelte.
Demnach würde ich es also in etwa so machen:
Delphi-Quellcode:
Der mittlere Teil würde dann für jedes Edit-Feld einmal vorhanden sein.
SuchString := '';
S := Trim(Edit1.Text); If S <> '' Then Begin If SuchString <> '' Then SuchString := SuchString + ' AND '; If Pos('*', S) = 0 Then SuchString := SuchString + ''FELD1="' + S + '"' Else SuchString := SuchString + 'FELD1 LIKE "' + S + '"'; End; If SuchString <> '' Then Begin SuchString := '... WHERE ' + SuchString; {suchen} End; Und wenn auch gesucht werden soll, falls nirgends was ordentliches eingegeben wurde, dann für den letzten Abschitt eines der Folgenden:
Delphi-Quellcode:
If SuchString = '' Then SuchString := '... WHERE 1'
Else SuchString := '... WHERE ' + SuchString; {suchen}
Delphi-Quellcode:
If SuchString = '' Then SuchString := '1';
SuchString := '... WHERE ' + SuchString; {suchen} PS: ich hab jetzt allerdings nicht prüfen lassen, ob z.B. schädlicher Code in den Eingabefeldern steht, ebenfalls werden noch keine zeichen maskiert, welche eventuell den SQL-Code stören könnten. |
Re: Abfragemaske designen
Danke Dir, aber das ist ja gerade die "zu Fuß"-Variante, die ich meinte und die ich für jedes Suchformular neu erstellen bzw. anpassen müsste. Ich dachte, da gibt es evtl. etwas generischeres.
Gruß Igotcha |
Re: Abfragemaske designen
Moin zusammen,
ja an solchen Problemen erkennt man Entwickler die das nicht mehr nur als Hobby machen. Ja viel gibt es da tatsächlich nicht. Eigentlich kenne ich nur eine Komponente, die sich diesem Problem näher annimmt und da wäre noch einiges an Erweiterung nötig Ist zumindest ein interessanter Ansatz, den ich in einem Projekt auch verwende. ![]() Grüße // Martin |
Re: Abfragemaske designen
Mangels Alternativen habe ich mir eine eigene Lösung entworfen.
Diese funktioniert grds. so: - für jedes Eingabeobjekt der Suchmaske (TEdit, TComboBox) wird ein "SearchItem"-Objekt erstellt - diesem Objekt wird das entsprechende TWinControl und die Art der Information (Text-oder Zahlauswertung [z.B. Itemindex]) mitgegeben - diese Objekte werden in eine TObjectList gesteckt - diese Liste wird einer Funktion "CreateSQLWhereClause" übergeben - die Funktion wertet die Eingaben aus und gibt einen String zurück Benutzt wird das Ganze dann so:
Delphi-Quellcode:
Funktioniert soweit und für meine Ansprüche reicht das.
Query.SQL.Text:='SELECT * FROM table '+CreateSQLWhereClause(myItemList);
Grüße Igotcha |
Re: Abfragemaske designen
Zitat:
|
Re: Abfragemaske designen
Zitat:
Delphi-Quellcode:
Der Vorteil ist, dass man dieses Verfahren generisch für Suchmasken verwenden kann. Ich habe eine Funktion, die mir für alle meine Suchmasken den korrekten "WHERE"-Teil erstellt, die ich parametrisieren kann (z.B. bei Comboboxen zeige mir den Text oder den Itemindex) und wo ich die Suchmaske selbst problemlos erweitern kann, ohne die Funktion zur Generierung des "WHERE"-Teils anzupassen bzw. zu erweitern.
mySearchItem:=TSearchItem.Create;
mySearchItem.FComponent:=Edit1; mySearchItem.FDBField:='nachname'; mySerachItem.FType:=0; // Abfrage als Text mySearchList.Add(mySearchItem); mySearchItem:=TSearchItem.Create; mySearchItem.FComponent:=ComboBox1; mySearchItem.FDBField:='titel'; mySerachItem.FType:=1; // Abfrage als Zahl mySearchList.Add(mySearchItem); Query.SQL.Text:='SELECT * FROM table '+CreateSQLWhereClause(mySearchList); mySearchList.free; Text der SQL-Query: SELECT * FROM table WHERE nachname='TextausEdit1' AND titel=2 // 2=ItemIndex aus ComboBox, bei Typ=0, Text aus ComboBox Vielleicht sollte ich nochmal erwähnen, dass meine Suchmasken zwischen 5-15 Filterkriterien anbieten und an Suchmasken habe ich so an die 10 Stück. Gruß Igotcha |
Re: Abfragemaske designen
@mschaefer: Hi ! :)
Bin beim Suchen auf diesen Thread gestossen. Zitat:
Bitte reparieren ! :( + :coder: = :-D THX ! |
Re: Abfragemaske designen
N´abend:
Reperatur gescheitert, da die dsp derzeit nicht richtig rund läuft. Probier das Morgen nochmal, dann sollte es wieder laufen... Werde es mal im Auge behalten. Grüße // Martin |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07: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 by Thomas Breitkreuz