Problem: Datenbankabfrage in Treeview anzeigen



  • Hi Leute, sorry für meine Frage, aber mein Problem scheint simple und dennoch komme ich nicht auf die richtige Lösung.

    Ich habe eine Access Datenbank mit 2 Tabellen : Kategorie , CD_Name

    Als Beispiel:

    In der Tabelle Kategorie befinden sich zum Bsp. Tabelle "Test1" und "Test2".
    Zur Tabelle "Test1" gehört die CD "CD1" und zur Tabelle "Test2" gehört die "CD2".

    Jetzt wollte ich die Datenbank in ein Treeview einlesen, dass mir solch einen Baum liefert:

    *Test1
       -CD1
    *Test2
       -CD2
    

    leider funktioniert das ganze nicht richtig,

    Query1->SQL->Clear();
    Query1->SQL->Add("SELECT Kategorie,CD_Name");
    Query1->SQL->Add("FROM Kategorie,CD");
    Query1->Open();
    Query1->First();
      while(!Query1->Eof){
    
            for (int i =0 ; i < Query1->FieldCount; i++){
    
                TreeView1->Items->Add(TreeView1->TopItem,Query1->FieldByName("Kategorie")->AsString);
                TreeView1->Items->AddChild(TreeView1->Items->Item[i],Query1->FieldByName("CD_Name")->AsString);
                Query1->Next();
         }
    
       }
    

    kann mir einer weiterhelfen? , vielen dank!!!

    gerd



  • "Funktioniert nicht" ist keine ausreichende Fehlermeldung oder Problembeschreibung.



  • Hallo Gerd,

    ich nehme mal an du willst einer Musik-CD eine Kategorie zuweisen.
    In deiner Access Datenbank hast du ja schon die Tabellen
    Kategorie und CD angelegt, nur woher soll jetzt eine CD wissen
    welcher Kategorie sie angehört? Denn mit

    Query1->SQL->Add("SELECT Kategorie,CD_Name"); 
    Query1->SQL->Add("FROM Kategorie,CD");
    

    erreichst du das nicht, deshalb brauchst du noch eine Zuordungen bzw. eine
    Verknüpfung der Tabellen.

    Tabellen evtl. so aufbauen

    Kategorie                                         CD
    idkategorie Autowert Primärschlüssel  ---         idcd Autowert Primärschlussel
    Kategorie   Text                        |-1:n --> idkategorie Integer
                                                      CD_Name     Text
    

    wenn du nun eine neue CD erstellst musst du der CD.idkategorie den Kategorie.idkategorie der gewünschten Kategorie zuweisen.

    Deine Abfrage auf den Tabellen würde dann so aussehen
    (wenn deine CD immer einer Kategorie zugeordnet währe)

    Query1->SQL->Add("SELECT Kategorie, CD_Name"); 
    Query1->SQL->Add("FROM Kategorie, CD"); 
    Query1->SQL->Add("WHERE CD.idkategorie=Kategorie.idkategorie"); 
    Query1->SQL->Add("ORDER BY Kategorie");
    

    falls es CD's ohne Kategorie geben soll musst du JOIN verwenden ala

    SELECT Kategorie, CD_Name
    FROM Kategorie RIGHT JOIN CD ON Kategorie.idkategorie = CD.idkategorie
    ORDER BY Kategorie

    und zu

    while(!Query1->Eof)
    { 
        for (int i =0 ; i < Query1->FieldCount; i++)
        { 
            TreeView1->Items->Add(TreeView1->TopItem,Query1->FieldByName("Kategorie")->AsString); 
            TreeView1->Items->AddChild(TreeView1->Items->Item[i],Query1->FieldByName("CD_Name")->AsString); 
            Query1->Next(); 
        } 
    }
    

    - schau dir in der Hilfe an was FieldCount macht
    - wiso eine for Schleife noch zusätzlich?
    - schau mal genauer hin wo dein Query1->Next(); steht



  • Hi Jansen, sorry,

    folgendes Problem:

    Ich habe ja wie bereits oben gepostet mehrer Kategorien.
    Aber alles wird in den ersten Knotenpunkt reingeschrieben.

    es erscheinen zwar CD1 und CD2 als Kategorie im Treeview, aber alle Unterkategorien erscheinen nur im ersten Knotenpunt (CD1).

    Ich habe bereits auch die Abfrage geändert (die Tabellen verknüpft) aber ich denke das Problem ist die schleife.

    Danke für Hilfe

    Gerd



  • Sorry VergissEs, da haben sich wohl unser Posts überschnitten 😡

    Ja, es geht um eine Musik CD Geschichte. Ich wollte diese komfortable in einer Datenbank verwalten.

    Die Datenbank selber besteht aus 3 Tabellen. Also das mit den Beziehungen denke ich mal, bekomme ich noch hin. Mir ging es erstmal um das Treeview Problem.

    Danke

    Gerd



  • zu

    VergissEs schrieb:

    - schau dir in der Hilfe an was FieldCount macht
    - wiso eine for Schleife noch zusätzlich?
    - schau mal genauer hin wo dein Query1->Next(); steht

    Hast du dir schon mal die Frage gestellt was du mit

    for (int i =0 ; i < Query1->FieldCount; i++)
    

    erreichen willst? bzw. haste schon mal in die Hilfe geschaut was FieldCount
    (macht wie oben schon erwähnt).
    Schau nochmal ganz genau hin wo dein Query1->Next(); steht, innerhalb der for Schleife, soll das richtig sein ?

    ich will dich nur anstupsen das du auf deine gedankenfehler selbst kommst


Anmelden zum Antworten