ComboBox-Inhalt abhängig vom gewählten Eintrag der 1. ComboBox



  • Hallo,
    ich habe folgendes Problem:

    Ich habe 2 Pulldown-Menüs (ComboBox)
    1. Haendler (CBHaenlder)
    2. Autohaus (CBAutohaus)

    Wenn der Haendler gewählt ist sollen nur noch gewisse Autohäuser ausgewählt werden.
    Dies wollte ich mit der folgenden Query-Abfrage machen:

    void __fastcall Tfrmhwseingabe::CBAutohausEnter(TObject *Sender)
    {
     QAutohaus->SQL->Clear();
     CBAutohaus->Items->Clear();
     AnsiString strAutohaus=' ';
     QAutohaus->SQL->Add("SELECT dbo.Autohaus.Autohaus_Bezeichnung, dbo.Autohaus.Autohaus_Nr, dbo.Autohaus.Haendler_Nr");
     QAutohaus->SQL->Add("FROM dbo.Autohaus INNER JOIN dbo.Autohaus ON dbo.Haendler.Haendler_Nr = dbo.Autohaus.Haendler_Nr");
     QAutohaus->SQL->Add("GROUP BY dbo.Autohaus.Autohaus_Bezeichnung, dbo.Autohaus.Autohaus_Nr, dbo.Autohaus.Haendler_Nr");
     QAutohaus->Open();
     while (!QAutohaus->Eof)
     {
      strAutohaus=(QAutohaus->FieldByName("Autohaus_Bezeichnung")->AsString);
      CBAutohaus->Items->Add(strAutohaus); //Fuegt die Autohaeuser in die ComboBox
      QAutohaus->Next();
     }
    

    Tabelle ->Spalten:
    Autohaus->Autohaus_Bezeichnung,Autohaus_Nr, Haendler_Nr
    Haendler->Haendler_Nr (Und weitere, ich denke hier nicht von Bedeutung)

    Wieso sagt mir der Builder immer Haendler_Nr ist doppelt deklariert ?

    Fehlt hier nicht noch ein HAVING, damit ich mich auf den Haendler beziehen kann ?:
    QAutohaus->SQL->Add("HAVING dbo.Autohaus.Haendler_Nr Like CBHaenlder->Text");



  • Reine SQL-Probleme gehören in's Datenbank-Forum hier.

    Und wozu das manuelle Befüllen der ComboBox? Benutze eine DBComboBox und verbinde sie mit dem gewünschten Feld der Query.



  • Könntest Du mir bitte sagen,
    wie ich das machen kann (Quelltext-mässig) ?

    Vielen Dank



  • So in etwa (meinte natürlich die LookupComboBox, sorry):

    QAutohaus->Open();
    DataSource->DataSet = QAutohaus;
    DBLookupComboBox->KeyField = "Autohaus_Bezeichnung";
    

    Kann man natürlich auch zur Entwurfszeit im OI setzen.



  • Hallo,
    kannst Du mir denn auch bei der SQL Abfrage sagen, warum die nicht funktioniert ?

    Vielen Dank

    (P.S: Vielleicht kann man diesen Thread ja verschieben).



  • warum machst du eigentlich das?

    QAutohaus->SQL->Add("FROM dbo.Autohaus INNER JOIN dbo.Autohaus ON dbo.Haendler.Haendler_Nr = dbo.Autohaus.Haendler_Nr");

    du willst hier die Ergebnisse von 2 Tabellen verbinden, nutzt aber nur eine Tabelle...

    wenn deine Daten nur in einer Tabelle stehen kannst du folgendes versuchen:

    QAutohaus->SQL->Add("SELECT dbo.Autohaus.Autohaus_Bezeichnung, dbo.Autohaus.Autohaus_Nr, dbo.Autohaus.Haendler_Nr");
     QAutohaus->SQL->Add("FROM dbo.Autohaus where dbo.Autohaus.Haendler_Nr = :Haendler_Nr");
     QAutohaus->ParamByName("Haendler_Nr")->AsString = CBHaenlder->Text;
    


  • Sorry, hatte einen Fehler drin:

    void __fastcall Tfrmhwseingabe::CBAutohausEnter(TObject *Sender) 
    { 
     QAutohaus->SQL->Clear(); 
     CBAutohaus->Items->Clear(); 
     AnsiString strAutohaus=' '; 
     QAutohaus->SQL->Add("SELECT dbo.Autohaus.Autohaus_Bezeichnung, dbo.Autohaus.Autohaus_Nr, dbo.Autohaus.Haendler_Nr"); 
     QAutohaus->SQL->Add("FROM dbo.Haendler INNER JOIN dbo.Autohaus ON dbo.Haendler.Haendler_Nr = dbo.Autohaus.Haendler_Nr"); 
     QAutohaus->SQL->Add("GROUP BY dbo.Autohaus.Autohaus_Bezeichnung, dbo.Autohaus.Autohaus_Nr, dbo.Autohaus.Haendler_Nr"); 
     QAutohaus->Open(); 
     while (!QAutohaus->Eof) 
     { 
      strAutohaus=(QAutohaus->FieldByName("Autohaus_Bezeichnung")->AsString); 
      CBAutohaus->Items->Add(strAutohaus); //Fuegt die Autohaeuser in die ComboBox 
      QAutohaus->Next(); 
     }
    

    Und die Frage ob ich hier ein Having benötige ?



  • und wieder meine Frage: warum nutzt du INNER JOIN?

    Und die Frage ob ich hier ein Having benötige ?

    du kannst auch WHERE nehmen (siehe mein Beispiel)



  • Hallo,

    nun habe ich mit Where aber folgendes Problem:
    1. ComboBox

    void __fastcall TForm1::CBHaendlerEnter(TObject *Sender)
    {
     QHaendler->SQL->Clear();
     CBHaendler->Items->Clear();
     AnsiString strHaendler=' ';
     QHaendler->SQL->Add("SELECT *");
     QHaendler->SQL->Add("FROM Haendler");
     QHaendler->Open();
     while (!QHaendler->Eof)
     {
      strHaendler=(QHaendler->FieldByName("Haendler_Nr")->AsString);
      CBHaendler->Items->Add(strHaendler); //Fuegt die Haendler in die ComboBox
      QHaendler->Next();
     }
    }
    

    Hier kann ich nun die Haendler_Nr auswählen, aber nicht den Namen.

    2. ComboBox - Auswahl abhängig von ComboBox 1

    void __fastcall TForm1::CBAutohausEnter(TObject *Sender)
    {
     QAutohaus->SQL->Clear();
     CBAutohaus->Items->Clear();
     AnsiString strAutohaus=' ';
     QAutohaus->SQL->Add("SELECT Autohaus_Bezeichnung, Autohaus_Nr, Haendler_Nr");
     QAutohaus->SQL->Add("FROM Autohaus where Autohaus.Haendler_Nr = :Haendler_Nr");
     QAutohaus->ParamByName("Haendler_Nr")->AsString = CBHaendler->Text;
     QAutohaus->Open();
     while (!QAutohaus->Eof)
     {
      strAutohaus=(QAutohaus->FieldByName("Autohaus_Bezeichnung")->AsString);
      CBAutohaus->Items->Add(strAutohaus); //Fuegt die Autohaeuser in die ComboBox
      QAutohaus->Next();
     }
    }
    

    Ich möchte aber gerne nicht die Haendler_Nr in der 1. ComboBox sehen, sondern den Namen. Und ich denke hier brauche ich dann ein Join, oder ?



  • dann versuch mal das:

    void __fastcall TForm1::CBAutohausEnter(TObject *Sender)
    {
     QAutohaus->SQL->Clear();
     CBAutohaus->Items->Clear();
     AnsiString strAutohaus=' ';
     QAutohaus->SQL->Add("SELECT dbo.Autohaus.Autohaus_Bezeichnung, dbo.Autohaus.Autohaus_Nr, dbo.Autohaus.Haendler_Nr"); 
     QAutohaus->SQL->Add("FROM dbo.Haendler INNER JOIN dbo.Autohaus ON dbo.Haendler.Haendler_Nr = dbo.Autohaus.Haendler_Nr"); 
     QAutohaus->SQL->Add("WHERE [b]dbo.Haendler.Haendler_Name [/b]= :Haendler_name ");
     QAutohaus->SQL->Add("GROUP BY dbo.Autohaus.Autohaus_Bezeichnung, dbo.Autohaus.Autohaus_Nr, dbo.Autohaus.Haendler_Nr"); 
     QAutohaus->ParamByName("Haendler_Name")->AsString = CBHaendler->Text;
     QAutohaus->Open();
     while (!QAutohaus->Eof)
     {
      strAutohaus=(QAutohaus->FieldByName("Autohaus_Bezeichnung")->AsString);
      CBAutohaus->Items->Add(strAutohaus); //Fuegt die Autohaeuser in die ComboBox
      QAutohaus->Next();
     }
    }
    

    bei dem dick geschriebenen mußt du allerdings deine Spaltenbezeichnung einsetzen



  • 👍
    Vielen Dank ! Genauso wollte ich das auch haben.
    An der Stelle nochmal ein Danke an "Jansen".


Anmelden zum Antworten