Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Tabelle durchsuchen ohne Angabe eines Feldnamens (https://www.delphipraxis.net/164865-tabelle-durchsuchen-ohne-angabe-eines-feldnamens.html)

DeddyH 3. Dez 2011 21:14

AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
 
Womit wir wieder bei #2 wären :roll:

Stevie 3. Dez 2011 22:41

AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
 
Zitat:

Zitat von DeddyH (Beitrag 1139162)
Womit wir wieder bei #2 wären :roll:

Was ja total präzise und zielweisend formuliert war, gelle? :roll:

DeddyH 3. Dez 2011 23:17

AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
 
Aber trotzdem stimmt, man braucht halt die Feldnamen, sonst wird das nix, woll?

Stevie 3. Dez 2011 23:37

AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
 
Zitat:

Zitat von DeddyH (Beitrag 1139195)
Aber trotzdem stimmt, man braucht halt die Feldnamen, sonst wird das nix, woll?

Rüschüsch, und die werden beim öffnen des Datasets angelegt

DeddyH 3. Dez 2011 23:42

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).

Stevie 4. Dez 2011 00:03

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

Iwo Asnet 4. Dez 2011 05:18

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:
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;
Der Aufwand dürfte O(n*m) sein.

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.

himitsu 4. Dez 2011 09:28

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:
DS1    . . . . .
DS2    . . . a .
DS3    . . . . .
DS4    . a . . .
DS5    . . . . .
DS6    . . a . a
Eine Suche nach "a" würde hier den 4. Datensatz finden nicht den 2. Datensatz.

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.

mkinzler 4. Dez 2011 09:55

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.

smart 4. Dez 2011 11:36

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:
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;
Klappt aber nicht.
warum nicht?


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:58 Uhr.
Seite 2 von 3     12 3      

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