Borland Delphi 7 - Grundlagen, Profiwissen, Kochbuch

Die Seite wird erstellt Sven-Aarge Greiner
 
WEITER LESEN
Walter Doberenz, Thomas Gewinnus

     Borland Delphi 7 --
   Grundlagen, Profiwissen,
         Kochbuch
Das umfassende Handbuch für die Win32-Anwendungsentwicklung

                   ISBN-10: 3-446-41216-6
                 ISBN-13: 978-3-446-41216-3

                          Leseprobe

         Weitere Informationen oder Bestellungen unter
          http://www.hanser.de/978-3-446-41216-3
                     sowie im Buchhandel
438                                                            Kapitel 9   Datenbankprogrammierung

        ■ Eindeutig: Diese Einstellung verbietet, dass mehrere Datensätze den gleichen Wert in einem
          Sekundärindexfeld aufweisen dürfen. Ist ein Wert doppelt vorhanden, wird das Feld nicht indi-
          ziert und eine Warnung angezeigt. Nach Entfernen der Duplikate können Sie das Feld erneut
          indizieren lassen.
        ■ Gewartet (Standard): Diese (nur für Tabellen mit Schlüssel verfügbare) Einstellung
          bestimmt, ob der Sekundärindex nach jeder Veränderung der Tabelle automatisch aktualisiert
          wird. Das bedeutet eine Beschleunigung bestimmter Operationen, wie z.B. Abfragen. Ist die
          Option deaktiviert, so aktualisiert die Datenbankoberfläche den Index nur, wenn er verwendet
          wird, etwa beim Verknüpfen von Tabellen oder Ausführen von Abfragen. Ungewartete Indizes
          sollten vorzugsweise bei schreibgeschützten Tabellen zum Einsatz kommen.
        ■ Groß-/Kleinschreibung beachten: Normalerweise ist diese Option deaktiviert, so dass in der
          Sortierreihenfolge kein Unterschied z.B. zwischen den Einträgen "Borland Delphi" und "BOR-
          LAND DELPHI" festzustellen ist (die Reihenfolge entspricht dann der Stellung in der Tabelle).
          Einfachen Indizes mit aktivierter Groß-/Kleinschreibung wird automatisch der Feldnamen
          zugewiesen. Andererseits müssen Sie Indizes, bei denen die Schreibweise nicht berücksichtigt
          wird, beim Speichern selbst mit einem Namen benennen.
        ■ Absteigend: Auch diese Option ist im Normalfall deaktiviert, so dass Einträge in alphabe-
          tischer Reihenfolge (beginnend mit A) sortiert werden. Andernfalls würde, beginnend mit Z,
          abwärts sortiert.
        Praktische Erfahrungen zu dieser grundlegenden Thematik sammeln Sie in den Übungsbeispielen
        9.3.2 und 9.3.3.

9.2 Datenbankzugriff mit Bound Controls
        Delphi verfolgt das Konzept der visuellen Programmierung nicht nur konsequent bei den Kompo-
        nenten der Bedienoberfläche, sondern auch bei den Komponenten für den Datenbankzugriff. Diese
        werden wie "normale" Komponenten auf der Fensteroberfläche abgelegt und lassen sich über
        Eigenschaften und Methoden steuern. Auf Änderungen kann über Ereignisse reagiert werden.
        Ausgehend von einer Übersicht der vorhandenen Komponenten werden Sie mit den wichtigsten
        Einsatzmöglichkeiten vertraut gemacht.

9.2.1 Komponenten für Datenzugriff
        Komponenten dieses Typs sind zur Laufzeit unsichtbar. Sie stellen die Verbindung zur Datenbank
        her.

        Übersicht
        Die für uns interessanten Table- und Query-Komponenten entnehmen Sie der Seite "BDE" der
        Komponentenpalette (siehe auch Abschnitte 3.4.5 bis 3.4.7 in Kapitel 3):
9.2 Datenbankzugriff mit Bound Controls                                                                 439

               Table      Query

             Weiterhin wird die TDataSource-Komponente von der Seite "Datenzugriff" benötigt (warum erfah-
             ren Sie später):

               DataSource

             Datenbankanbindung
             Die grundsätzliche Vorgehensweise bei der Herstellung einer Datenbankanbindung ist immer die
             gleiche:
             ■ Über eine Table- oder eine Query-Komponente schaffen Sie sich das virtuelle Abbild einer
               oder mehrerer Tabellen. Legen Sie dazu die Eigenschaften DatabaseName und TableName
               bzw. DatabaseName und SQL fest. Eine Query-Komponente liefert das Ergebnis einer SQL-
               Abfrage, während eine Table-Komponente immer eine Tabelle darstellt.
             ■ Verbinden Sie eine DataSource-Komponente über die DataSet-Eigenschaft mit einer Table-
               oder Query-Komponente.
             ■ Setzen Sie die Active-Eigenschaft von Table bzw. Query auf True, um die Verbindung zur
               Datenbank zu aktivieren.

9.2.2 Komponenten für Datensteuerung
             Die Komponenten dieser zweiten wichtigen Kategorie bleiben auch zur Laufzeit sichtbar. Sie fallen
             unter verschiedene gleichwertige Bezeichnungen, wie Bound Components, Bound Controls,
             datensensitive Komponenten, visuelle Dialogelemente, Datendialogelemente, und lassen sich über
             Eigenschaften (DataSource, DataField etc.) an bestimmte Datenquellen (Tabelle, Abfrage) anbin-
             den, wobei eine DataSource-Komponente als Verbindungsglied dient. Veränderungen der Satz-
             zeigerposition wirken sich auch auf den Inhalt des Steuerelements aus.

             Übersicht
             Welche Datendialog-Komponenten Delphi bietet, sehen Sie auf der Seite "Datensteuerung" der
             Komponentenpalette. Auf die für unsere Experimente besonders interessanten wird extra hinge-
             wiesen:
440                                                                 Kapitel 9      Datenbankprogrammierung

                           DBEdit              DBLookup-
          DBNavigator                           ListBox

                  DBText             DBCheckBox
                                                           DBLookup-
        DBGrid             DBMemo                          ComboBox

      Was Sie damit anfangen können, können Sie sich eigentlich denken:
      ■ DBNavigator Anzeige und Bearbeitungsmöglichkeit von Datensätzen in einem Tabellengitter.
      ■ DBGridSteuertasten für Datensatzzeiger (Vor, Zurück, Löschen, Neu, Abbrechen etc.).
      ■ DBEditAnzeige- und Eingabefeld für eine Textzeile.
      ■ DBMemo Anzeige und Eingabefeld für Mehrfachzeilen oder BLOB-Text.
      ■ DBTextAnzeige eines Feldes als Label.
      ■ DBCheckBoxAnzeige/Eingabe True/False in Abhängigkeit eines Tabellenfeldes.
      ■ DBLookupListBoxListenfeld, der gewählte Eintrag (ItemIndex) wird in der Tabelle gespeichert,
        die Listeneinträge werden aus einer zweiten Tabelle geladen!
      ■ DBLookupComboBoxComboBox, sonst wie DBLookupListBox.

      Verbinden mit den Datenzugriffskomponenten
      Die folgende Abbildung verdeutlicht das Grundprinzip: Wenn Sie die Datensteuerungskomponen-
      ten mit den Datenzugriffskomponenten verbinden wollen, schiebt sich die DataSource-Kompo-
      nente quasi als "Mittler" dazwischen.

                                                                  zur Laufzeit sichtbar!
                   Datenbank           zur Laufzeit unsichtbar!       DBEdit
                                      Table     DataSource

                                                                       DBMemo

                                       DBNavigator
9.2 Datenbankzugriff mit Bound Controls                                                                    441

             Vorgehensweise:
             ■ Binden Sie eine oder mehrere Bound Controls (DBText, DBEdit, DBMemo ...) über die Data-
               Source-Eigenschaft an die DataSource-Komponente. Legen Sie anschließend den Feldinhalt
               über die DataField-Eigenschaft fest. Haben Sie diese Bearbeitungsreihenfolge eingehalten,
               können Sie den Feldnamen in einer Drop-down-Liste auswählen.
             ■ Wenn die Active-Eigenschaft der Table- oder Query-Komponente True ist, wird im Erfolgsfall
               der erste Datensatz der eingebundenen Tabelle/Abfrage angezeigt. Ist die SQL-Abfrage fehler-
               haft oder existiert die Tabelle nicht, erscheint eine Fehlermeldung.
             Damit hätten Sie bereits eine (fast) fertige Eingabemaske. Ein Problem bleibt allerdings: Das Hin-
             zufügen und Löschen von Datensätzen sowie eine Möglichkeit, zwischen den Datensätzen zu
             wechseln, fehlen bisher. All diese Wünsche erfüllt eine DBNavigator-Komponente, die Sie einfach
             über die DataSource-Eigenschaft an die DataSource-Komponente binden. Das war's auch schon!
             Mit einem Dutzend Mausklicks haben Sie bereits eine Datenbankapplikation erstellt, die in der
             Lage ist, Daten anzuzeigen, neue Datensätze hinzuzufügen und zu löschen. Die Funktionalität zum
             "Bewegen" zwischen den Datensätzen ist ebenfalls vorhanden.
             Den praktischen Einsatz lernen Sie im Übungsbeispiel 9.3.3 ("Eingabemaske mit Bound Controls")
             kennen.

9.2.3 Rave Reports-Komponenten
             Ihre Datenbankanwendung ist erst dann komplett, wenn die Abfrageergebnisse in ansprechender
             Form zu Papier gebracht werden. Bisher wurden Ihnen dazu die QuickReport-Komponenten
             bereitgestellt. Doch in Delphi 7 hat mit Rave Reports ein neuer Reportgenerator Einzug gehalten,
             und Sie als Programmierer haben jetzt natürlich dienstbeflissen alle Ihre Reports umzustellen. Halt,
             halt, ganz so schlimm ist es nicht gekommen. Haben Sie bereits Reports mit QuickReport ent-
             wickelt, können Sie diese natürlich auch weiternutzen bzw. Sie können wie gewohnt mit den
             QuickReport-Komponenten arbeiten. Für alle Neueinsteiger und Umstiegswilligen stellen wir an
             dieser Stelle die Arbeit mit Rave Reports vor, mehr zum Thema "QuickReport" finden Sie in unse-
             rem Buch [Borland Delphi – Datenbankprogrammierung].

             Übersicht
             Die "Rave"-Seite der Komponentenpalette besticht bereits durch ihre Vielfalt:

             Der eigentliche Report-Designer ist hier jedoch noch nicht enthalten, Sie finden diesen im Ver-
             zeichnis \\Delphi7\Rave5\ als Rave.exe) als eigenständiges Programm.
             Über die Bedeutung der einzelnen Rave-Komponenten informiert Sie die folgende Tabelle:
442                                                                         Kapitel 9     Datenbankprogrammierung

          Icon      Bezeichnung                    Erläuterung
                    RvProject                      Über diese Komponente binden Sie die mit dem Rave-
                                                   Designer erzeugten *.rav-Dateien in Ihr Delphi-Projekt ein,
                                                   um diese mittels Execute-Methode anzuzeigen.
                    RvSystem                       … ermöglicht die Vorgabe diverser Optionen und die
                                                   Ausgabe als Vorschau, Druckausgabe oder *.NDR-Datei.
                    RvNDRWriter                    … bietet die Möglichkeiten zum Erzeugen einer Druckdatei
                                                   (*.NDR).
                    RvCustomConnection             … bietet Unterstützung für die Ausgabe von Array- oder
                                                   nutzerdefinierten Daten. Der Programmierer stellt über die
                                                   Ereignisse OnNext, OnEOF, OnFirst etc. quasi eine Mini-
                                                   Datenbank/-Tabelle zur Verfügung.
                    RvDatasetConnection            … unterstützt die Anbindung beliebiger TDataset-
                                                   Komponenten an einen Report.
                    RvTableConnection              … dient dem Bereitstellen von BDE-TTable-Daten für einen
                                                   Report (Einbindung als Direct Data View).
                    RvQueryConnection              … dient dem Bereitstellen von BDE-TQuery-Daten für einen
                                                   Report (Einbindung als Direct Data View).
                    RvRenderPreview                … ermöglicht die Anzeige von NDR-Daten in einer
                                                   Scrollbox. Mit den bereitgestellten Methoden können Sie
                                                   eine komplette Druckvorschau realisieren.
                    RvRenderPrinter                … Ausgabe von NDR-Daten auf einem Drucker.

                    RvRenderPDF                    … durch das Einbinden dieser Komponente steht Ihnen
                                                   zusätzlich das Adobe Acrobat-Format für die Dateiausgabe
                                                   zur Verfügung.
                    RvRenderHTML                   … Ausgabe der Reportdaten im HTML-Format.

                    RvRenderRTF                    … Ausgabe der Reportdaten im Rich Text-Format.

                    RvRenderText                   … Ausgabe der Reportdaten im Text-Format.

      Wichtige Features
      Einige wesentliche Features des Rave Reports auf einen Blick:
      ■ Sowohl seiten- als auch bandorientierter Reportentwurf
      ■ Anbindung an TTable, TQuery, TDataset sowie nutzerdefinierte Datenmengen aus Ihrer
        Delphi-Anwendung
      ■ Direkte Anbindung an ADO-, BDE- oder DBX-Datenquellen
      ■ Externer Report-Designer1

      1
          Mit zusätzlicher Lizenz kann dieser auch eingebunden (DLL) und an den Enduser weitergegeben werden.
9.2 Datenbankzugriff mit Bound Controls                                                                  443

             ■ Integrierte Druckvorschau
             ■ Integrierter Query-Builder
             ■ Relativ einfache Handhabung
             ■ Export im PDF-, HTML-, RTF- und Text-Format möglich
             ■ Eigener Rave Reports-Server für die Distribution von Reports über das Internet/Intranet im
               HTML- oder PDF-Format

             Der Designer
             Wie bereits erwähnt, handelt es sich um ein externes Programm, dessen Bedienung sich nicht
             wesentlich von Delphi unterscheidet:

             Die Vorgehensweise ist recht simpel: Erstellen Sie eine neue Reportdatei, können Sie in dieser
             beliebig viele Reports unterbringen. Diese Einzelreports können wiederum aus mehreren Seiten
             bestehen (z.B. Deckblatt, Listendarstellung und Zusammenfassung).
             Auf der linken Seite finden Sie die jeweiligen Eigenschaften des gewählten Objekts, über die Tool-
             bar haben Sie die Möglichkeit, Komponenten auf dem Report zu platzieren.
             Die Struktur der Report-Datei (*.RAV) wird in der Baumansicht auf der rechten Seite dargestellt.
             Neben den einzelnen Reports sowie deren Seiten werden hier auch alle Datenverbindungen aufge-
             listet. Zwei Varianten bieten sich an:
             ■ Sie binden die Reports an Komponenten, die Sie in Ihr Delphi-Programm eingebunden haben
               (Direct DataView)
444                                                             Kapitel 9   Datenbankprogrammierung

        ■ oder Sie nutzen die Möglichkeit des direkten Datenzugriffs per ADO, BDE oder ODBC
          (Driver Data View).
        Wir werden uns im Weiteren auf die erste Variante beschränken, da Sie hier die besten Einfluss-
        möglichkeiten (Filtern, Gruppieren etc.) aus dem Delphi-Programm heraus haben.
        Doch bevor Sie vor lauter Theorie das Handtuch werfen, wollen wir uns lieber mit ein paar prak-
        tischen Beispielen beschäftigen. Konkrete Beispiele zum Thema "Rave Report" finden Sie unter
        9.3.4 und 9.4.3 im Praxisteil des Kapitels.

9.3 Lernbeispiele für Einsteiger

9.3.1 Anlegen einer "Kundentabelle"
        Sie haben, beginnend mit dem Stand null, mehrere Etappen zu bewältigen:
        ■ Problemanalyse und Entwurf der Datenbankstruktur
        ■ Tabellenentwurf (Datenbankoberfläche, Paradox, SQL ...)
        ■ Oberflächenentwurf für den Datenzugriff (Delphi)
        ■ Zusammenstellen und Ausdruck von Berichten (Delphi/Rave Reports)
        Sie werden mit der wohl primitivsten Form einer relationalen Datenbank, einer einzigen Tabelle,
        beginnen. Darin sollen alle Kunden der Firma erfasst werden.

        Datenbankstruktur
        Da Sie es nur mit einer einzigen Tabelle zu tun haben, brauchen Sie sich keinen quälenden Über-
        legungen bezüglich der Datenbankstruktur hinzugeben. Wir einigen uns lediglich darüber, dass pro
        Person eine laufende Nummer, deren Namen, Anschrift (Straße, Ort, PLZ) und Telefonnummer
        abzuspeichern sind. Damit hätte unsere Tabelle folgenden Aufbau:

         Kunden
         Feldname                  Datentyp                         Größe
         Nr                        Zähler
         Name                      Alpha                            50
         Straße                    Alpha                            50
         Ort                       Alpha                            50
         PLZ                       Alpha                            5
         Telefon                   Alpha                            30

        Das Zählerfeld Nr ist kompatibel zum Datentyp Integer (lang), nur dass es sich immer automatisch
        um eins erhöht, wenn Sie einen neuen Kunden in die Tabelle aufnehmen. Wie Sie sehen, handelt es
Sie können auch lesen