ComboBox mit Query / mehreren Spalten füllen



  • Ich möchte die Auswahl gerne wieder mit Query (insert) in der Datenbank abspeichern, allerdings in eine andere Tabelle.



  • Kann mir hier keiner helfen ?



  • Die Query-Ergebnisse abklappern, die gewünschten Felder der Datensätze mittels AsString etc. auslesen und zu einem String im gewünschten Format zusammenbasteln, ggf. mit \t als Tabulatorzeichen dazwischen. Der String wird dann einfach als Item zu einer ComboBox hinzugefügt.

    Im OnSelect o.ä. der ComboBox den ItemIndex auswerten. Der entspricht ja der RecNo der Query, somit hast du wieder Zugriff auf den entsprechenden Datensatz und kannst die gewünschten Felder in eine andere Tabelle schreiben oder sonstwas damit machen.



  • Hallo,

    also soweit bin ich nun:

    Query1->Open();
    AnsiString string1, string2, string3, string4, tab;
    while (!Query1->Eof)
    {
     tab=("\t");
     string1=(Query1->FieldByName("Nr")->AsString);
     string2=(Query1->FieldByName("Bezeichnung")->AsString);
     string3=(Query1->FieldByName("Marke")->AsString);
     string4=string1+tab+string2+tab+string3;
     DBComboBox1->Items->Add(string4);
     Query1->Next();
     }
    

    Nur wenn ich in der DBComboBox eine Eintrag auswähle, habe ich folgende Probleme:
    1. Die Auswahl reagiert nicht beziehungsweise bleibt nicht im Feld.
    2. Ich habe hier nur ein Ereigniss "OnEnter" und wie ich hiermit verfahre habe ich keine Ahnung, sorry.
    Kann mir hier einer helfen ? 😞



  • Hallo,

    so habe meine DBComboBox auf den Style "csOwnerDrawFixed" gesetzt.
    So bleibt der Wert ausgewählt und ich kann mit:

    string1=DBComboBox2->Text;
    

    auf den gewählten Eintrag zu greifen.

    Jetzt bleibt nur noch wie bekomme ich den wert (String) in das ürsprüngliche Format ?
    (Inhalt des Strings(1 316 BMW))
    Ich stehe im Moment voll auf dem Schlauch...wie konnte ich einen String durchlaufen und wenn er auf ein "\t" kommt soll er alles davor in einen neuen String schreiben ? 🙄



  • z.B. mit SubString und Pos (AnsiString-Funktionen)



  • Kannst mir hier jemand bei helfen ?
    Ich kann mit SubString und Pos (AnsiString-Funktionen) nix anfangen. *schäm



  • wie wärs mal mit der Suchfunktion oder der Hilfe?



  • Hallo,

    ich habe was gefunden, allerdings stimmt hier noch was nicht bei s3:

    AnsiString s = string1;
    AnsiString s1 = s.SubString(1, s.Pos('\t') - 1);
    AnsiString s2 = s.SubString(s.Pos('\t') + 1, s.Length());
    AnsiString s3 = s.SubString(s.Pos('\t') + 2, s.Length());
    

    Wo liegt hier der Fehler ?



  • Schau dir nochmal an was SubString macht.
    Dann sollte es dich anspringen. 😃

    SubString verändert deinen Quellstring nicht, sondern gibt nur einen neuen String zurück.

    So.. und nu du. 😉



  • Mike_2004 schrieb:

    Nur wenn ich in der DBComboBox eine Eintrag auswähle, habe ich folgende Probleme:
    1. Die Auswahl reagiert nicht beziehungsweise bleibt nicht im Feld.
    2. Ich habe hier nur ein Ereigniss "OnEnter" und wie ich hiermit verfahre habe ich keine Ahnung, sorry.

    Die visuellen DB-Komponenten werden nur benötigt bzw. eingesetzt, wenn es um die direkte Verbindung mit einer Datenquelle geht.
    Beim "händischen" Auslesen und Präsentieren der Daten sollten auch die normalen Komponenten verwendet werden. Also TComboBox statt TDBCombBox.



  • Hallo Zusammen,

    also die Hilfe habe ich mir angesehen.

    Es müßte wie folgt laufen:
    -vom Anfang bis zum 1. Tab
    -vom 1. Tab bis zum 2. Tab
    -vom 2. Tab bis zum Schluss

    AnsiString s;
    AnsiString str1 =("3");
    AnsiString str2 =("316");
    AnsiString str3 =("BMW");
    AnsiString str4 =("\t");
    s=str1+str4+str2+str4+str3;
    cout<<"So sieht der Sting aus"<<s<<"\n";
    AnsiString s1 = s.SubString(1, s.Pos('\t') - 1); //vom Anfang bis zum 1. Tab 
    AnsiString s2 = s.SubString(s.Pos('\t')+1,s.Pos('\t')-1); //vom 1. Tab bis zum 2.
    AnsiString s3 = s.SubString(s.Pos('\t'),s.Length()); //vom 2. Tab bis zum Ende
    cout<<"s1: "<<s1<<"\n";
    cout<<"s2: "<<s2<<"\n";
    cout<<"s3: "<<s3<<"\n";
    getch();
    

    Doch ich bekomme es nicht hin 😞



  • Hallo,

    Das liegt wohl daran, dass Pos dir immer nur die Position des ersten Tabs liefert. Du könntest nach dem ersten Test einen String mit dem Rest nach dem ersten Tab erzeugen und dann in dem suchen etc.

    Ciao



  • Hallo,

    ich habe die Lösung 😃

    AnsiString s;
    AnsiString str1 =("3");
    AnsiString str2 =("316");
    AnsiString str3 =("BMW");
    AnsiString str4 =("\t");
    s=str1+str4+str2+str4+str3;
    cout<<s<<"\n";
    AnsiString s1 = s.SubString(1, s.Pos('\t') - 1);
    AnsiString s2a = s.SubString(s.Pos('\t')+1,s.Length());
    AnsiString s2 = s2a.SubString(1,s2a.Pos('\t')-1);
    AnsiString s3 = s2a.SubString(s2a.Pos('\t')+1,s.Length());
    cout<<" s1: "<<s1<<"\n";
    cout<<" s2: "<<s2<<"\n";
    cout<<" s3: "<<s3<<"\n";
    getch();
    

    Vielen Dank



  • Das ist eine Lösung, aber mit Sicherheit nicht die Lösung. 😉
    Flexibler und effizienter wäre es z.B., den String in einer Schleife auf die Position des Trennzeichens hin zu untersuchen, wobei jeweils der gefundene SubString einschliesslich Trennzeichen gelöscht wird.
    Oder du verwendest TStringList::DelimitedText (ab BCB6).

    Aber wie weiter oben schon gesagt, für dein ursprüngliches Problem brauchst du das Zerpflücken eigentlich gar nicht: da der Index in der ComboBox und die RecNo im Query identisch sind kannst du die gewünschten Felder direkt aus der Query lesen.


Anmelden zum Antworten