Datenbankbeispiel 4


Einleitung

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.

Beispiel

Aufgabe

Es sollten vor Beginn dieses Projekts die Maßnahmen getroffen werden, die im Kapitel "Datenbankzugriff Vorbereitung" angegeben sind.

Erstellen Sie ein Programm, welches ein TreeControl enthält.
In diesem TreeControl werden an oberer Hierarchieebene die unterschiedliche Werte des Attributs "BestellteAnzahl" der Tabelle "Artikel" eingetragen. Als Unterpunkte dieser Einträge werden die Werte des Attributs "Artikelname" eingetragen.

Lösung in Prosa

  1. Zuerst einmal ein neues Projekt anlegen:
  2. Zeichnen des Dialogs:
    Es werden nur ein TreeControl benötigt.


    Um die Linien und Schaltflächen beim TreeControl zu erhalten, braucht man nur die Eigenschaften zu editieren:
  3. Es wird noch eine Membervariable für den TreeControl benötigt.
    Dazu muss der Klassenassistent geöffnet werden.
  4. Nun muss das TreeControl beim Start des Programms noch mit den Daten befüllt werden.
    void CDb4View::OnInitialUpdate()
    {
    	m_pSet = &GetDocument()->m_db4Set;
    	CRecordView::OnInitialUpdate();
    	GetParentFrame()->RecalcLayout();
    	ResizeParentToFit();
    
    	CString zwsp;
    
    	// Sicherstellen das Datenbank offen ist
    	if (!m_pSet->IsOpen())
    		m_pSet->Open();
    
    	// Sortieren der Tabelle nach "BestellteEinheiten"
    	// Dies ist der Teil der SQL-Klausel, der nach SORT BY kommt
    	m_pSet->m_strSort = "[BestellteEinheiten]";
    
    	// Neu laden des CRecordSet, um die Sortierung aktiv werden zu lassen
    	m_pSet->Requery();
    
    	// Variable für das Attribut "BestellteEinheiten" des letzten Datensatzes
    	int oldanzahl=-1;
    	// Variable für das Item der TreeControl bei dem Untereinträge
    	// angehängt werden
    	HTREEITEM parent;
    
    	// Solange noch Einträge in der Tabelle vorhanden sind
    	while (!m_pSet->IsEOF())
    	{
    		// nur wenn dieser Parent (Bestellte Einheiten) in der TreeControl
    		// noch nicht existiert..
    		if (oldanzahl != m_pSet->m_BestellteEinheiten)
    		{
    			// neue Bestellte Einheiten merken
    			oldanzahl = m_pSet->m_BestellteEinheiten;
    			// in String umwandeln
    			zwsp.Format("%d",m_pSet->m_BestellteEinheiten);
    			// als neuer parent in die TreeControl einfügen
    			parent = m_tree.InsertItem(zwsp);
    		}
    		// Artikelname als Child von dem aktuellen parent einfügen
    		m_tree.InsertItem(m_pSet->m_Artikelname,parent);
    		// zum nächsten Datensatz springen
    		m_pSet->MoveNext();
    	}
    
    	// Diese Einfügemethode funktioniert nur, weil die Datensätze
    	// vorher sortiert wurden
    }
          
  5. Fertig