Visual C++ MFC Datenbankprogrammierung Tutorial 3


Datenbankbeispiel 3: Dynamische Filterung mit CListCtrl und SQL

Einleitung

In diesem dritten Datenbank-Tutorial zeige ich, wie man mit Visual C++ und MFC (Microsoft Foundation Classes) eine Datenbankanwendung erstellt, die dynamische Filterung von Datensätzen ermöglicht. Um diese Anleitung nicht zu lang werden zu lassen, schreibe ich immer nur die Dinge auf, die verändert werden müssen. Bei Codeabschnitten werden die Teile, die von mir verändert wurden, fett geschrieben.


Praktisches Beispiel

Aufgabenstellung

Suchen Sie mit dem Explorer die MS-Beispieldatenbank "Nordwind". Es kann sein, dass diese nicht installiert ist.

Erstellen Sie ein Programm, das die Attribute "Artikelnummer" und "Artikelname" der Tabelle "Artikel" in einem CListCtrl anzeigt.
Wird eine Zahl in das Editfeld eingegeben und mit "Show" bestätigt, werden nur noch die Datensätze angezeigt, bei denen das Attribut "BestellteEinheiten" gleich dem eingegebenen Wert ist.

Lösung - Schritt für Schritt Anleitung

  1. Neues Projekt anlegen in Visual C++:
  2. Dialog-Design erstellen:
    Es werden nur eine ListBox (CListCtrl), ein Eingabefeld (Edit Control) und ein Button ("Show") benötigt.
    Screenshot: Dialog-Design mit ListBox, Edit-Feld und Button
  3. Steuerelemente mit Membervariablen verbinden:
    Dazu muss der Klassenassistent geöffnet werden (Strg+W oder über das Menü View -> ClassWizard).
    Screenshot: ClassWizard für Membervariablen-Zuordnung
  4. Event-Handler für den "Show"-Button erstellen:
    Die ListBox muss mit gefilterten Daten befüllt werden, wenn auf den Button "Show" gedrückt wird. Hierfür muss ein Event-Handler im Klassenassistenten erstellt werden. Alternativ kann man in der Ressourcenansicht einen Doppelklick auf den Button machen und die Erstellung mit "OK" bestätigen.
    void CDb3View::OnButton1() 
    {
        // Zwischenspeicher für das Formatieren des Strings
        // und Konvertierung einer Int-Zahl in einen CString
        CString zwsp;
    
        // Kopieren der in dem Editfeld angezeigten Information
        // in die dazugehörige Klassenvariable
        UpdateData();
        
        // Löschen vorheriger Einträge der Listbox
        m_list.ResetContent();
    
        // Öffnen der Datenbank, wenn sie noch nicht offen ist
        // (wird normalerweise nicht gebraucht, aber zur Sicherheit)
        if (!m_pSet->IsOpen())
            m_pSet->Open();
    
        // Nur Datensätze anzeigen, deren Attribut "BestellteEinheiten" 
        // gleich der eingegebenen Zahl ist - dazu wird ein Filter aktiviert
        // m_strFilter ist eine CString Membervariable der Klasse CRecordSet
        // und enthält den Teil der SQL-Klausel, der nach "WHERE" folgt
        m_pSet->m_strFilter.Format("[BestellteEinheiten]=%d", m_zahl);
        
        // Das CRecordSet muss unter Anwendung des Filters neu geladen werden
        m_pSet->Requery();
    
        // Alle gefilterten Datensätze durchlaufen
        while (!m_pSet->IsEOF())
        {
            // Formatierte Ausgabe: "Artikelnummer; Artikelname"
            zwsp.Format("%d; %s", m_pSet->m_Artikel_Nr, m_pSet->m_Artikelname);
            
            // String zur ListBox hinzufügen
            m_list.AddString(zwsp);
            
            // Zum nächsten Datensatz im CRecordSet springen
            m_pSet->MoveNext();
        }
    }

    Wichtige Konzepte im Code:

  5. Projekt kompilieren und testen: Die Anwendung zeigt jetzt gefilterte Artikel basierend auf der eingegebenen Bestellmenge an.

Erweiterungsmöglichkeiten:
- Mehrere Filterkombinationen ermöglichen
- Dropdown-Liste für Filterwerte statt manueller Eingabe
- Speichern und Laden von Filtereinstellungen
- Dynamische Spalten in der ListBox (Report-View statt Simple-View)

Programmierecke.NET