AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Abfragemaske designen

Abfragemaske designen

Ein Thema von Igotcha · begonnen am 19. Nov 2005 · letzter Beitrag vom 1. Feb 2006
Antwort Antwort
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#1

Abfragemaske designen

  Alt 19. Nov 2005, 02:03
Datenbank: mySQL • Version: 5.x • Zugriff über: ZEOS
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.139 Beiträge
 
Delphi 12 Athens
 
#2

Re: Abfragemaske designen

  Alt 19. Nov 2005, 02:29
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Abfragemaske designen

  Alt 19. Nov 2005, 11:39
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
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#4

Re: Abfragemaske designen

  Alt 19. Nov 2005, 12:43
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
Martin Schaefer
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Abfragemaske designen

  Alt 21. Nov 2005, 13:10
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:

Query.SQL.Text:='SELECT * FROM table '+CreateSQLWhereClause(myItemList); Funktioniert soweit und für meine Ansprüche reicht das.

Grüße
Igotcha
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#6

Re: Abfragemaske designen

  Alt 21. Nov 2005, 16:32
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Igotcha

Registriert seit: 22. Dez 2003
544 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Abfragemaske designen

  Alt 21. Nov 2005, 16:58
Zitat von Hansa:
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.
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='TextausEdit1AND 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
  Mit Zitat antworten Zitat
Ferber

Registriert seit: 9. Mär 2005
Ort: Wien Umgebung
155 Beiträge
 
Delphi 2006 Architect
 
#8

Re: Abfragemaske designen

  Alt 1. Feb 2006, 16:43
@mschaefer: Hi !

Bin beim Suchen auf diesen Thread gestossen.

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 !

+ = THX !
Otto
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.032 Beiträge
 
Delphi 12 Athens
 
#9

Re: Abfragemaske designen

  Alt 1. Feb 2006, 20:50
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
Martin Schaefer
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:20 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