4.4   Datenbanken in Delphi-Programme einbinden

Nachdem 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 Nutzung

Hierbei handelt es sich um die einfachste Methode (Borland-Database-Eigene) Datenbakformate wie Paradox oder Dbase in Delphi-Anwendungen einzubimnden.

Die Vorgehensbeise wird an folgendem Beispiel geschildert:

Die Muster-Datenbank c:\delphi-kurs\Datenbanken\Artikel.db ist in eine Delphi-Anwendung einzubinden.

Vorgehensweise:

  • In der Komponentenbiliothek den Reiter BDE wählen und ein Table-Objekt in's Formularfenster ziehen.


  • 2. Das Table-Objekt markieren und im Objektinspektor (falls ausgebelndet F11) im Feld TableName den Pfadeintrag vornehmen. Danach sollte die Datenbank geöffnet werden indem Sie die Eigenschaft Aktiv auf True (Wahr) setzen.

   

  • Sie haben die Datenbank jetzt erfolgreich geöffnet, um den Inhalt für die Delphi-Anwendung nutzbar zu machen ist es nötig wiederholt die Komponentenbiliothek zu benutzen und unter dem Reiter Datenzugriff ein DataSource-Objekt in's Formularfenster ziehen.
  • Das DataSource-Objekt markieren und im Objektinspektor (falls ausgebelndet F11) im Feld DataSet die Auswahl der bezogenen Tabelle (in unserem Falle Table1) vornehmen.



Die Der Inhalt der Datenbank kann nun genutzt werden.

4.4.2   Datenbankenanbindung mit direkter BDE Nutzung

Bei 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.

Vorgehensweise:

  • BDE-Verwaltung über Start/Einstellungen/Systemsteuerung/BDE-Verwaltung öffnen.
  • Objekt klicken Neu... klicken   Dann OK Taste drcken (Standard-Fenster bestätigen)

  • Bezeichnung Standard1 durch gewünschte Bezeichnung (in unserem Falle Muster_DB) ersätzen und bestätigen.

  • Auf Pfad klicken (rechts erscheint Button mit 3Punkten) und den geünschten Pfad wählen und mit OK betätigen.

  • BDE-Verwaltung schließen und Änderungen speichern.
  • In der Komponentenbiliothek den Reiter BDE wählen und ein Table-Objekt in's Formularfenster ziehen.
    (Siehe 4.4.1)
  • Das Table-Objekt markieren und im Objektinspektor (falls ausgebelndet F11) im Feld DatabaseName den Muster_DB auswählen. Danach wählen Sie die Datenbank im Feld TableName die Datenbank aus und öffnen sie indem Sie die Eigenschaft Aktiv auf True (Wahr) setzen.

    

weitere Vorgehensweise wie unter 4.1.3 ff. beschrieben.

Den Ordner mit der Muster-Datenbank können Sie hier downloaden.

4.4.3   Praktische Übung Oberfläche mit Einzelkomponenten

  • Richten Sie folgende Ordnerstruktur auf Ihrem PC ein:

(in der Schule benutzen Sie bitte Ihr perönliches Laufwerk S: statt C:)

  • Kopieren Sie die in Übung 3 erstellte Datenbank Kunden.dbnebst Indexen in den Ordner DB.
  • Richten Sie den BDE-Alias Firma ein.

Jetzt gehts los:

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  Entwurf

Bestü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:

Als erstes sollten Sie die Active-Property auf False setzen.

4.4.3.2  DatabaseName und TableName

Nun 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  DataSet

Als 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 DataField

Jede 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-Eigenschaft

Setzen 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  Test

Bearbeiten 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 - Button (oder F9-Taste). Mit dem Datensatznavigator können Sie sich nun durch die Datenbank bewegen. Es lassen sich auch Datensätze editieren (bearbeiten), löschen oder neu hinzufügen:

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-Beziehungen

In 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 schon zuvor beschrieben, steht in einer Datenbank kaum eine Tabelle für sich allein. Meist sind durch entsprechende Verknüpfungen (Relationen) gewisse Abhängigkeiten vorhanden, die aus einer vorhergehenden Normalisierung entstanden sind. Das Problem für den Programmierer besteht darin, diese Daten in einer ansprechenden und zusammenhängenden Form wieder darzustellen. Diese Übung soll die Vorgehensweise beschreiben.

Ausgangspunkt Ihrer Überlegungen ist einer Tabellenstruktur mit folgender Abhängigkeit:

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.

  • Erstellen Sie die erforderlichen Datenbanken im Ordner C:\delphi-kurs\Firma\DB.
  • Erstellen Sie in der Datenbank Rechnungsdaten den Sekundärindex iRechnungsNr.

4.4.4.1  Oberfläche

  • Erstellen ein neues Formular im Projekt Firma.

Alles was Sie brauchen sind zwei Table-, zwei DataSource- zwei DBGrid-Komponenten:

  • Verknüpfen Sie die Elemente.

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" .

Wichtig: Als verfügbaren Index wählen Sie den Sekundärindex des Feldes, das als Fremdschlüssel fungiert (Rechnungsdaten.RechnungsNr). Danach sind beide Tabellen miteinander verknüpft, Änderungen im DBGrid1 wirken sich auf den Inhalt von DBGrid2 aus.

Der interne Ablauf:

  • Auswahl eines Feldes in Tabelle! (Rechnungen),
  • Bestimmen des Primärschlüssels,
  • Suche in Tabelle2 (Rechnungsdaten) über den Sekundärindex (Fremschlüssel) nach Werten, die dem Primärindex von Tabelle 1 entsprechen,
  • RückgabeeinerDatenmengean Table2.

4.4.5   Praktische Übung Verwendung von Lookup-Feldern

Sicher 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:

  • Erzeugen eines Lookup-Feldes über die Table-Komponente,
  • Anbinden einer DBLookupCombobox bzw. einer DBLookupListbox.
Jede dieser Methoden hat ihre Daseinsberechtigung ich stelle daher beide vor.

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

  • Erstellen Sie eine Tabelle Artikel.db (nach o.g. Struktur) und legen Sie diese unter C:\delphi-kurs\Firma\DB ab.
  • Fügen Sie im Projekt Firma ein neues Formular hinzu und stellen Sie es als Hauptformular ein.
  • Fügen Sie je zwei Table - und DataSource - Komponenten, sowie ein DBGrid und eine DBLookupCombobox ein.
  • Stellen Sie im Objektinspektor die Eigenschaft Visible der DBLookupCombobox auf False .
  • Binden Sie Table1 an die Tabelle Rechnungsdaten an und Table2 verknüpfen Sie mit der Tabelle Artikel.
Den grundsätzlichen Aufbau der Oberfläche entnehmen Sie der folgenden Abbildung:

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:

  • Wählen Sie als erstes den Fremdschlüssel der aktuellen Tabelle aus (Zeiger auf den Primärschlüssel der Lookuptabelle). In unserem Fall handelt es sich um Rechnungsdaten.ArtikeINr.
  • Wählen Sie die Tabelle in der Sie nachschlagen möchten, d.h. die Lookup-Tabelle (für uns Table2: Artikel).
  • Bestimmen Sie den Primärschlüssel der Lookup- Tabelle, d. h. das Feld auf das der Fremdschlüssel zeigt (ArtikeI.Nr).
  • Tragen Sie zuletzt den Namen des Feldes ein, dessen Inhalt statt des Fremdschlüssels angezeigt werden soll (Detaildaten).

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.

Sie können sich auf recht einfache Weise davon überzeugen, da im DBGrid zusätzlich auch das Feld ArtikelNr angezeigt wird:

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.

Wie Sie die Eigenschaften der DBLookupCombobox-Komponente zuweisen, ergibt sich aus der Beantwortung der gestellten Fragen:

  • Stellen Sie die Argumente entsprechend dem Beispiel für Ihre DBLookupCombobox ein.
  • Stellen Sie im Objektinspektor die Eigenschaft Visible der DBLookupCombobox wieder auf True .

Angewendet auf unser Beispiel:

Über den Fremdschlüssel der Tabelle Rechnungsdaten (ArtikelNr) wird sowohl der Anzeigewert (Artikel.Name) als auch der Wert in der Liste bestimmt. Gespeichert wird jedoch der Primärschlüssel von Artikel.

Nach erfolgreichem Abschluß sieht die Form jetzt so aus:


Als Referenz können Sie die gesamte Übung hier downloaden.

Seite drucken  Seite aktualisieren  zurück  zum Textanfang