Inhalt einer DB-Combo-Box wird nicht gepostet



  • Hallo,

    Ich bin der Kollege von Titanico.

    Ich bin momentan dabei mir den Schlüssel einer Tabelle aus mehreren Feldern zusammenzubasteln.

    Das Schlüsselfeld hat 15 Zeichen (12 Zeichen die für 3 Felder bestimmt sind und 3 Zeichen falls eine Schlüssel der zusammengebaut werden soll bereits vorhanden ist. In diesem Fall werden die 3 letzten Felder mit einem Bindestrich und einer 2-stelligen fortlaufenden Nummer gefüllt).

    die 3 Felder die ich benutze sind DB-Edit Felder.

    Der Zusammenbau des Strings den ich in das Schlüsselfeld eintragen will klappt einwandfrei (Auch der Zusammenbau im Fehlerfall).
    Auch das Posten wenn der Schlüssel beim ersten mal eindeutig ist klappt einwandfrei mit allen Feldinhalten (auch das der Combo Box).

    Das Problem das ich habe tritt auf wenn ich die Werte die ich vorher alle gerettet habe falls der Schlüssel neu gebaut wird wieder posten möchte.

    Die DB-Edit Felder und das generierte neue eindeutige Schlüsselfeld werden in die Tabelle gepostet, der Inhalt meines DB-Combo-Box Feldes allerdings wird
    genau beim bearbeiten der zeile in der ich poste auf ItemIndex=-1 gesetzt und somit bleibt das Feld Softwareart beim Posten leer.
    Wenn ich nachträglich nach dem posten per hand das Feld wieder verändere und mir einen Wert aussuche und Poste wird er Übernommen.

    Was mache ich falsch?
    Bevor ich Poste setze ich doch das Combo Box Feld wieder auf den Wert wie es sein müsste..
    Im Objektinspektor habe ich als Style csDropDownList gewählt.

    Hier ein Auszug des Quelltextes:

    void __fastcall TFORsoftwarebearbeiten::SBTspeichernClick(TObject *Sender)
    {
    AnsiString k = ""; //String erstellen in dem das Softwarekuerzel gespeichert wird
    char x; //letzte Stelle im Schlüssel
    char y; //vorletzte Stelle im Schlüssel
    
    // Stringlänge von Nachname und Vorname ermitteln und in 2 Variablen speichern
    int laengehersteller=DBEhersteller->GetTextLen();
    int laengebezeichnung =DBEbezeichnung ->GetTextLen();
    int laengeversion =DBEversion ->GetTextLen();
    int gesamtlaenge =laengehersteller+laengebezeichnung+laengeversion;
    int hilf =0;
    
    // Inhalte der DBEdit-Felder in Strings zwischenspeichern weil falls das
    // Softwarekürzel bereits existiert der Insert Modus verlassn werden muss um
    // eine neue Kennung automatisch zu generieren.
    AnsiString hst, bez, ver, swa;
    int index=0;
    
    try
     {
     if (DBEsoftwarekuerzel->Text == "") //Softwarkürzel anlegen einmalig, nicht
                                         //beim bearbeiten
      {
      //Abhängig von der Länge des Herstellers,der Bezeichnung und Version wird
      //ein String erzeugt der <=12 Zeichen ist.
      //Normalerweise 4 Zeichen des Herstellers,4 der Bezeichnung und 4 der Version.
      //Falls die länge < 4 Zeichen ist,wird versucht von den anderen entsprechend
      //mehr Zeichen zu nehmen.
      Schlüssel zusammenbauen
      .
      .
      .
      }
    
     //Falls die Pflichtfelder ausgefüllt sind
     if (DBEhersteller->Text != "" && DBEbezeichnung->Text != "" && DBEversion->Text != "" &&
         DBCsoftwareart->Text != "" )
      {
      //Setze Ausscheidedatum abhängig von der Check Box
      if (DBHinaktiv->Checked == true)
       {
       DBEinaktivdatum->Text = DateToStr(Date());
       }
      else if (DBHinaktiv->Checked == false)
       {
       DBEinaktivdatum->Text = "";
       }
    
      if (DBEsoftwarekuerzel->Text == "")
       {
       //den gebauten Kennungsstring ins Kennungsfeld schreiben
       DBEsoftwarekuerzel->Text = k;
       DBEanlegedatum->Text = DateToStr(Date());
       }
      TIMmeldungen->Enabled = true;
      if (DTMsoftware->TABsoftware->State == dsInsert)
       STBsoftware->Panels->Items[0]->Text = " Datensatz hinzugefügt";
      else
       STBsoftware->Panels->Items[0]->Text = " Datensatz gespeichert";
      //Datensatz speichern
      DTMsoftware->TABsoftware->Post();
      }
    
     //Falls nicht alle Pflichtfelder ausgefüllt sind
     else
      {
      ShowMessage("Bitte alle mit * gekennzeichneten Pflichtfelder ausfüllen!");
      }
     }
    
    catch(...)      //Fehlerfall:
                    //Kennung bereits vorhanden.
                    //Nun wird eine neue Kennung automatisch generiert
                    //indem das letzte bzw je nach Anzahl noch das vorletzte Zeichen
     {              //eine Fortlaufende Ziffer erhalten.
     //Inhalte der DBEdit-Felder retten
     hst = DBEhersteller->Text;
     bez = DBEbezeichnung->Text;
     ver = DBEversion->Text;
     swa = DBCsoftwareart->Text;
     index = DBCsoftwareart->ItemIndex;
    
     x='1'; //letztes Zeichen der Kennung
     y='0'; //vorletztes Zeichen der Kennung
    
     //bisher gemachte Eingaben rückgängig machen
     //wird benötigt weil sonst der Suchfilter nicht
     //aktiviert werden kann.
     DTMsoftware->TABsoftware->Cancel();
     //String wird im Fehlerfall um 3 Zeichen verlängert um Kennungnummer anzuhängen
     k = k + "   ";
     int i=gesamtlaenge;
     do      // Neue Kennung automatisch generieren und überprüfen ob die
      {      // geänderte Kennung gepostet werden kann
    
      if(gesamtlaenge > 12)
       {
       i=12;
       }            //Hinter das Letzte Zeichen der Kennung das Trennzeichen
      k[i+1] = '-'; //einfügen damit sichtbare Trennung zur Versionsnummer.
      k[i+2] = y;   //Vorletzte Stelle des Strings für die Zehnerstellen,
      k[i+3] = x;   //letzte Stelle des Strings für die Einerstellen.
      if (x == ':') //Da x am ende erhöht wird wir aber die 9 darstellen
       {            //können wollen muss das erhöhte Zeichen abgefangen werden '9' +1 =':'
       x = '0';     //wenn im letzten Durchlauf die 9 angefügt wurde,
       y++;         //x nullsetzen und Zehnestelle erhöhen.
       k[i+1] = '-';
       k[i+2]  =y;
       k[i+3] = x;
       }
    
      x++;  //Zeichen erhöhen
    
            // Datenbank in den Browsemodus bringen indem wir die bisher gemachte
            // Eingabe abbrechen (Der Inhalt der Edit Felder wurde ja gerettet)
      DTMsoftware->TABsoftware->Cancel();
    
      //automatisch geänderte Kennung als Filter eingeben und in der Datenbank
      //schauen ob es diese Kennung gibt.
      //Dies ist der Fall solange RowCount als Ergebnis 1 liefert
      //Falls das der Fall sein sollte wird die do-while Schleife erneut durchlaufen
      //Solange bis eine Kennung generiert wurde die einmalig ist.
      DTMsoftware->TABsoftware->Filter = "Softwarekuerzel = '"+UpperCase(k)+"'";
      DTMsoftware->TABsoftware->Filtered = true;
      }
     while (DTMsoftware->TABsoftware->RecordCount >= 1);
    
     //Wenn eine Kennung generiert wurde die einmalig ist Datenbank wieder in den
     //Insert Modus bringen und gerettete Inhalte zurück in die DBEdit-Felder schreiben
     DTMsoftware->TABsoftware->Insert();
     DBEanlegedatum->Text = DateToStr(Date());
     DBCsoftwareart->ItemIndex=index; //an der Stelle hier ist ja eigentlich doppelt gemacht,
                                //meiner Meinung nach sollte das ja über 
                                //den Item Index oder über den Text der drin 
                                //steht gehen..........
     DBCsoftwareart->Text =swa;
     DBEsoftwarekuerzel->Text = k;
     DBEhersteller->Text = hst;
     DBEbezeichnung->Text = bez;
     DBEversion->Text= ver;
    
     try  // den geänderten Datensatz anzulegen
      {
      DTMsoftware->TABsoftware->Post();//sobald diese zeile erreicht ist
                                       //und ausgeführt wird
                                       //"vergisst" meine Combo Box
                                       //den ItemIndex bzw den Text den ich
                                       //ihr zugewiesen habe und das Feld in
                                       //der Tabelle ist leer weil ItemIndex=-1
      // Den Filter mit der geänderten Kennung laden damit man gleich wieder
      // an der richtigen Stelle steht.
      // Durch das Cancel würde man sonst wieder am Anfang der Datenbank stehen.
      DTMsoftware->TABsoftware->Filter = "Softwarekuerzel = '"+UpperCase(k)+"'";
      DTMsoftware->TABsoftware->Refresh();
      //Position des Datenzeigers sichern um Filter wieder abschalten zu können,
      //danach wird zum gespeicherten Datensatz gesprungen und Bookmark-Objekt
      //wieder freigegeben
      TBookmark SavePosition;
      SavePosition = DTMsoftware->TABsoftware->GetBookmark();
      DTMsoftware->TABsoftware->Filtered = false;
      DTMsoftware->TABsoftware->GotoBookmark(SavePosition);
      DTMsoftware->TABsoftware->FreeBookmark(SavePosition);
      }
     catch(...) // Worst Case
      {
      ShowMessage("Softwarekuerzel konnte nicht erstellt werden \n überprüfen Sie ihre Eingabe ");
      }
     TIMmeldungen->Enabled = true;
     STBsoftware->Panels->Items[0]->Text = " Datensatz hinzugefügt";
     }
    }
    //---------------------------------------------------------------------------
    

    Im vorraus schonmal danke schön,hoffe ich hab alles verständlich erklärt.



  • Ich komm einfach nicht weiter 😞

    ich könnte natürlich mit einem unsichtbaren DB-Edit Feld arbeiten in das ich den String den ich aus der Combo-Box gerettet habe hineinschreibe und poste,aber das sollte doch eigentlich problemlos gehen mit einer DB Combo Box...

    Ich dreh mich hier im Kreis.

    Hauptsächlich verwirrt mich halt das wenn das Ereignis vom Benutzer ausgelöst wird beim ersten mal,funktioniert es,auch wenn ich nach der automatischen Schlüsselgeneration es als Benutzer neu auswähle und erneut Poste, übernimmt er die Änderungen.

    Nur wenn ich den Inhalt der DB-Combo-Box im Programm ändere bei meiner automatischen Schlüsselgeneration bei Schlüsselgleichheit verliere ich den Inhalt in der Combo Box beim Posten.

    😕 😕 😕

    Schlumpf_


Anmelden zum Antworten