Delphi-PRAXiS

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)

smart 3. Dez 2011 13:49

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?

mkinzler 3. Dez 2011 14:03

AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
 
Direkt überhaupt nicht. Man könnte dynamisch die Felder der Tabelle ermitteln und dann in diesen suchen.

smart 3. Dez 2011 14:11

AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
 
Zitat:

Zitat von mkinzler (Beitrag 1139083)
Direkt überhaupt nicht. Man könnte dynamisch die Felder der Tabelle ermitteln und dann in diesen suchen.

ist es nicht möglich eine Tabelle so ähnlich wie eine Stringliste zu durchsuchen?

Bummi 3. Dez 2011 14:39

AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
 
Mir wird ganz schlecht bei dem was ich jetzt schreibe...
Delphi-Quellcode:
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;
(ungetestet)

Stevie 3. Dez 2011 14:46

AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
 
Zitat:

Zitat von Bummi (Beitrag 1139091)
Mir wird ganz schlecht bei dem was ich jetzt schreibe...

Mir auch, wenn ich den Einsatz von Pos>0 und Upper oder Lowercase lese, wo man einfach ContainsText (case insensitive) oder ContainsStr (case sensitive) benutzen könnte :)

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 Locate helfen.

Bummi 3. Dez 2011 15:04

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:
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;
4727
3916

Stevie 3. Dez 2011 15:56

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.

Bummi 3. Dez 2011 16:26

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"

smart 3. Dez 2011 17:13

AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
 
Wieso klappt dieser Code nicht?
Delphi-Quellcode:
      Form1.ABSTable1.Locate(Form1.ABSTable1.Fields['*'].DisplayName , Edit1.Text,[loPartialKey]);
in Edit1 seht der zu suchende Text.

Stevie 3. Dez 2011 17:54

AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
 
Auch wenn du als Abfrage
Code:
select * from table
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.

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?

Stevie 4. Dez 2011 11:49

AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
 
Zitat:

Zitat von smart (Beitrag 1139236)
Klappt aber nicht.
warum nicht?

Weil sich DisplayName eventuell vom FieldName unterscheidet :glaskugel:

smart 4. Dez 2011 12:04

AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
 
ich sehe schon, ich kenne mich viel zu wenig mit Datenbankprogrammierung aus.

smart 4. Dez 2011 13:31

AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
 
Zitat:

Zitat von Iwo Asnet (Beitrag 1139214)
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;

Was ist ContaintsText ?

Iwo Asnet 4. Dez 2011 14:01

AW: Tabelle durchsuchen ohne Angabe eines Feldnamens
 
Zitat:

Zitat von smart (Beitrag 1139251)
Was ist ContaintsText ?

Ein Tippfehler, was sonst.

Es sollte heißen "ContainsText" und ist in der Unit 'StrUtils' enthalten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:15 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