![]() |
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
Womit wir wieder bei #2 wären :roll:
|
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
Zitat:
|
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
Aber trotzdem stimmt, man braucht halt die Feldnamen, sonst wird das nix, woll?
|
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
Zitat:
|
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
Ich hab das Gefühl, wir reden an einander vorbei. Um in allen Spalten zu suchen braucht man alle Feldnamen, muss diese also zunächst ermitteln, Wildcards wie "*" ziehen da nicht, man muss also ein wenig Vorarbeit investieren. Und im Prinzip nichts anderes hat Markus in #2 gesagt (OK, in seiner gewohnt knappen Art, was es trotzdem nicht falsch macht).
|
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
Bevor wir noch weiter aneinander vorbei reden, post ich einfach mal eine mögliche Lösung ;)
Delphi-Quellcode:
for i := 0 to DataSet.FieldCount - 1 do
if DataSet.Locate(DataSet.Fields[i].FieldName, '*' + Edit1.Text, [loPartialKey]) then Break |
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
Hmm.. O(n*m*m), wobei n=Recordcount und m=Fieldcount, weil bei dem Code immer erst das Feld anhand des Feldnamens gesucht werden muss.
Wieso nicht schlicht, ergreifend und am naheliegensten:
Delphi-Quellcode:
Der Aufwand dürfte O(n*m) sein.
MyDataset.First;
While Not MyDataSet.Eof Do Begin For i:=0 to MyDataset.Fieldcount-1 do If ContaintsText (Search, MyDataset.Fields[i].AsString) Then ShowMEssage(Format('Gefunden in Feld "%s" in Record #%d',[MyDataSet.Fields[i].Name, MyDataSet.RecNo])); MyDataset.Next End; Damit ist die Forderung des Fragestellers erfüllt: KEINE Feldnamen (außer zur Ausgabe).Schneller (vom algorithmischen Aufwand her) geht es in Memory nicht. Auch per SQL wird man nicht umhin kommen, alle Spalten zu durchsuchen. Abhilfe: Man designt die Tabelle so, das die Felder selbst als Metadaten gehalten sind. |
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
Stevies Variante ist nicht nur kürzer sondern auchwesentlich schneller,
aber man sollte sich bewust sein, daß bei ihm die Suchreihenfolge nicht unbedingt passend sein kann, denn es wird hier ja im Printip nach den Spalten gesucht.
Code:
Eine Suche nach "a" würde hier den 4. Datensatz finden nicht den 2. Datensatz.
DS1 . . . . .
DS2 . . . a . DS3 . . . . . DS4 . a . . . DS5 . . . . . DS6 . . a . a Iwos Variante würde dagegen zuerst den Zweiten finden, aber z.B. eine fortsetzende Suche wäre nicht mäglich > "suche nächsten Fund". Als Suche/Filter nach allen Funden würden beide Codes sogar den Datensatz 6 doppelt finden und man müßte diesen, falls nötig, manuell rausfiltern. Wobei man bei Iwo nun einfach die innere schleife abbricht und schon alles nur noch einmal gelistet bekommt, was bei Stevies Code schon leider nicht so einfach möglich ist. Im Prinzip wäre hier wohl, falls keine der beiden Varianten in Frage kommt das schon vorgeschlagene die Lösung. - erstmal alle Spaltennamen besorgen und danach erst über alle Spalten gleichzeitig suchen - - die Suchliste für Locate zusammenbauen - - ein Statement für .Filter zusammenbauen - - oder das SQL-Statement für eine Query zusammenbauen - es gibt doch bestimmt ein SQL-Staement, welches die Spaltennamen liefert ... da könnte man dann ja alle eventuell nötigen SQLs verschachteln und zu einem einzigen Aufruf vermanschen. |
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
Wenn es nur darum geht, herauszufinden, ob ein bestimmter Wert in einer beliebigen Spalte steht, es aber unerheblich ist in welcher, könnte man die Inhalte der Spalten auch aneinanderhängen und dann dieses Konstrukt durchsuchen.
Der korrekte Weg wäre es aber das DB-Schema anzupassen. |
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
Habe es mal so versucht. In der Combo sind die Feldnamen, Edit2 der zu suchende Text.
Delphi-Quellcode:
Klappt aber nicht.
Var
A:Integer; begin ComboBox1.Text := ComboBox1.Items[0]; for A := 0 to ComboBox1.Items.Count - 1 do begin ComboBox1.Text := ComboBox1.Items[A]; Form2.ABSTable2.Locate(Form2.ABSTable2.Fields[ComboBox1.ItemIndex].DisplayName , Edit2.Text,[loPartialKey]); end; warum nicht? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:33 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-2025 by Thomas Breitkreuz