Problem beim auslesen der combobox



  • hallo ihr da draussen!
    folgendes problem hab ich:
    ich bin gerade über beim programmieren einer personalverwaltung mit access-datenbankanbindung.da hab ich einen dialog zum bearbeiten der mitarbeiter.
    ich wähl mir den mitarbeiter aus einer combobox aus und kann dann seine eigenschaften,die in verschiedenen text-feldern stehen,anschauen und in danebenstehenden edit-feldern die mitarbeiter-eigenschaften ändern.da klappt auch alles.es wird alles in die datenbank richtig übernommen,aber wenn ich dann einen anderen mitrbeiter aus der combobox auswähle,stimmen seine eigenschaften nicht mehr.es werden eigenschaften eines anderen mitarbeiters angezeigt.

    hier nun der code:

    CComboBox * pPersonalNeu;				
    pPersonalNeu = (CComboBox *) GetDlgItem(IDC_COMBO_MitarbeiterbearbeitenPersonalgruppe);
    CComboBox * pMitarbeiter;				
    pMitarbeiter = (CComboBox *) GetDlgItem(IDC_COMBO_MitarbeiterbearbeitenAuswahl);
    CEdit * pPersonalnummerNeu;
    pPersonalnummerNeu = (CEdit *) GetDlgItem(IDC_EDIT_MitarbeiterbearbeitenPersonalnummerneu);
    CEdit * pVornameNeu;
    pVornameNeu = (CEdit *) GetDlgItem(IDC_EDIT_MitarbeiterbearbeitenVornameneu);
    CEdit * pNachnameNeu;
    pNachnameNeu = (CEdit *) GetDlgItem(IDC_EDIT_MitarbeiterbearbeitenNachnameneu);
    CEdit * pGeburtsdatumNeu;
    pGeburtsdatumNeu = (CEdit *) GetDlgItem(IDC_EDIT_MitarbeiterbearbeitenGeburtsdatumneu);
    CStatic * pPersonalgruppeAlt;
    pPersonalgruppeAlt = (CStatic *) GetDlgItem(IDC_STATIC_MitarbeiterbearbeitenMitarbeiterdatenPersonalgruppeanzeigenalt);
    CStatic * pPersonalnummerAlt;
    pPersonalnummerAlt = (CStatic *) GetDlgItem(IDC_STATIC_MitarbeiterbearbeitenMitarbeiterdatenPersonalnummeranzeigenalt);
    CStatic * pVornameAlt;
    pVornameAlt = (CStatic *) GetDlgItem(IDC_STATIC_MitarbeiterbearbeitenMitarbeiterdatenVornameanzeigenalt);
    CStatic * pNachnameAlt;
    pNachnameAlt = (CStatic *) GetDlgItem(IDC_STATIC_MitarbeiterbearbeitenMitarbeiterdatenNachnameanzeigenalt);
    CStatic * pGeburtsdatumAlt;
    pGeburtsdatumAlt = (CStatic *) GetDlgItem(IDC_STATIC_MitarbeiterbearbeitenMitarbeiterdatenGeburtsdatumalt);
    
    int zaehler=0;
    CString select = "";
    CString mitarbeitername = "";
    select = "select * FROM Mitarbeiter";
    CString sODBCName = "Personal";
    CDatabase dbPersonal;
    MitarbeiterTbl personal(&dbPersonal);
    
    CString strPersonalNeu="";
    CString strPersonalnummerNeu="";
    CString strVornameNeu="";
    CString strNachnameNeu="";
    CString strGeburtsdatumNeu="";
    CString strName="";
    
    pPersonalNeu->GetLBText(pPersonalNeu->GetCurSel(),strPersonalNeu);
    pPersonalnummerNeu->GetWindowText(strPersonalnummerNeu);
    pVornameNeu->GetWindowText(strVornameNeu);
    pNachnameNeu->GetWindowText(strNachnameNeu);
    pGeburtsdatumNeu->GetWindowText(strGeburtsdatumNeu);
    
    dbPersonal.Open(sODBCName);
    if(dbPersonal.IsOpen())
    {
    	personal.Open(CRecordset::snapshot,select);
    	if(personal.IsBOF())
    	{			
    	}
    	else
    	{
    		while(!personal.IsEOF())
    		{
    			personal.MoveFirst();
    			for(int i=0;i<pMitarbeiter->GetCurSel();i++)personal.MoveNext();
    			pMitarbeiter->DeleteString(pMitarbeiter->GetCurSel());
    			personal.Edit();
    			personal.m_Personalgruppe=strPersonalNeu;
    			personal.m_Personalnummer="PN-" + strPersonalnummerNeu;
    			strName = strVornameNeu + " " + strNachnameNeu;
    			personal.m_Vorname=strVornameNeu;
    			personal.m_Nachname=strNachnameNeu;
    			personal.m_Geburtsdatum=strGeburtsdatumNeu;
    			pPersonalgruppeAlt->SetWindowText(personal.m_Personalgruppe);
    			pPersonalnummerAlt->SetWindowText(personal.m_Personalnummer);
    			pVornameAlt->SetWindowText(personal.m_Vorname);
    			pNachnameAlt->SetWindowText(personal.m_Nachname);
    			pGeburtsdatumAlt->SetWindowText(personal.m_Geburtsdatum);
    			pMitarbeiter->SetCurSel(pMitarbeiter->InsertString(-1,strName));
    			personal.Update();
    			break;
    			zaehler++;
    		}
    	}
    }
    dbPersonal.Close();
    pPersonalNeu->SetCurSel(-1);			//leeren text in combobox einfuegen
    pPersonalnummerNeu->SetWindowText("");	//leeren text einfuegen
    pVornameNeu->SetWindowText("");		//leeren text einfuegen
    pNachnameNeu->SetWindowText("");		//leeren text einfuegen
    pGeburtsdatumNeu->SetWindowText("");	//leeren text einfuegen
    

    ich hoffe mal,ihr könnt mir helfen
    mfg
    fevernova



  • Wo ich da gerade diese elendig langen IDC_... sehe:
    Gibt es für die nicht eine Maximallänge? Lag die nicht irgendwo bei 30 Zeichen? Korrigiert mich, wenn ich falsch liege! Fällt nur echt auf.

    So, jetzt zu deinem Problem:
    Könnte es sein, dass du bei der Auswertung des Indexes einen Fehler machst? Dein Quellcode zeigt soweit keinen für mich ersichtlichen Fehler, aber ich frage mich: Du sagst, dass der Fehler auftritt, wenn du einen anderen Eintrag aus der Combobox wählst, zeigst aber den Code fürs laden. Der andere Code wäre vielleicht auch noch hilfreich (OnSelchage...).



  • hast ja recht,so krieg ichs aber am besten gebacken.

    hier die OnSelchange - funktion:

    CComboBox * pMitarbeiterAuswahl;				
    pMitarbeiterAuswahl = (CComboBox *) GetDlgItem(IDC_COMBO_MitarbeiterbearbeitenAuswahl);
    CStatic * pPersonalgruppeAlt;
    pPersonalgruppeAlt = (CStatic *) GetDlgItem(IDC_STATIC_MitarbeiterbearbeitenMitarbeiterdatenPersonalgruppeanzeigenalt);
    CStatic * pPersonalnummerAlt;
    pPersonalnummerAlt = (CStatic *) GetDlgItem(IDC_STATIC_MitarbeiterbearbeitenMitarbeiterdatenPersonalnummeranzeigenalt);
    CStatic * pVornameAlt;
    pVornameAlt = (CStatic *) GetDlgItem(IDC_STATIC_MitarbeiterbearbeitenMitarbeiterdatenVornameanzeigenalt);
    CStatic * pNachnameAlt;
    pNachnameAlt = (CStatic *) GetDlgItem(IDC_STATIC_MitarbeiterbearbeitenMitarbeiterdatenNachnameanzeigenalt);
    CStatic * pGeburtsdatumAlt;
    pGeburtsdatumAlt = (CStatic *) GetDlgItem(IDC_STATIC_MitarbeiterbearbeitenMitarbeiterdatenGeburtsdatumalt);
    
    int stelle=0;
    CString select = "";
    select = "select * FROM Mitarbeiter";
    CString sODBCName = "Personal";
    CDatabase dbPersonal;
    MitarbeiterTbl mitarbeiter(&dbPersonal);
    dbPersonal.Open(sODBCName);
    if(dbPersonal.IsOpen())
    {
    	mitarbeiter.Open(CRecordset::snapshot,select);
    	if(mitarbeiter.IsBOF())
    	{
    	}
    	else
    	{
    		while(!mitarbeiter.IsEOF())
    		{
    			for(int i=0;i<pMitarbeiterAuswahl->GetCurSel();i++)mitarbeiter.MoveNext();
    			pPersonalgruppeAlt->SetWindowText(mitarbeiter.m_Personalgruppe);
    			pPersonalnummerAlt->SetWindowText(mitarbeiter.m_Personalnummer);
    			pVornameAlt->SetWindowText(mitarbeiter.m_Vorname);
    			pNachnameAlt->SetWindowText(mitarbeiter.m_Nachname);
    			pGeburtsdatumAlt->SetWindowText(mitarbeiter.m_Geburtsdatum);
    			stelle++;
    			break;
    		}
    	}
    }
    dbPersonal.Close();
    

    ich denk mal das reicht.
    mfg
    fevernova



  • Hmm, also ich werd noch ein paar mal über den Text lesen, aber was mir nicht aus dem Kopf geht:

    Könnte es sein, dass deine Combobox sortiert wird? Dann würde ich nämlich verstehen, warum der falsche Mitarbeiter gefunden wird.

    Achja, du hast geschrieben, dass das Problem erst auftritt, nachdem du einen Mitarbeiter geändert hast. Könnte es sein, dass dort etwas durcheinander kommt? Oder lädst du danach neu?



  • also sortiert wird die nicht.ich denk mal ich lese dann das falsche aus der datenbank.
    😡



  • Hallo,
    also ich empfehle Dir dringend das mit der ComboBox anders zu machen. Bei Dir ist z.Z. alles indexbasiert. Das hatte ich auch mal so. Und dann lässt man die ComboBox einmal sortieren und nichts geht mehr. Schau Dir mal die CCombobox-Methoden SetItemDataPtr und GetItemDataPtr an und wenn das nicht reicht ist hier http://www.codeproject.com/combobox/combobox_tut.asp auch noch was schönes. Dann sind die Daten nämlich unabhängig vom Index. 🙂



  • Du liest beide mal das selbe aus der DB. Ich glaube nicht dass es daran liegt.

    Folge dem Ratschlag von Cosmixx.


Anmelden zum Antworten