AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Elegantes auslesen aller Werte eines Feldes
Thema durchsuchen
Ansicht
Themen-Optionen

Elegantes auslesen aller Werte eines Feldes

Ein Thema von bernau · begonnen am 18. Jul 2006 · letzter Beitrag vom 21. Jul 2006
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#1

Elegantes auslesen aller Werte eines Feldes

  Alt 18. Jul 2006, 01:57
Datenbank: ADS • Zugriff über: TAdsTable
Hi,

folgende Problemstellung:

Ich habe eine Datenbank/Tabelle, auf die ich mit einer TTable zugreife. In dieser Tabelle gibt es ein Feld "Ort". Ich möchte alle Orte auslesen und in eine Stringlist kopieren. In der Stringlist sollen die ausgelesenen Orte jeweils einmal vorkommen.

Die einfachste Möglichkeit wäre nun eigendlich folgendes:

Delphi-Quellcode:
sl:=TStringlist.create;
sl.sorted:=true;
sl.duplicates:=dupignore;

DieTabelle.first;

while not DieTabelle.eof do
  begin
   sl.add(DieTabelle.fieldbyname('Ort').asstring);
   DieTabelle.next;
  end;


etc.

Bei einer Tabelle, in der wenige Orte sehr oft vorkommen, ist dies allerding nicht die effizienteste vorgehensweise.

Beispiel: In der Tabellen kommen jeweils 2000 mal der Ort Köln, Hamburg und Berlin vor. Insgesamt besitzt die Tabelle somit 6000 Einträge. Als Ergebnis sollen letztendlich 3 Einträge herauskommen. Dazu werden im oberen Beispiel aber 6000 Zugriffe auf die Tabelle durchgeführt.


Da muss es doch eine bessere Lösung geben. Oder?
  Mit Zitat antworten Zitat
Benutzerbild von semo
semo

Registriert seit: 24. Apr 2004
755 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Elegantes auslesen aller Werte eines Feldes

  Alt 18. Jul 2006, 07:10
gibts es dazu nicht den "group by" befehl von sql?

oder wenn du es dir umständlicher machen möchtest,
dann prüfst du vor dem einfügen in deine stringliste ob der neu einzufügende wert bereits vorhanden ist.
etwa so:
Delphi-Quellcode:
if sl.IndexOf(DieTabelle.fieldbyname('Ort').asstring)>-1 then
  sl.add(DieTabelle.fieldbyname('Ort').asstring);
  Mit Zitat antworten Zitat
mbamler

Registriert seit: 19. Mai 2005
Ort: Hamburg
118 Beiträge
 
Delphi 7 Architect
 
#3

Re: Elegantes auslesen aller Werte eines Feldes

  Alt 18. Jul 2006, 07:18
Nimm doch statt einer TTable z.B. eine TQuery
und selectiere mit "distinct" ...

Gruß
Matthias
  Mit Zitat antworten Zitat
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Elegantes auslesen aller Werte eines Feldes

  Alt 18. Jul 2006, 07:25
Hi,

bei MySQL würde ich es über DISTINCT machen

select DISTINCT(Ort) from Tabelle Gibt jeden Ort nur einmal zurück
Ich denke einen ähnlichen Befehl sollte es auch bei deiner DB geben.
Uwe
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#5

Re: Elegantes auslesen aller Werte eines Feldes

  Alt 19. Jul 2006, 00:34
Zitat von computer-glossar.de:
oder wenn du es dir umständlicher machen möchtest,
dann prüfst du vor dem einfügen in deine stringliste ob der neu einzufügende wert bereits vorhanden ist.
etwa so:
Delphi-Quellcode:
if sl.IndexOf(DieTabelle.fieldbyname('Ort').asstring)>-1 then
  sl.add(DieTabelle.fieldbyname('Ort').asstring);
Hi,

das brauche ich eigendlich nicht zu prüfen, da mit "sl.duplicates=dupignore" automatisch beim Einfügen der doppelte Eintrag ignoriert wird.

Eigendlich ging es mir darum, mit so wenig wie möglichen Zugriffen auf die Tabelle alle vorhandenen Orte herauszufiltern.


Viele Grüße

Gerd
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Elegantes auslesen aller Werte eines Feldes

  Alt 19. Jul 2006, 00:36
Dann nimm den Vorschlag mit distinct - der ADS optimiert dann die Tabellenzugriffe. Sinnvoll wäre es, wenn Du auf das Feld "Ort" auch einen Index hast.
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#7

Re: Elegantes auslesen aller Werte eines Feldes

  Alt 19. Jul 2006, 00:44
An alle mit dem Hinweis auf SQL und Distinct.

Danke erst mal für die Antworten.

Aber...... Mich interessiert auch das Hintergrundwissen. Ist eben ein Sport für mich, Problemstellungen selber zu lösen bzw. zu begreifen und nicht auf vorhandenes in Form einer "Black Box" zurückzugreifen. Daher ist die Verwendung von TTable für mich Voraussetung.




Viele Grüße

Gerd
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: Elegantes auslesen aller Werte eines Feldes

  Alt 19. Jul 2006, 00:52
Dann könntest Du ja, wenn es um Tabellenoptimierung geht, auch folgende Vorgehensweise verwenden:
  • Index auf Ort erstellen
  • An den Anfang der Tabelle gehen
  • Merken des Ortes in String
  • Gesamte Tabelle durchlaufen
  • Vergleichen ob der Ort vom gemerkten Ort abweicht
  • Wenn ja, in die Stringliste schreiben und Ort erneut in String merken
Dabei wird aber immer die gesamte Tabelle durchlaufen. Wenn Du Deine DB-Struktur normalisierst, hättest Du dagegen sowieso jeden Ort nur einmal. Dann würde nicht mehr die Adresstabelle durchlaufen, sondern nur noch die Ortstabelle. Diese enthält dann jeden Ort nur einmal.

Oder Du bastelst Dir einen intelligenten Suchalgorithmus, der auf den jeweils nächsten Ort springt (z.B. durch Erhöhen der ASCII-Werte des aktuellen Ortes und anschliessendem Locate).
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von bernau
bernau

Registriert seit: 1. Dez 2004
Ort: Köln
1.295 Beiträge
 
Delphi 12 Athens
 
#9

Re: Elegantes auslesen aller Werte eines Feldes

  Alt 21. Jul 2006, 00:38
Zitat von Union:
Dann könntest Du ja, wenn es um Tabellenoptimierung geht, auch folgende Vorgehensweise verwenden:
  • Index auf Ort erstellen
  • An den Anfang der Tabelle gehen
  • Merken des Ortes in String
  • Gesamte Tabelle durchlaufen
  • Vergleichen ob der Ort vom gemerkten Ort abweicht
  • Wenn ja, in die Stringliste schreiben und Ort erneut in String merken
Dabei wird aber immer die gesamte Tabelle durchlaufen.
Das war ja im Grunde mein erster Ansatz. Der Funktioniert zwar, aber es soll eben nicht jeder Datensatz ausgelesen werden.


Zitat von Union:
Oder Du bastelst Dir einen intelligenten Suchalgorithmus, der auf den jeweils nächsten Ort springt (z.B. durch Erhöhen der ASCII-Werte des aktuellen Ortes und anschliessendem Locate).
In diese Richtung wird's gehen. Das mit dem Erhöhen des ASCII-Wertes ist denke ich mal eine gute Sache.
  Mit Zitat antworten Zitat
Benutzerbild von Michael Habbe
Michael Habbe

Registriert seit: 10. Aug 2005
264 Beiträge
 
Turbo Delphi für Win32
 
#10

Re: Elegantes auslesen aller Werte eines Feldes

  Alt 21. Jul 2006, 02:12
Warum nur so umständlich? Nimm ne TAdsQuery und sage dem SQL
select distinct Ort from Postleitzahlen order by Ort und dann rein in die StringList
Delphi-Quellcode:
AdsQuery.SQL.Text := 'select distinct Ort from Postleitzahlen order by Ort';
AdsQuery.Open;
AdsQuery.First;
while not AdsQuery.Eof do
begin
  SL.Add(AdsQuery.FieldByName('Ort').AsString);
  AdsQuery.Next;
end;
AdsQuery.Close;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:59 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