Einbindung einer Datenbank in eine Unteransicht



  • Bartnelke schrieb:

    da muss zwischen den Variablennamen und deAddString bzw. SetItemData ein Pfeil hin und den habe ich nicht gemacht, weil in dem Artikel das ganze mit Punkt steht.

    Och, woher soll ich denn wissen, dass du mit einem Zeiger arbeitest? 🙄
    Solche Anpassungen fallen unter Grundwissen, was ich voraussetze.

    m_Vorlesender kann ich im Recordset nicht finden.
    Wie identifizierst du denn die Datensätze eindeutig? Mir fehlt da sowas wie eine ID. 😕
    (Datenbankdesign-Grundlagen.)



  • Die ID ist die Nummer.
    Und m_Name und m_Vorlesender sollten verglichen werden und gleich sein um es zu löschen.
    🙂 🙂 🙂



  • Dann mach doch mal ne Schleife, die abbricht, wenn die gleich sind.
    Schon hast du die Funktion zum Raussuchen der zu löschenden Zeile. 🙂

    (Morgen früh gibts dann die ausführliche Erklärung wenn es nicht klappt. Bin müde und hab kein VC hier. 🙂 )



  • Mein Vorschlag für den Löschvorgang:

    void Dozent2::OnBnClickedLoeschen()
    {
    	CTabelle1 m_TabelleDozent;
    m_TabelleDozent.Open();
    
    if ((m_TabelleDozent.m_Name == m_Vorlesender) && (!m_TabelleDozent.IsEOF()))
        {
            // Schon gefunden
            //return true;
        }
        else
        {
            // Einmal über alle Datensätze laufen
            if (m_TabelleDozent.IsBOF())
            {
            }
            else
            {
                // Vorne anfangen
                m_TabelleDozent.MoveFirst();
                while(!m_TabelleDozent.IsEOF())
                {
                    // Stimmt die Kombination?
    				if (m_TabelleDozent.m_Name == m_Vorlesender)
                    {
                        // return true;// Fertig und raus
                    }
                    m_TabelleDozent.MoveNext(); // Weiter
                }}} 
    
    m_TabelleDozent.Delete(); // Diese Zeile löschen
    if (!m_TabelleDozent.Update())
    {
        AfxMessageBox(_T("Es wurde nicht gelöscht."));
    }
    m_TabelleDozent.Requery();
    }
    

    Als Fehlermeldung kommt noch Operation ist fehlgeschlagen; es gibt keinen aktuellen Datensatz.



  • Als Fehlermeldung kommt noch Operation ist fehlgeschlagen; es gibt keinen aktuellen Datensatz.

    Hast du mal debugged?
    Ich vermute, du hast nix gefunden und versuchst nun hinter dem EOF zu löschen.

    Die oberste if ist überflüssig. Es reicht die in der Schleife.
    Und löschen würde ich in der if in Zeile 24.
    Und dann einfach return nach dem Update.

    Requery kannst du weglassen, weil du gleich danach das Recordset "löschst" (Funktion zuende).

    Soo, dann sortier mal um.
    Drin ist eigentlich schon alles was du brauchst. 🙂



  • Es kommt jetzt Versuch zu aktualisieren oder löschen ist fehlgeschlagen.
    Woran liegt es???

    void Dozent2::OnBnClickedLoeschen()
    {
    	CTabelle1 m_TabelleDozent;
    m_TabelleDozent.Open();
    
    if (m_TabelleDozent.IsBOF())
    {
                // Das Recordset ist leer
    }
    else
    {
       // Vorne anfangen
    	m_TabelleDozent.MoveFirst();
    	while(!m_TabelleDozent.IsEOF())
         {
           // Stimmt die Kombination?
    	if (m_TabelleDozent.m_Name == m_Vorlesender)
          {
              m_TabelleDozent.Delete(); // Diese Zeile löschen     
    		  // return true;// Fertig und raus
          }
                    m_TabelleDozent.MoveNext(); // Weiter
                }} 
    
    if (!m_TabelleDozent.Update())
    {
    	return;
        AfxMessageBox(_T("Es wurde nicht gelöscht."));
    }
    }
    

    Danke. 🙂 🙂 🙂



  • MSDN CREcordset::Delete() schrieb:

    Caution The recordset must be updatable and there must be a valid record current in the recordset when you call Delete; otherwise, an error occurs. For example, if you delete a record but do not scroll to a new record before you call Delete again, Delete throws a CDBException.

    Woher bekommst du den Inhalt deiner Abfrage?

    PS: Anweisungen nach dem return sind übrigens sinnlos 😉



  • Tja, das können 1000 Sachen sein.
    Da musste mal debuggen.



  • Bei dem Debuggen kommt aber keine Meldung.



  • Zum Debuggen guck mal ins Magazin wie man das angeht.
    Der Debugger schmeißt dir die Lösung in den seltensten Fällen schön zurechtgelegt und ausformuliert vor die Füße.



  • Warning: no listbox item selected.,
    Warning: ODBC Success With Info, Fehler bei SQLSetConnectAttr-Aufruf für Treiber
    und
    Error: must enter Edit or AddNew mode before updating.

    das sind die Zeilen, die mir der Debugger anzeigt.
    Ich hoffe, dass mir jemand helfen kann. 😕 😕



  • Bartnelke schrieb:

    Error: must enter Edit or AddNew mode before updating.

    Bartnelke schrieb:

    void Dozent2::OnBnClickedLoeschen()
    {
    	CTabelle1 m_TabelleDozent;
    m_TabelleDozent.Open();
    
    if (m_TabelleDozent.IsBOF())
    {
                // Das Recordset ist leer
    }
    else
    {
       // Vorne anfangen
    	m_TabelleDozent.MoveFirst();
    	while(!m_TabelleDozent.IsEOF())
         {
           // Stimmt die Kombination?
    	if (m_TabelleDozent.m_Name == m_Vorlesender)
          {
              m_TabelleDozent.Delete(); // Diese Zeile löschen     
    		  // return true;// Fertig und raus
          }
                    m_TabelleDozent.MoveNext(); // Weiter
                }} 
    
    if (!m_TabelleDozent.Update())
    {
    	return;
        AfxMessageBox(_T("Es wurde nicht gelöscht."));
    }
    }
    

    Also, ich denke mal die Meldung kommt in Zeile 26.
    Und zwar nur, wenn er NICHT in Zeile 19 vorbeigekommen ist.

    Salopp gesagt: Was soll ich hier updaten, ich hab doch nix gelöscht. 😉



  • Und wie kann ich das Problem lösen???

    Danke.



  • Och, also langsam komme ich mir komisch vor... 🙄

    Du sortierst entweder deinen Code um - oder du machst ne bool Variable, die du setzt, wenn gelöscht wurde und prüfst die verher.



  • Sorry, aber manchmal stehe ich bei dem Programm auf dem Schlauch...

    Ich füge mal den geänderten Code ein.
    Er löscht immer noch nicht.

    void Dozent2::OnBnClickedLoeschen()
    {
    	CTabelle1 m_TabelleDozent;
    m_TabelleDozent.Open();
    
    if (m_TabelleDozent.IsBOF())
    {
                // Das Recordset ist leer
    }
    else
    {
       // Vorne anfangen
    	m_TabelleDozent.MoveFirst();
    	while(!m_TabelleDozent.IsEOF())
         {
           // Stimmt die Kombination?
    	if (m_TabelleDozent.m_Name == m_Vorlesender)
          {
              m_TabelleDozent.Delete(); // Diese Zeile löschen     
    		  if (!m_TabelleDozent.Update())
    			{
    			AfxMessageBox(_T("Es wurde nicht gelöscht."));
    			return;
    			}
          }
               m_TabelleDozent.MoveNext(); // Weiter
                }} 
    }
    

    Wäre schön, wenn ihr mir weiterhelfen könnt.



  • 1. Nutze bitte ab jetzt Code-Tags.
    2. Ist dein Code immer so unformatiert und chaotisch?
    Markier den Code mal und drück Atl+F8. 😉
    Bei so einem Durcheinander muss man ja den Durchblick verlieren. :p
    3. Setz bitte mal einen Breakpoint in Zeile 17 und schau dir dort für JEDEN Durchlauf die Inhalte von m_TabelleDozent.m_Name und m_Vorlesender an.
    Sind die jemals gleich? Werden die Zeilen 19 bis 24 überhaupt durchlaufen?



  • Erster Blick in MSDN sagt:
    Unlike AddNew and Edit, a call to Delete is not followed by a call to Update.



  • isabeau schrieb:

    Erster Blick in MSDN sagt:
    Unlike AddNew and Edit, a call to Delete is not followed by a call to Update.

    Ups, danke. 😮
    Wieso hat der bei mir noch nie gemeckert? 😕



  • Auch wenn es jetzt ne ganz banale Frage ist:
    Wenn ich auf ein Element in einer Listbox klicke, nimmt dann meine Variable automatisch den Wert an???
    Für den Breakpoint muss ich keine Bedingung einfügen, oder???

    Danke.



  • Bartnelke schrieb:

    Für den Breakpoint muss ich keine Bedingung einfügen, oder?

    Nein, einfach nur gucken was in den Variablen steht.
    Damit beantwortet sich dann auch deine erste Frage, denke ich.

    Steht nicht das erwartete in m_Vorlesender, dann weißt du, wieso es nicht klappt. 😉


Anmelden zum Antworten