Entwickler-Ecke
Datenbanken - Optimale Suchfunktion in einer Tabelle???????
Kaischi - Di 13.08.02 15:19
Titel: Optimale Suchfunktion in einer Tabelle???????
Hallo alle zusammen.
Die einfachen Suchfunktionen kenne ich bereits. habe auch schon viele ausprobiert.
zur zeit habe ich diese hier:
Quelltext
1: 2:
| if Table1.Locate ('Hersteller;Modell;Modell (Typ);Baujahr',VarArrayOf([Edit1.text,Edit2.text,Edit3.text,Edit4.text]), [loCaseInsensitive, loPartialKey]) then ShowMessage('Datensatz gefunden.'); |
Allerdings benötige ich etwas sehr ausgefallenes!
Und zwar so etwas:
Neben dieser normalen Suche (siehe oben), benötige ich eine Funktion, welche das zuvor eingegebene zwischenspeichert.Sich also sozusagen merkt und dann wieder aufgerufen zu werden.
Wenn man also in irgendein Edit (1 bis 4) etwas reinschreibt, dann auf den button klickt, so soll dies Wort/Zahl aus der Tabelle rausgefildert werden.
das ist aber noch nicht alles!
Dies rausgefilderte soll sich das programm nun zwischenspeichern, damit man die suche noch mehr einschrenken kann, um nun ein weiteres anderes Edit zu benutzen.
So soll sich die Suche also beliebig für jeden auf wenige suchergebnisse einschrenken lassen.
Kann mir jemand helfen?????????????????????????????????
Vielen DAnk
bis11 - Di 13.08.02 15:41
Hi, ich habe die Suchroutine über den Find-Diaog gemacht.
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TKundenformularfenster.FindDialogFind(Sender: TObject); begin with table1 do begin if sucheindex = 1 then begin IndexName := 'Kundennummer'; SetKey; fieldbyname('Kundennummer').AsString := finddialog.FindText; gotonearest; end; FindDialog.CloseDialog; end; |
Habe dann für jeden Suchbegriff dann einen Index manuell festgelegt. Das heißt in welchem Feld ich suchen wollte hatte ich einen eigene Suchen-Button. Vielleicht nicht ganz elegant gelöst, aber es hat funktioniert und es ging schnell.
Spike - Di 13.08.02 17:13
Hallo,
probier doch mal Locate mit der Eigenschaft Filter zu kombinieren.
Wenn du erst nach dem Hersteller suchst, bei Erfolg die Tabelle filterst und dann nach dem Modell suchst usw. solltest du zum gewünschten Ergebis kommen.
also in groben Zügen etwa so:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| With Table 1 do begin if Locate('Hersteller',Edit1.Text,[loCaseInsensitive, loPartialKey]) then begin Filter := 'Hersteller = '+FieldByname('Hersteller'.asString); Filtered := true if Locate('Modell',Edit2.Text,[loCaseInsensitive, loPartialKey]) then Filter := Filter + ' AND Modell = '+ FieldByname('Modell'.asString); ... |
Kaischi - Mo 19.08.02 10:14
Hallo!!!!!!
Kann mir keiner helfen?
Hat keiner eine bessere Idee?
Oder hat schon jemand ein beispiel programm das meiner idee entspricht?
Würde mich für jede kleine hilfe bedanken.
gruß kai
Kaischi - Fr 23.08.02 10:00
hi hier bin ich nochmal.
ich hake an dieser stelle schon eine ganze weile fest.
Ich benötige bis zum 28.8. ein optimales programm mit dem man in einer tabelle suchen und filtern kann. also eine optimale suchfunktion!!!!!!!!!!!!
Mit allem was dazu gehört. wie z.B.: groß und kleinschreibung usw.
Dies ist ein programm für die schule. Und da ich delphi nicht so gut kann, bitte ich EUch mir zu helfen!!!!!!!!!
Ich zähle auf euch!!!!!!!!!!!!!!!!!!!!!!!!
Vielen Dank!!!!
Mit voller hoffung kaischi
PS.: Es reicht schon aus, wenn ihr mir hier einfach nur den code auflistet. das andere bekomme ich dann schon alleine hin.
Danke!!!!!!!!!1
Klabautermann - Mo 26.08.02 21:31
Hallo,
Kaischi hat folgendes geschrieben: |
Ich benötige bis zum 28.8. ein optimales programm mit dem man in einer tabelle suchen und filtern kann. |
Etwas Optimales gibt es nicht. Die mächtigste suchfunktionalitäten kannst du sicherlich per SQL implementieren. In der Schule habt ihr sicherlich ein paar Ramenbedingungen bekommen die euch Zeigen welche funktionalität ihr verwenden sollt.
Kaischi hat folgendes geschrieben: |
also eine optimale suchfunktion!!!!!!!!!!!!
Mit allem was dazu gehört.
wie z.B.: groß und kleinschreibung usw. |
Also wie gesagt, ich würde die
Structured
Query
Language verwenden. Suchen bzw. Filtern tut man in dieser über das
SELECT Statement. Da ich hir jetzt nicht die Zeit habe dir SQL zu erklären müssen ein paar Beispiele herhalten:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| // Ein Tabelle vollständig anzeigen: SELECT * FROM Tabelle
// Alle Datensätze anzeigen bei denen der Nachmane Meier ist: SELECT * FROM Tabelle WHERE Nachname='Meier'
// Alle Dantensätze anzeigen bei denen der Nachname nicht Meier ist SELECT * FROM Tabelle WHERE NOT (Nachname='Meier)
// Alle Meiers und Müllers ausgeben SELECT * FROM Tabelle WHERE (Nachname='Meier') OR (Nachname='Müller')
// Alle Datensätze Anzeigen Bei denen der Vormame Heinz und der Nachname Meier ist: SELECT * FROM Tabelle WHERE (Vorname='Heinz')AND (Nachname='Meier')
// Alle Datensätze raussuchen bei denen der Nachmane mit M beginnt: SELECT * FROM Tabelle WHERE Nachname LIKE 'M%'
// Alle Meiers raussuchen dabei groß und kleinschreibung ignorieren: SELECT * FROM Tabelle WHERE UPPER(Nachname)='MEIER'
// Alle Datensätze anzeigen und nach Nachnamen und Vornamen Sortieren: SELECT * FROM Tabelle ORDER BY Nachname, Vorname |
Aber wahrscheinlich willst du deinen user keine (mehr oder weniger) komplizieren SQL Statements eingeben lassen. Dennoch kannst du hinter den kuliisen damit arbeiten.
Wenn du dir die ganzen Beispiele anschaust, erkennst du, dass die Filterregel in der WHERE Zeile steht. Desweiteren siehst du das mehere bedingungen in die Where Klausel mit
AND,
OR und
NOT miteinander verküpft werden können.
Du kannst einzelne bedingungen recht einfach über Comboboxen und editfelder eingeben lassen. Z.b. so: Du hast eine Combobox über welche die zu Filternden Spalten ausgewählt werden können (z.B: Nachname und Vorname). Dann hast du noch ein Edit Feld in welches man den Wert eingeben kann. Der Benuzter wählt also in der Combobox "Nachname" aus und gibt in das Edit Feld "Meier" ein. Sobald der Benutzer jetzt auf den Knopf filtern drückt musst du eine Klausel draus machen in unserem einfachen Beispiel sieht das so aus.
Quelltext
1:
| ActKlausel := '(' + ComboBox1.Text + '=''' + Edit1.Text + ''')'; |
Damit hast du die Aktuelle Klausel, jetzt must du diese mit bereits vorhandenen Klauseln verbinden, da du diese ja schon in einem String hast (als bestandteil deines Querys) brauchst du sie eigentlich nur dahinter hängen.
Der übersichtlichkeit halbe gehe ich davon aus, dass du einen Objektglobalen String mit der Bezeichnung WhereStr definiert hast. Dieser ergibt die dritte Zeile in deinem Query. Was jetzt folgt ist die OnClick Methode für den oben beschriebenen Filtern-Knopf:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.butFilternClick(Sender: TObject); VAR ActKlausel : STRING; begin Query1.close; Query1.sql.Clear; Query1.sql.Add('SELECT *'); Query1.sql.Add('FROM MeineTabelle'); IF (Combobox1.Text<>'') AND (Edit1.Text<>'') THEN BEGIN ActKlausel := '(' + ComboBox1.Text + '=''' + Edit1.Text + ''')'; IF WhereStr='' THEN // Wenn noch kein Filter gesetzt ist WhereStr := 'WHERE ' ELSE // Aktuelle klausel mur mit bestehender verbunden werden WhereStr := WhereStr + ' AND '; WhereStr := WhereStr + ActKlausel END; // Filterregel eingegeben Query1.sql.Add(WhereStr); Query1.open; end; |
Und damit du auch weißt was mit Query1 gemeint ist solltest du mal in dieses
Tutorial [
http://www.auq.de/viewtopic.php?t=363] gucken.
So, ich denke das sollte für's erste reichen.
Viel Spass damit
Klabautermann
NTM - Mo 28.08.06 09:33
Titel: Objektglobaler String
Hallo zusammne ,
kann mir einer sag was man meint mit einem Objektglobalen Stirng und wie man diesen Anlegt.
Danke
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!