Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Einlesen von SQL-Daten in Combobox (https://www.delphipraxis.net/49274-einlesen-von-sql-daten-combobox.html)

cell 8. Jul 2005 06:58

Datenbank: SQL • Zugriff über: weiß ich noch nicht

Einlesen von SQL-Daten in Combobox
 
hi
Ich habe schon in Büchern und tutorials nachgelesn doch nirgends steht irgendwo genau beschrieben wie man von einer SQL Datenbank in eine Combobox einlest.
Kann mir wer von euch weiter helfen oder ein gutes tutorial geben

THX

Sharky 8. Jul 2005 07:25

Re: Einlesen von SQL-Daten in Combobox
 
Hai cell,

zum einen könntest Du natürlich eine TDBComboBox verwenden. Aber hier ein Beispiel wie Du es machen könntest.
Delphi-Quellcode:
procedure TForm1.FillComboBox (aCB : TComboBox; aID, aField, aTable : string);
var
  myQuery : TZQuery; // Query für deine Datenbank
begin
  aCB.Clear;
  myQuery := TZQuery.Create(nil);
  try
    myQuery.Connection := DBConnection; // Deine Connection
    myQuery.SQL.Text := Format ('SELECT %s, %s FROM %s ORDER BY %s',
            [aID,aField,aTable,aField]);
    myQuery.Open;
    while not (myQuery.Eof) do
    begin
      aCB.AddItem(myQuery.Fields[1].AsString,TObject(myQuery.Fields[0].AsInteger));
      myQuery.Next;
    end;
  finally
    myQuery.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FillComboBox(ComboBox1,'ID','Name','Test1');
end;

cell 8. Jul 2005 07:37

Re: Einlesen von SQL-Daten in Combobox
 
Danke für deine Hilfe aber ich bin ein Delphi Neuling und kenne mich noch nicht so gut aus !
kannst du mir das ein bisschen erklären ??

thx

Sharky 8. Jul 2005 07:39

Re: Einlesen von SQL-Daten in Combobox
 
Zitat:

Zitat von cell
... kannst du mir das ein bisschen erklären ?? ...

Klar ;-)

Was genau ist dir bei dem Code denn nicht klar?
Dann kann ich Dir diese Punkte gezielt erklären.

TeronG 8. Jul 2005 07:48

Re: Einlesen von SQL-Daten in Combobox
 
So oder so ähnlich .... ^^
Delphi-Quellcode:
myQuery.First;            // anfang der DB
while not (myQuery.Eof) do // solange nicht EndOfFile
begin
  Combobox.Items.Add(myQuery.Fields[1].AsString); // Eintrag aus Feld [1] zu Combobox Hinzufügen ...
  myQuery.Next; // nächster Datensatz
end;
(der rest der bei Sharky noch dabei steht ist quasi "nur" zum verbindungsaufbau und zur Sauberen trennung ....)

cell 8. Jul 2005 08:35

Re: Einlesen von SQL-Daten in Combobox
 
Delphi-Quellcode:
myQuery.First;            // anfang der DB
while not (myQuery.Eof) do // solange nicht EndOfFile
begin
  Combobox.Items.Add(myQuery.Fields[1].AsString); // Eintrag aus Feld [1] zu Combobox Hinzufügen ...
  myQuery.Next; // nächster Datensatz
end;

myQuery.First; -----> ist des immer so oder kann ich da einen beliebigen namen nehmen
Combobox.Items.Add-------> des is glaub ich klar =D
myQuery.Fields[1].AsString------> des versteh ich ned warum Fields[1]
myQuery.Next; --------> mit dem sag ich ihm dann das die nächste combobox kommt ???


thx

Sharky 8. Jul 2005 08:40

Re: Einlesen von SQL-Daten in Combobox
 
Zitat:

myQuery.First; -----> ist des immer so oder kann ich da einen beliebigen namen nehmen
myQuery ist der Name deiner Query-Komponente
Zitat:

Combobox.Items.Add-------> des is glaub ich klar =D
:-D
Zitat:

myQuery.Fields[1].AsString------> des versteh ich ned warum Fields[1]
Du könntest auch myQuery.FieldByName('feldname'].AsString nehmen.
.Fields[1] sagt einfach das die zweite spalte des Tabellen ergebnisses benutzt wird.
Zitat:

myQuery.Next; --------> mit dem sag ich ihm dann das die nächste combobox kommt ???
Nein, nicht die nächste Combobox sondern es wird zum nächsten Eintrag (Zeile) deiner Tabelle gesprungen.

cell 8. Jul 2005 08:47

Re: Einlesen von SQL-Daten in Combobox
 
Zitat:

myQuery.Next; --------> mit dem sag ich ihm dann das die nächste combobox kommt ???
Nein, nicht die nächste Combobox sondern es wird zum nächsten Eintrag (Zeile) deiner Tabelle gesprungen.

ahh also kommt wieder der Befehl
myQuery.Fields[2].AsString

merlin17 8. Jul 2005 08:59

Re: Einlesen von SQL-Daten in Combobox
 
hier noch ein netter Artikel von Borland zu diesem Thema mit Blick richtung .net <g>

http://bdn.borland.com/article/0,1410,31996,00.html



:-) thomas

cell 8. Jul 2005 09:16

Re: Einlesen von SQL-Daten in Combobox
 
thx

TeronG 8. Jul 2005 09:21

Re: Einlesen von SQL-Daten in Combobox
 
Zitat:

Zitat von cell
ahh also kommt wieder der Befehl
myQuery.Fields[2].AsString

wenn du dann die DRITTE Spalte in deiner Combobox haben wills .. JA ..

cell 8. Jul 2005 09:32

Re: Einlesen von SQL-Daten in Combobox
 
jop versteh schon DANKE

Hansa 8. Jul 2005 09:54

Re: Einlesen von SQL-Daten in Combobox
 
Als Delphi-Neuling würde ich die Antworten kaum verstehen. :-D Und für die Neulinge will ich das mal etwas näher erläutern. 8) Dreh und Angelpunkt ist der Source von Sharky. Und zwar die Zeile mit dem "SELECT". Damit fordert er eine genau definierte Datenmenge an. Liegt die nun vor, dann wandert er da durch zuerst mit First und dann solange mit next, bis er am Ende (EOF) ankommt. Das mit dem ComboBox.Add usw. ist ja klar.

Das mit dem Fields [1] gefällt mir allerdings nicht so gut. Ich verwende bei so was lieber FieldByName. Das macht den Source übersichtlicher, weil man sich nicht noch die Anordnung der einzelnen Felder merken muß. Die Einzelheiten mußt Du allerdings in der Hilfe selber zusammensuchen. :mrgreen:

TeronG 8. Jul 2005 10:50

Re: Einlesen von SQL-Daten in Combobox
 
Zitat:

Zitat von Hansa
Als Delphi-Neuling würde ich die Antworten kaum verstehen.

DER neulig hat's wohl verstanden :mrgreen:
Zitat:

Zitat von Hansa
Das mit dem Fields [1] gefällt mir allerdings nicht so gut. Ich verwende bei so was lieber FieldByName.

YUP ... benutze eigentlich auch zumeist "FieldByName" da sieht man besser mit welches Feld man grade arbeitet ^^ (evtl. CONSTanten verw.)

ibp 8. Jul 2005 11:12

Re: Einlesen von SQL-Daten in Combobox
 
Zitat:

Zitat von TeronG
... benutze eigentlich auch zumeist "FieldByName" da sieht man besser mit welches Feld man grade arbeitet ^^ (evtl. CONSTanten verw.)

dann hat man auch keine probleme, wenn sich mal die reihenfolge der felder in der db ändert !

Sharky 8. Jul 2005 11:24

Re: Einlesen von SQL-Daten in Combobox
 
Zitat:

Zitat von ibp
...dann hat man auch keine probleme, wenn sich mal die reihenfolge der felder in der db ändert !

Was ja in diesem Spezialfall nicht vorkommen kann :stupid:

.FieldByName hat aber einen kleinen Nachteil bei der Geschwindigkeit. Es werden nämlich bei jedem Aufruf erst alle Felder durchlaufen um das Feld anhand des Names finden zu können. Wenn jetzt mal rein theoretisch 20 Felder und 10.000 Datensatze zurückgegeben werden bedeutet dies das beim Zugriff auf den Inhalt des zwanzigsten Feldes 20 * 10.000 = 200.000 AnsiCompareText durchgeführt werden müssen.

cell 8. Jul 2005 11:39

Re: Einlesen von SQL-Daten in Combobox
 
aha
also in meiner Datenbank sind ziemlich viele Daten drinnen, denn die ist direkt an einen Bremsenprüfstand angeschlossen
also werde ich glaube ich das mit den Fields[0] nehmen oder ??

thx für eure hilfe
werde vielleicht noch eine frage haben! wie ich zu einem server connecten kann, aber ich schau mal in bücher nach ob ich es finde

thx

TeronG 8. Jul 2005 11:45

Re: Einlesen von SQL-Daten in Combobox
 
hatte mir schonmal ne Constante (z.B. Datum = 0; Benutzer = 1) gemacht .. so kann man mit Wörtern arbeiten und umgeht trotzdem 'AnsiCompareText' ... die Reihenfolge darf sich da natürlich dennoch NICHT ändern .. aber das wird glaub ich langsam OT ^^

ibp 8. Jul 2005 11:49

Re: Einlesen von SQL-Daten in Combobox
 
eine andere möglichkeit ist eine inzidenztabelle bei programmstart zu generieren, die sich die reihenfolge der felder aus der db holt, dann kannste dir das auch sparen und hast so die flexibilität! nicht jeder arbeitet mit fixen db-strukturen :zwinker:

cell 8. Jul 2005 12:03

Re: Einlesen von SQL-Daten in Combobox
 
hehe nein nein ich glaube des wird schon so passen
:mrgreen:
aber trotzdem danke :wink:

Hansa 8. Jul 2005 12:09

Re: Einlesen von SQL-Daten in Combobox
 
Ganz OT finde ich das aber nicht. Schlimmer ist es, etwas aus dem Zusammenhang zu reißen. Deshalb noch eine Frage :

Ich gehe davon aus, mehr aber nicht, daß durch die Dataset Definition eine Stringlist o.ä. im Speicher liegt und das FieldByName nichts anderes macht, als lediglich diese durchzugehen. Aber doch nicht bei jedem Datensatz. Oder doch ? :mrgreen: Intern wird das wahrscheinlich sowieso über den Index der Stringliste geregelt. Oder anders rum gefragt : hat einer das mal getestet ?

cell 8. Jul 2005 12:14

Re: Einlesen von SQL-Daten in Combobox
 
ähhhhh was :mrgreen:

ibp 8. Jul 2005 12:19

Re: Einlesen von SQL-Daten in Combobox
 
ich gehe mal davon aus, dass sharkys beispiel darauf angelegt war, dass du jeden datensatz duchgehst um ihn z.b. in eine cobobox zu laden, dann wird sicherlich diese abfrage entsprechend oft durchlaufen, hier ist sicherlich der zugriff über den index angebracht!

cell 8. Jul 2005 12:22

Re: Einlesen von SQL-Daten in Combobox
 
ahhh kk

Sidorion 8. Jul 2005 12:27

Re: Einlesen von SQL-Daten in Combobox
 
Die Reihenfolge der Felder entspricht NICHT der Reihenfolge in der Datenbank, sondern der Reihenfolge ihres Auftretens im SQL-Statement! (oder bei Zusammengeclickten der Reihenfolge in der Liste)
Solange man also das Select-statement nicht ändert (bei namentlich angegebenen Spalten), kann nix passieren.
Problematisch wirds bei SELECT * FROM Foo. Hier ist die Reihenfolge wieder entsprechend der in der Datenbank (weil intern der * durch feld1, feld2,... ersetzt wird und diese Ersetztung wird aufgrund Informatinen der Systemtabellen vorgenommen wird), allerdings muß man in einem solchen Fall eh den Code zum Auslesen anpassen.

marabu 8. Jul 2005 12:29

Re: Einlesen von SQL-Daten in Combobox
 
Hallo Leute,

Zitat:

Zitat von Hansa
hat einer das mal getestet ?

klar doch.

Habe meinen Test - ohne wissenschaftlichen Anspruch - sogar noch rumliegen. 10 Mio Zugriffe auf das letzte Attribut einer 21-stelligen Relation: 87s bei Zugriff per FieldByName(), 24s bei Zugriff über meinen NameIndex und 7s bei Zugriff über Index-Variable.

Grüße vom marabu

cell 8. Jul 2005 12:48

Re: Einlesen von SQL-Daten in Combobox
 
procedure TfrmTestauswahl.cbotestnummerChange(Sender: TObject);
myQuery.First;
while not (myQuery.Eof) do
begin
qrMain.SQL.Text:='SELECT `Testnummer` WHERE `Testabschnitt=3`;
Combobox.Items.Add(myQuery.Fields[0].AsString);
end;

end.


Kann man das so schreiben oder sind da gravierende Fehler drinnen?? wenn ja welche

cell 8. Jul 2005 12:50

Re: Einlesen von SQL-Daten in Combobox
 
sry hab noch nicht gesagt was ich machn will!!
also ich mach ein neues Fenster auf wo eien combobox ist. beim aufmachn schon soll sich die Combobox mit den daten aus der Tabelle Testnummer füllen wo der testabschnittt 3 ist

marabu 8. Jul 2005 12:55

Re: Einlesen von SQL-Daten in Combobox
 
Erstmal fehlen die delphi-tags in deinem Beitrag.
Dann fehlt ComboBox.Items.Clear - die Box wird so mit der Zeit recht voll.
Und dann musst dich noch entscheiden, wann du mit qrMain und wann mit myQuery arbeitest.

marabu

cell 8. Jul 2005 12:58

Re: Einlesen von SQL-Daten in Combobox
 
procedure TfrmTestauswahl.cbotestnummerChange(Sender: TObject);
myQuery.First;
while not (myQuery.Eof) do
begin
myQuery.SQL.Text:='SELECT `Testnummer` WHERE `Testabschnitt=3`;
ComboBox.Items.Clear
Combobox.Items.Add(myQuery.Fields[0].AsString);
end;



aber was meinst du mit delphi tags???

marabu 8. Jul 2005 13:06

Re: Einlesen von SQL-Daten in Combobox
 
Oberhalb von dem Fenster, in dem du deinen Beitrag schreibst, ist ein Button "Delphi-Code". Hau drauf, bevor du deinen Quellcode schreibst und nochmal, wenn du fertig bist. Dann sieht dein Beitrag etwa so aus:

Delphi-Quellcode:
procedure TfrmTestauswahl.FormCreate(Sender: TObject);
begin
  ComboBox.Items.Clear;
  with myQuery do begin
    SQL.Text := 'SELECT Testnummer FROM Test WHERE Testabschnitt = 3 ORDER BY Testnummer';
    Open;
    while not Eof do begin
      Combobox.Items.Add(myQuery.Fields[0].AsString);
      Next;
    end;
    Close;
  end;
end;
marabu

FROM-Klausel nach Hinweis von Sharky eingefügt

ibp 8. Jul 2005 13:07

Re: Einlesen von SQL-Daten in Combobox
 
Delphi-Quellcode:
procedure TfrmTestauswahl.cbotestnummerChange(Sender: TObject);
begin
  ComboBox.Items.Clear
  myQuery.SQL.Text:='SELECT Testnummer WHERE Testabschnitt = 3 ORDER BY Testnummer';
  myQuery.Open;
  myQuery.First;
  while not (myQuery.Eof) do
    Combobox.Items.Add(myQuery.Fields[0].AsString);
end;
delphi tags sind: [_delphi_] und [_/delphi_] ohne die "_" oder drück einfach beim editieren den button "delphi-code"

cell 8. Jul 2005 13:28

Re: Einlesen von SQL-Daten in Combobox
 
Delphi-Quellcode:
procedure TfrmTestauswahl.cbotestnummerChange(Sender: TObject);
begin
  ComboBox.Items.Clear
  myQuery.SQL.Text:='SELECT Testnummer WHERE Testabschnitt = 3 ORDER BY Testnummer';
  myQuery.First;
  while not (myQuery.Eof) do
    Combobox.Items.Add(myQuery.Fields[0].AsString);
end;
kann ich das so übernehmen ??
bzw statt

Delphi-Quellcode:
Combobox.Items.Add(myQuery.Fields[0].AsString);
gehört
Delphi-Quellcode:
cbotestnummer.Items.Add(myQuery.Fields[0].AsString);
oda ??

marabu 8. Jul 2005 15:57

Re: Einlesen von SQL-Daten in Combobox
 
Hi cell,

der von dir vorgeschlagene Code funktioniert garantiert nicht. Du legst das SQL-Statement fest, aber startest die Anfrage (myQuery.Open) an die Datenbank gar nicht. Dann verwendest du eine Schleife ohne Ende-Kriterium.

Es ist dir vielleicht nicht aufgefallen, aber für den Fall, dass du mehrere Testnummern in deiner ComboBox haben wolltest, habe ich deinen Code in meinem letzten Beitrag bereits an deine Bedürfnisse angepasst. Du musst nur noch darauf achten, dass du die richtigen Namen einsetzt. Einfach übernehmen ist wohl keine gute Idee. Du solltest den Code auch verstehen. Was du über die Online-Hilfe nicht klären kannst, frage hier nach.

marabu

Sharky 8. Jul 2005 16:57

Re: Einlesen von SQL-Daten in Combobox
 
Hai,

neben der Ausführung von marabu wird der Code zur Laufzeit einen Fehler verursachen weil das SQL-Statement einen Fehler hat.
Es wird nämlich nicht angegeben auf welche Tabelle es sich bezieht.

Allgemein muss der Aubau so sein:
Code:
[b]SELECT[/b] [i]feldnamen[/i] [b]FROM[/b] [i]tabellennamen[/i]
Bei deinem Statement fehlt das FROM.

cell 11. Jul 2005 07:04

Re: Einlesen von SQL-Daten in Combobox
 
hätte noch eine Frage zuu einem Quelltext

Delphi-Quellcode:
procedure TfrmTestauswahl.FormCreate(Sender: TObject);
begin
  ComboBox.Items.Clear;
  with myQuery do begin
    SQL.Text := 'SELECT Testnummer FROM Test WHERE Testabschnitt = 3 ORDER BY Testnummer';
    Open;
    while not Eof do begin
      Combobox.Items.Add(myQuery.Fields[0].AsString);
      Next;
    end;
    Close;
  end;
end;
das hat marabu geschrieben und ich wollte wissen was das

Delphi-Quellcode:
with myQuery do begin
macht weil hier zeigt es mir einen Fehler an
thx

marabu 11. Jul 2005 07:26

Re: Einlesen von SQL-Daten in Combobox
 
Zitat:

Zitat von cell
Delphi-Quellcode:
with myQuery do begin
hier zeigt es mir einen Fehler an

Welchen Fehler meldet denn der Compiler?

myQuery ist ein Platzhalter für deine Query, wie auch immer die heißen mag - oder hast du Probleme mit dem with-block?

marabu

cell 11. Jul 2005 07:29

Re: Einlesen von SQL-Daten in Combobox
 
Delphi-Quellcode:
undefinierteer Bezeichner: 'myQuery'
Zitat:

myQuery ist ein Platzhalter für deine Query, wie auch immer die heißen mag - oder hast du Probleme mit dem with-block?
ich hab doch meine abfrage schon vorher gemacht ???

Delphi-Quellcode:
SQL.Text := 'SELECT Testnummer FROM friktionstest;

cell 11. Jul 2005 07:49

Re: Einlesen von SQL-Daten in Combobox
 
könnte bitte jemand auf die Fragen antworten oder mir ein gutes Tutorial geben wo das drinnen steht

thx

marabu 11. Jul 2005 07:49

Re: Einlesen von SQL-Daten in Combobox
 
Mit SQL ist das so: du schreibst auf was du wissen willst:

Delphi-Quellcode:
myQuery.SQL.Text := 'SELECT Testnummer FROM friktionstest WHERE ... ORDER BY ...';
Dann musst du deine Anfrage noch an den Server schicken:

Delphi-Quellcode:
myQuery.Open;
Weil der Server sich ein paar Resourcen dafür zurecht gelegt hat, solltest du ihm auch wieder Bescheid sagen, wenn du fertig bist:

Delphi-Quellcode:
myQuery.Close;
Klarer jetzt?

marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:51 Uhr.
Seite 1 von 3  1 23      

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