4.4 Datenbanken in Delphi-Programme einbindenNachdem Sie Datenbanken erstellen können ist es im nächsten Schritt nötig diese in Delphi-Programme einzubinden. Dazu gibt es mehrere Möglichkeiten , die beiden gebräuchlichsten werden im folgenden Leitfaden vorgestellt: 4.4.1 Datenbankenanbindung mit indirekter BDE NutzungHierbei handelt es sich um die einfachste Methode (Borland-Database-Eigene) Datenbakformate wie Paradox oder Dbase in Delphi-Anwendungen einzubimnden.
![]()
4.4.2 Datenbankenanbindung mit direkter BDE NutzungBei dieser Methode können unterschiedliche Datenbankformate unter Nutzung von Alias-Namen als "Pfad-Ersatz" genutz werden. Sellvertretend für
andere Datenbankformate wollen wir das Paradox - Format besprechen. Die Vorgehensweide bei anderen Datenbanken ist analog.
Die Muster-Datenbank c:\delphi-kurs\Datenbanken\Artikel.db ist in eine Delphi-Anwendung einzubinden.
weitere Vorgehensweise wie unter 4.1.3 ff. beschrieben. 4.4.3 Praktische Übung Oberfläche mit Einzelkomponenten
Die einfachste Möglichkeit, sofort zu einer anwendungsbereiten Datenbankapplikation zu kommen, wäre der Einsatz einer einzigen DBGrid - Komponente. Weitaus individuellere Bedienoberflächen lassen sich aber mit Einzelkomponenten gestalten. 4.4.3.1 EntwurfBestücken Sie ein neues Formular mit den Datensteuerungskomponenten DBTextl, DBEditl ... DBEdit5 und DBNavigator1 und mit den Datenzugriffskomponenten Table1 und DataSource1. Hinzukommen einige Label zur Beschriftung.
Die Anbindung an die Datenbank ist mit wenigen Mausklicks im Objektinspektor erledigt. Beginnen Sie mit der TTable-Komponente. Von der Vielzahl der Eigenschaften sind vorerst für Sie nur drei interessant (Active, DatabaseName, TableName), die übrigen belassen Sie auf den Standardwerten:
4.4.3.2 DatabaseName und TableNameNun ist die Zuweisung der DatabaseName-Eigenschaft vorzunehmen. Wahlen Sie hier den DB-Alias für die Tabelle Kunden.DB aus. Anschließend weisen Sie die TableName-Eigenschaft zu. Klicken Sie dazu auf das leere Feld in der rechten Spalte des Objektinspektors und öffnen Sie die kleine Rollbox. Es werden Ihnen alle im Datenbankverzeichnis befindlichen Tabellen-Namen angezeigt, in unserem Fall wählen Sie Kunden.DB. 4.4.3.3 DataSetAls nächstes müssen Sie die Komponente DataSource1 an Table1 ankoppeln. Das ist kein Akt,denn das Zuweisen der DataSet-Eigenschaft ist mit einemeinzigen Mausklick erledigt:
4.4.3.4 DataSource und DataFieldJede der Datensteuerungskomponenten (DBText1, DBEdit1 ... DBEdit5) können Sie nun an das entsprechende Feld von Tablel anbinden, wobei DataSource1 eine Art "Brückenfunktion" übernimmt. Setzen Sie also die DataSource-Eigenschaft aller Komponenten auf DataSource1 und weisen Sie anschließend die entsprechende DataField-Eigenschaft zu:
Vergessen Sie nicht, zum Scluß auch noch die DataSource-Eigenschaft der Komponente DBNavigator1 auf gleiche Weise über DataSource1 an Table1 anzubinden. 4.4.3.5 Active-EigenschaftSetzen Sie jetzt die Active-Eigenschaft von Table1 wieder auf True. Obwohl das Programm noch nicht gestartet ist, sollte der erste Datensatz bereits angezeigt werden. Die Active-Property erlaubt es, bereits zur Entwurfszeit Verbindungen zur Datenbank herzustellen. Ist diese Eigenschaft False, so sind diese Verbindungen geschlossen, anderenfalls (True) geöffnet. Immer wenn Sie später DatabaseName oder TableName ändern wollen, sollten Sie vorher Active auf False setzen, da sonst eine Fehlermeldung erscheint. Ein Bewegen durch die Datenbank mit den Navigatorschaltflächen ist jetzt allerdings noch nicht möglich. 4.4.3.6 TestBearbeiten Sie zuerst die Projekt-Optionen. Geben Sie als Ausgabe-Pfad C:\delphi-kurs\Firma\PRG ein. Vor dem ersten Test sollten Se das Projekt speichern. Wahlen Sie dazu den Pfad: C:\delphi-kurs\firma\Quellcode. Belassen Sie den Namen der Unit als Unit1 und speichern Sie das Projekt unter dem Namen Firma. Starten Sie das Programm durch Klick auf den
Wenn Sie zur Entwurfszeit die ShowHint-Eigenschaft von DBNavigator1 auf True gesetzt haben, erscheinen die in obiger Abbildung gezeigten kleinen gelben Hinweisschildchen immer dann, wenn Sie mit dem Mauszeiger einen kleinen Moment auf der entsprechenden Schaltfläche verweilen. Sie werden feststellen, daß bestimmte Schaltflächen in Abhängigkeit vom momentanen Bearbeitungszustand aktiviert oder deaktiviert sind (der Navigator "denkt" mit). So werden z. B. die "Übernehmen"- und die "Bearbeiten abbrechen"-Schaltflächen erst dann freigegeben, wenn Sie einen Eintrag editiert oder neu hinzugefügt haben. Anstatt mit der Schaltfläche "Datensatz bearbeiten" erreichen Sie den Editiermodus auch dann, wenn Sie einfach die Einfügemarke im entsprechenden Feld plazieren und dort etwas ändern. Vergessen Sie das "Übernehmen", so bleiben die vorgenommenen Änderungen wirkungslos. 4.4.4 Praktische Übung Darstellen von 1:N-BeziehungenIn einem Listenfeld sind alle verfügbaren Rechnungen abzubilden. Nachfolgend sollen in
einer zweiten Liste alle Artikel angezeigt werden, die sich in dieser Rechnung befinden. Dazu einige Erläuterungen:
Wie Sie sehen, handelt es sich um eine klassische 1:N-Beziehung. Einer Rechnungsnummer können mehrere Einträge in der Rechnungsdaten-Tabelle zugeordnet sein. Während die Tabelle Rechnungen Informationen für die gesamte Rechnung enthält, bezieht sich die Tabelle Rechnungsdaten lediglich auf einen Detaildatensatzder Rechnung. Für Sie genügt an dieser Stellejedoch die einfache obige Beziehung, die Sie ohne eine einzigeZeile Quellcode in einem Formular darstellen können.
4.4.4.1 Oberfläche
Alles was Sie brauchen sind zwei Table-, zwei DataSource- zwei DBGrid-Komponenten:
Zu diesem Zeitpunkt besteht zwischen Table1 und Table2 keinerlei Verknüpfung, Änderungen im DBGrid1 wirken sich nicht auf den Inhalt von DBGrid2 aus. Diesem Mißstand können Sie durch die Zuweisung der Masterfield- und MasterSource- Eigenschaften von Table2 abhelfen. Voraussetzung ist allerdings ein Indizieren des Feldes Rechnungsdaten.RechnungsNr (Sekundärindex). Legen Sie als erstes die MasterSource-Eigenschaft auf DataSource1 fest. Nachfolgend öffnen Sie den Property-Editor der Eigenschaft Masterfield (kleiner Button). Es erscheint folgendeDialogbox:
Wählen Sie das Feld "RechnungNr" und das Feld "Nr" und klicken Sie auf den Button "Hinzufügen" . Der interne Ablauf:
4.4.5 Praktische Übung Verwendung von Lookup-FeldernSicher ist Ihnen schon an der einen oder anderen Stelle der Begriff Lookup-Field aufgefallen, sei es als Eigenschaft oder aus der Datenbank-Theorie. Sie lernen jetzt, was es damit auf sich hat. Zwei grundsätzliche Möglichkeiten bestehen:
Ausgangspunkt ist die folgende Datenbankstruktur:
Zeigen Sie in einer Eingabemaske den Inhalt der Tabelle Rechnungsdaten an, ist aus der verbleibenden Artikel-Nummer nicht allzuviel zu entnehmen. Für die Zuordnung eines Artikels wäre es also wesentlich sinnvoller, wenn statt des Feldes ArtikelNr das Feld Artikel.Name angezeigt würde. 4.4.5.1 Oberfläche
4.4.5.2 Variante 1 (Lookupfield für Table erzeugen)Wollen Sie ein Lookupfield für ein Tabelle zu erzeugen, klicken Sie doppelt auf die betreffende Table - Komponente(Table1). Im sich öffnenden Popup-Menü wählen Sie "Neues Feld". Es erscheint eine Dialogbox,die Sie wie folgt ausfüllen:
Die verschiedenen Bezeichnungen dürften für mehr Verwirrung als Klarheit sorgen, deshalb noch einmal der Reihe nach:
Nach dem Schließen der Dialogbox verfügt Table1 über ein zusätzliches Feld, das Sie
ganz normal in Tabellen oder Bounded-Components anzeigen können. Der Clou: Verknüpfen Sie wie im Beispielprogramm die Tabelle mit einem DBGrid, wird der Inhalt des
Lookupfeldes angezeigt. Ein Klick auf die Zelle öffnet eine Combobox, in der alle zulässigen Werte (Artikelnamen) angezeigt werden. Die Auswahl eines Wertes führt dazu,
daß nicht etwa der Inhalt von Artikel.Name in Rechnungsdaten.ArtikelNr abgespeichert
wird, sondern der Primärschlüssel von Artikel.
Auf diese Weise können Sie viele Eingabefehler in Tabellen vermeiden, die Eingabe unzulässiger Werte ist einfach nicht möglich, es können nur Werte eingetragen werden, die auch in der Combobox angezeigt werden. Allerdings ist diese Möglichkeit auf die Verwendungin DBGrids eingeschränkt. Wesentlich universeller ist die zweite Variante von Lookup-Feldern, auf die wir im folgenden eingehen. 4.4.5.3 Variante 2 (Lookupfield mit DBLookupCombobox)Wie in der vorhergehenden Variante greifen wir auf die beiden Table-Komponenten zu,
die Verknüpfung der beiden Tabellen erfolgt aber erst in der Anzeige-Komponente, d. h. einer DBLookupCombobox oder einer DBLookupListbox.
Angewendet auf unser Beispiel:
Als Referenz können Sie die gesamte Übung hier downloaden. |