Listbox Datensätze von einer MySQL Datenbank auswerten
-
Hi Leute,
ich bin echt am Ende. Ich muss mich in meinen anstehenden Praktikum mit dem BCB und Datenbanken auseinander setzen.
Um den kommenden Problemen schonmal vor zu beugen, will ich schon mal ein wenig üben.
Mein Problem:Ich habe eine kleine MySQL Tabelle eingerichtet, die Personal heißt und aus personal_id, vorname, nachname besteht.
Jetzt habe ich da paar Einträge eingefügt und lade die in eine Listbox (ich nutze die MysqlDac Zugriffskomponente).
Das einladen in die Listbox klappt problemlos:
void __fastcall TForm1::FormCreate(TObject *Sender) { sql->SQL->Add("SELECT * FROM Personal"); sql->Active=true; for(int i=0;i<sql->RecordCount;i++) { ListBox1->Items->Add(sql->FieldByName("nachname")->AsString); sql->Next(); } }Jetzt habe ich noch ein Label neben die Listbox gesetzt, und wollte eigentlich, dass wenn man auf den Nachnamen in der Listbox klickt, der Vorname im Label erscheint.
Ich habe heute den ganzen Tag probiert, im Label erscheint nie der ausgewählte Datensatz von der Listbox.
Ich weiß nicht mehr was ich machen soll und brauche Hilfe um das zu verstehen.
Ich habe mir das Buch von Richard Kaiser extra gekauft, nur leider wird da nur kurz darauf eingegangen.Bitte verweist mich nicht auf die FAQ, ich habe die Suchfunktion probiert und kam zu keiner Lösung.
Vielen Dank
Katrin
-
Hallo
was hast du denn bisher versucht
der Ablauf ist doch eigentlich ganz einfach
- auswerten der Aenderung in der Listbox
- holen des Vornamens aus der DB
- anzeigen des Vornamenswo steckt da dein Problem
MfG
Klaus
-
Du solltest dir noch deine IDs merken. Wenn du 2 Personen mit gleichem Nachnamen hast, findeste den richtigen nicht.
Du nimmst z.B. parallel nen Array mit den IDs und holst dir die richtige über den ItemIndex der ListBox.
Deine SQL-Anfrage für den namen wäre dann"SELECT vorname FROM Personal WHERE personal_id=????".
-
Hallo,
mach es dir doch viel einfacher:
Zieh dir jeweils eine TDataSource,TDBLookupListBox und eine TDBText Komponente auf dein Formular.
Bei DataSource1 stellst du DataSet auf dein Query "sql".
Bei DBLookupListBox1 stellst du dann ListSource auf DataSource1,ListField auf nachname,KeyField auf personal_id.
Bei DBText1 noch DataSource auf DataSource1 und DataField auf vorname.
Das funktioniert so natürlich nur, wenn dein Query "sql" schon Daten enthält.Sonst machst du das zur Laufzeit:
void __fastcall TForm1::FormCreate(TObject *Sender) { sql->SQL->Clear(); sql->SQL->Add("SELECT * FROM Personal"); sql->Open(); DataSource1->DataSet = sql; DBLookupListBox1->ListSource = DataSource1; DBLookupListBox1->ListField = "nachname"; DBLookupListBox1->KeyField ="personal_id"; DBText1->DataSource = DataSource1; DBText1->DataField ="vorname"; }
-
Hi Franko, danke so funktioniert es, aber mir ging es darum, dass die Datensätze (zb. vorname) erst nach einem klick auf dem Eintrag in der Listbox im Label erscheinen sollen, nicht sofort beim erstellen des Formulars. Also klick auf den Nachnamen in der Listbox -> erscheint Vorname im Label.
Wenn die Form erstellt wird, wird ja die sql Anfrage gestellt, ausgewertet und dann die Listbox gefüllt.
Wenn ich dann aber auf einen Eintrag in der Listbox klicke, woher weiß ich dann zu welchem Datensatz mein klick gehört(ListBox1->Items->Strings[ListBox1->ItemIndex] bringt mich irgendwie nicht weiter?
Ich meine die vorherige Abfrage ist ja dann abgeschlossen? Oder?bítte helft
Katrin
-
Dann nimm anstatt des TDBText ein normales TLabel und reagiere auf das OnClick Ereignis vom TDBLookupListBox.
void __fastcall TForm1::FormCreate(TObject *Sender) { sql->SQL->Clear(); sql->SQL->Add("SELECT * FROM Personal"); sql->Open(); DataSource1->DataSet = sql; DBLookupListBox1->ListSource = DataSource1; DBLookupListBox1->ListField = "nachname"; DBLookupListBox1->KeyField ="personal_id"; } //--------------------------------------------------------------------------- void __fastcall TForm1::DBLookupListBox1Click(TObject *Sender) { Label1->Caption = sql->FieldByName("vorname")->AsString; }
-
Wenn du die Nachname "per Hand" in eine TListBox schiebst dann musst du dir natürlich wie hier schon erwähnt parallel den Primärschlüssel deiner Namen merken (dafür würde sich ne Containerklasse wie vector anbieten).
Beispielsweise:vector <int> vecid;//Hier natürlich zum Primärschlüssel passenden Datentyp nehmen. void __fastcall TForm1::FormCreate(TObject *Sender) { sql->SQL->Add("SELECT * FROM Personal"); sql->Active=true; for(int i=0;i<sql->RecordCount;i++) { ListBox1->Items->Add(sql->FieldByName("nachname")->AsString); vecid.push_back(sql->FieldByName("personal_id")->AsInteger); sql->Next(); } }Dann müsstest du noch nen SELECT im OnClick Ereignis von der ListBox absetzen:
"SELECT vorname FROM Personal WHERE personal_id="+vecid[ListBox1->ItemIndex];
-
Vielen Dank für die Hilfe

Klappt supermfg
Katrin