Datenbankwerte Anzeigen



  • Hallo,

    Ich möchte gerne aus meiner MS Access Datenbank eine Spalte auslesen und die Stringwerte in einer Combobox Hinzufügen um sie dort dann per click auswählen zu können. Das Auslesen und anzeigen in einem DB Grid habe ich hinbekommen, ich habe aber nichts dazu gefunden wie ich eine Spalte direkt in meiner ComboBox anzeigen kann. geht dasüberhaupt? kann mir jemand sagen wie ich das realisieren kann?

    mfg



  • Hallo

    am einfachsten geht es mit TDBLookUpComboBox.
    Allerdings dürfte es auch kein Problem sein, soetwas selber nachzumachen.
    Einfach alle Datensätze durchgehen und Feldwert mit ComboBox->Items->Add(<Feldwert>) hinzufügen.

    bis bald
    akari



  • In diesem Zusammenhang siehe auch die FAQ, "Datenbank - Ergebnisse von SELECT auswerten".



  • Danke für eure Hilfe, bin etwas weitergekommen.
    Ich Habe jetzt aber das problem, wenn ich etwas in Meiner DBCombobo auswähle(aus dem Context Menü), steht es nicht als Überschrift drinnen, auserdem habe ich Versucht mit ItemIndex 2 attribute aus der DB in labels anzuzeigen. Mein Code lautet:

    void aktualisieren()
      {
         //Anzahl der Datensätze Auslesen
         Main->ADOQuery1->Close();
         Main->ADOQuery1->SQL->Clear();
         AnsiString Datensaetze = Main->ADOQuery1->SQL->Add("SELECT COUNT(*) FROM Tabelle2");
         Datensaetze.ToInt();
    
         //Namen der Spalte Typ(Tabelle2) Auslesen und in DB Combobox1 Anzeigen
         Main->ADOQuery1->SQL->Clear();
         Main->ADOQuery1->SQL->Add("select Typ from Tabelle2");
         Main->ADOQuery1->Open();
         Main->ADOQuery1->First();
    
         while (!Main->ADOQuery1->Eof)
         {
               for (int i=0;i<=Datensaetze;i++)
               {
                   Main->DBComboBox1->Items->Add(Main->ADOQuery1->Fields->Fields[i]->AsString);
               }
               Main->ADOQuery1->Next();      //Setzt u.a. Eof wieder auf false
         }
         Main->labtyp->Caption = Main->ADOQuery1->SQL->Add("SELECT Tabelle2.Typ FROM 
         Tabelle2 WHERE " + Main->DBComboBox1->ItemIndex);
         Main->labort->Caption = Main->ADOQuery1->SQL->Add("SELECT Tabelle2.Ort FROM
         Tabelle2 WHERE " + Main->DBComboBox1->ItemIndex);
    

    als Ergebniss bekomme ich in meinen Labels aber -1. Der Fehler liegt sicher in den letzten 4 Zeilen. Wie muss ich Sie richtig schreiben?



  • Hallo

    warum -1 in dem Label erscheint, weiß ich zwar auch nicht, aber warum dort kein Vernünftiger Wert erscheint ist klar.

    Main->labtyp->Caption = Main->ADOQuery1->SQL->Add("SELECT Tabelle2.Typ FROM
         Tabelle2 WHERE " + Main->DBComboBox1->ItemIndex);
    

    Du darfst nicht nur die Anweisung zusammenstellen (auch noch fehlerhaft), sondern must diese auch ausführen und auswerten.

    Also so etwa :

    if (Main->DBComboBox1->ItemIndex > -1) // Wenn etwas ausgewählt ist 
    {
      Main->ADOQuery1->SQL->Clear(); // Alte Anweisung löschen
      Main->ADOQuery1->SQL->Add("SELECT Tabelle2.Typ FROM
         Tabelle2 WHERE <Name von ID_Feld> = '" +      IntToStr(Main->DBComboBox1->ItemIndex) + "'");   
      Main->ADOQuery1->Open();
      if (Main->ADOQuery1->RecordCount > 0)
        Main->labtyp->Caption = Main->ADOQuery1->FieldByName("Tabelle2.Typ");
      }
    

    Analog für die andere Anzeige.

    bisvbald
    akari



  • @Akari
    Danke für deine Hilfe, aber ich muß für mein Verständniss noch mal nachfragen:
    Den mit dem Index der ComboBox Selektierten Datensatz in der DB, was passiert mit Ihm? wo wird er hingeschrieben? wie weiß mein Programm dann in dem aufruf FieldByName aus welchem feld er einen String Auslesen soll? Außerdem bringt er mir
    beim compailieren die Fehlermeldung:
    [C++ Fehler] TK1.cpp(86): E2034 Konvertierung von 'TField *' nach 'AnsiString' nicht möglich
    Muss ich vorher erst noch eine AnsiStringvariable von TField deklarieren?



  • Hallo

    Den mit dem Index der ComboBox Selektierten Datensatz in der DB, was passiert mit Ihm?

    Die ComboBox ist unabhängig von den Datensätzen. Die Auswahl beeinflußt ausschließlich die Anzeige.

    wie weiß mein Programm dann in dem aufruf FieldByName aus welchem feld er einen String Auslesen soll?

    Jede Spalte einer Abfrage hat einen Namen, der durch die Ergebnisfelder der Select-Anweisung bestimmt wird.
    Da ich geschrieben habe SELECT Tabelle2.Typ FROM, ist in der Abfrage auch ein Feld mit dem Namen Typ. Und das Feld mit dem Namen anstatt dem Index anzusprechen, ist sicherer wenn du später die Reihenfolge der Spalten in der Abfrage änderst. Dann brauchst du nicht die Indexe neu aufzustellen.

    beim compailieren die Fehlermeldung:
    [C++ Fehler] TK1.cpp(86): E2034 Konvertierung von 'TField *' nach 'AnsiString' nicht möglich
    Muss ich vorher erst noch eine AnsiStringvariable von TField deklarieren?

    sorry, habe da die Zeile fehlerhaft geschrieben.
    So soll es aussehen :

    Main->labtyp->Caption = Main->ADOQuery1->FieldByName("Typ")->AsString;
    

    bis bald
    akari



  • besten Dank für die Hilfe, aber meine Labels zeigen nichts an!
    Ich habe herausgefunden das meine abfrage nach den Datensätzen ofensichtlich falsch ist, ich habe das programm mit dem Debugger laufenlassen und bei

    AnsiString Datensaetze = Main->ADOQuery1->SQL->Add("SELECT COUNT(*) FROM Tabelle2");
    Datensaetze.ToInt();
    

    in Datensaetze steht immer null! Deswegen springt er dann wohl nachher nicht in die If schleifen zum Anzeigen. Ich Habe probiert mit Main->ADOQuery1->RecordCount zu arbeiten (z.B. int Datensaetze=Main->ADOQuery1->RecordCount, oder direkt in meine for Schleife einsetzen) aber es hat nicht funktioniert. wie muß ich es machen? und kann ich in die DBCombobox am Anfang einen Defaultwert setzen?

    danke



  • Unglaublich



  • Hallo

    @ Scooby :
    hast du dir meinen Pot, insbesondere das

    if (Main->DBComboBox1->ItemIndex > -1) // Wenn etwas ausgewählt ist
    {
      Main->ADOQuery1->SQL->Clear(); // Alte Anweisung löschen
      Main->ADOQuery1->SQL->Add("SELECT Tabelle2.Typ FROM
         Tabelle2 WHERE <Name von ID_Feld> = '" +      IntToStr(Main->DBComboBox1->ItemIndex) + "'");  
      Main->ADOQuery1->Open();
      if (Main->ADOQuery1->RecordCount > 0)
        Main->labtyp->Caption = Main->ADOQuery1->FieldByName("Typ")->AsString;
      }
    

    mal angeschaut? Vergleich doch das doch mal mit deinem Code

    AnsiString Datensaetze = Main->ADOQuery1->SQL->Add("SELECT COUNT(*) FROM Tabelle2");
    Datensaetze.ToInt();
    

    Kleiner Tip : Bei deinem Select ist COUNT()* ebenfalls eine Spalte, die du als Ergebnis bekommst.

    bis bald
    akari


Anmelden zum Antworten