Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Abfragemaske designen (https://www.delphipraxis.net/57317-abfragemaske-designen.html)

Igotcha 19. Nov 2005 01:03

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:
Abfrage_1:

  NAME = Meier       // String

Abfrage_2:

  NAME = Meier       // String
+ ORT = Berlin      // String

Abfrage_3:

  NAME = Me*          // String
+ ORT = Berlin      // String
+ ALTER= 30           // integer
Nehmen wir an, die Suchmaske bietet 10 Suchkriterien an, geht es dann "schlauer", als

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

himitsu 19. Nov 2005 01:29

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:
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;
Der mittlere Teil würde dann für jedes Edit-Feld einmal vorhanden sein.

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.

Igotcha 19. Nov 2005 10:39

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

mschaefer 19. Nov 2005 11:43

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.


DBEditor


Grüße // Martin

Igotcha 21. Nov 2005 12:10

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:
Query.SQL.Text:='SELECT * FROM table '+CreateSQLWhereClause(myItemList);
Funktioniert soweit und für meine Ansprüche reicht das.

Grüße
Igotcha

Hansa 21. Nov 2005 15:32

Re: Abfragemaske designen
 
Zitat:

Zitat von Igotcha
- 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

Jetzt erkläre mir mal, warum TObject, TwinControl gebraucht werden, um lediglich einen simplen string zusammenzusetzen. :shock:

Igotcha 21. Nov 2005 15:58

Re: Abfragemaske designen
 
Zitat:

Zitat von Hansa
Zitat:

Zitat von Igotcha
- 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

Jetzt erkläre mir mal, warum TObject, TwinControl gebraucht werden, um lediglich einen simplen string zusammenzusetzen. :shock:

Delphi-Quellcode:
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
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.

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

Ferber 1. Feb 2006 15:43

Re: Abfragemaske designen
 
@mschaefer: Hi ! :)

Bin beim Suchen auf diesen Thread gestossen.

Zitat:

Zitat von mschaefer
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.

DBEditor

Grüße // Martin

Leider funzt der Link nicht :( , hätt mich aber interessiert !

Bitte reparieren !

:( + :coder: = :-D THX !

mschaefer 1. Feb 2006 19:50

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 14:37 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