![]() |
Datenbank: ABS • Version: 6.8 • Zugriff über: DataSource
Tabelle durchsuchen ohne Angabe eines Feldnamens
Halle,
wie kann ich eine Tabelle ohne Angabe von Feldnamen, also die ganze Tabelle durchsuchen? |
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
Direkt überhaupt nicht. Man könnte dynamisch die Felder der Tabelle ermitteln und dann in diesen suchen.
|
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
Zitat:
|
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
Mir wird ganz schlecht bei dem was ich jetzt schreibe...
Delphi-Quellcode:
(ungetestet)
Found := -1;
While not DS.EOF and (Found=-1) do begin For i := 0 to DS.FieldCount - 1 do begin if pos(Uppercase(Search),Uppercase(DS.Fields[i].asString))>0 then begin Found := i; break; end; end; if found=-1 then DS.Next; end; |
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
Zitat:
Zu dem eigentlichen Problem eine kleine Rückfrage: Willst du eine Tabelle in der Datenbank durchsuchen (also per SQL) oder hast du ein DataSet in deinem Program? Bei letzterem könnte ![]() |
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
@Stevie
Ja der Befehl schreibt sich kürzer.... ich hatte mich vor längerem trotzdem für meine Version entschieden.
Delphi-Quellcode:
4727
var
tc:Cardinal; i:Integer; begin tc := GetTickCount; for I := 0 to 10000000 do begin ContainsStr('Ein kleiner Text mit wenig Inhalt','TEXT'); end; Memo2.Lines.Add(IntToStr(GetTickCount - tc)); tc := GetTickCount; for I := 0 to 10000000 do begin Pos(UPPERCASE('TEXT'),UPPERCASE('Ein kleiner Text mit wenig Inhalt')); end; Memo2.Lines.Add(IntToStr(GetTickCount - tc)); end; 3916 |
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
Performance gegen Korrektheit einzutauschen find ich nen schlechten Deal - such mal mit deiner Version nach Umlauten - von Unicode fang ich jetzt mal nicht an.
Außerdem musst du ContainsText vergleichen, denn du machst eine case insensitive Suche - die schneidet beim direkten Zeitvergleich noch schlechter ab. |
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
Ich geb mich geschlagen ....
In einer "üblichen" Umgebung schlägt zwar die AnsiUppercase Variante immer noch bei weitem die Containstextvariante, aber was ist heute noch "üblich" |
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
Wieso klappt dieser Code nicht?
Delphi-Quellcode:
in Edit1 seht der zu suchende Text.
Form1.ABSTable1.Locate(Form1.ABSTable1.Fields['*'].DisplayName , Edit1.Text,[loPartialKey]);
|
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
Auch wenn du als Abfrage
Code:
hast, wirst du kein field haben, was als Name '*' hat. Wenn du in allen Feldern suchen willst musst du als ersten Parameter für Locate die Liste aller Felder abgeben, in denen du suchen willst - durch Semikolon getrennt.
select * from table
|
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? |
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
Zitat:
|
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
ich sehe schon, ich kenne mich viel zu wenig mit Datenbankprogrammierung aus.
|
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
Zitat:
|
AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
Zitat:
Es sollte heißen "ContainsText" und ist in der Unit 'StrUtils' enthalten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:14 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