Difference between revisions of "Lazarus Tdbf Tutorial/de"

From Free Pascal wiki
Jump to navigationJump to search
Line 6: Line 6:
  
 
===Was sie benötigen werden===
 
===Was sie benötigen werden===
No doubt this will soon be easier as FreePascal releases the next version 2.0, however currently you will need a recent CVS edition of FPC 1.9.X in order to properly use the TDbf component. It may be possible to download just the TDbf component by itself and use it with the 1.1 version of FreePascal, however this document was written with 1.9.X in mind, partly due to bug fixes in the other database components used in Lazarus.
+
Obwohl die Komponente auch noch mit älteren Versionen funktioniert, sollten sie eine aktuelle Lazarus Version, die auf FPC 2.x.x aufbaut, verwenden. Die Komponente wird zwar mit Lazarus mitgeliefert, aber nicht standardmäßig installiert. Dies erreichen sie durch die Installation des DbfLaz Packages, welches sich im lazarus/components/tdbf/ Verzeichnis befindet.
 
 
Sie werden auch das DbfLaz Package installieren müssen, welches mit Lazarus kommt. Es befindet sich im lazarus/components/tdbf/ Verzeichnis.
 
  
 
===Was TDbf bietet===
 
===Was TDbf bietet===

Revision as of 09:42, 18 September 2005

Deutsch (de) English (en) español (es) français (fr) português (pt) русский (ru) 中文(中国大陆)‎ (zh_CN)

Überblick

Dieses Tutorial behandelt die grundlegende Datenbank Entwicklung unter Verwendung der TDbf Komponente (entwickelt von Micha Nelissen) mit Lazarus. Zusätzliche Dokumentation für TDbf ist verfügbar. Diese Seite wurde erstellt von Tony Maro aber andere Mitwirkende sind willkommen!

Was sie benötigen werden

Obwohl die Komponente auch noch mit älteren Versionen funktioniert, sollten sie eine aktuelle Lazarus Version, die auf FPC 2.x.x aufbaut, verwenden. Die Komponente wird zwar mit Lazarus mitgeliefert, aber nicht standardmäßig installiert. Dies erreichen sie durch die Installation des DbfLaz Packages, welches sich im lazarus/components/tdbf/ Verzeichnis befindet.

Was TDbf bietet

TDbf bietet Zugriff auf dBase und FoxPro Datenbank Tabellen für Lazarus (und andere). Es erlaubt das Lesen, Schreiben und Erzeugen von dBase III+, dBase IV, Visual dBase VII und FoxPro Tabellen. Es tut alles das, ohne zusätzliche Bibliotheken oder Datenbank Engines zu benötigen. Einfach TDbf auf ihrem Formular ablegen und sie haben sofortigen Zugriff zu einer cross-platform Datenbank Umgebung. TDbf arbeitet in Windows und Linux unter Verwendung von Lazarus.

Wie man eine neue Datenbank Tabelle erzeugt

Da es noch keine "Datenbank Desktop" Anwendung für Lazarus gibt, müssen wir eine neue Datenbank im Code erzeugen.

Setzen des Pfades

Es ist eine gute Idee, der Datenbank ihrer Anwendung ein eigenes Verzeichnis zu spendieren. Dies vereinfacht das Erstellen von Backups der Daten. Es gibt zwei Wege, um den Pfad zu setzen. Sie können den vollständigen Pfad setzen, indem sie die FilePathFull Eigenschaft nutzen, oder sie können einen Pfad relativ zur aktuellen Anwendung setzen mit FilePath. Zum Beispiel, das Setzen von "FilePath" zur Laufzeit auf "data/" würde ein data Unterverzeichnis nutzen einfach unter der .EXE Datei. Das Setzen der "FilePathFull" Eignschaft auf "/var/data/" würde alles in diesem bestimmten Ordner platzieren, den Ort der Anwendung ignorierend.

Wählen eines Tabellenlevels

Per Voreinstellung wird TDbf dBase IV Tabellen erzeugen. Während dies sehr kompatibel ist, gibt es Features, die sie benutzen möchten, die aber nicht unterstützt werden. Um auto-incrementing Felder zu unterstützen, müssen sie etwas neueres benutzen. Die Tabellen Typen sind:

  • 3 dBase III+
  • 4 dBase IV
  • 7 Visual dBase VII
  • 25 FoxPro

Sie wählen einen Tabellentyp, indem sie die TableLevel Eigenschaft entsprechend setzen.

Hinzufügen von Feldern

Das Erzeugen von Feldern für ihre neue Tabelle zur Laufzeit folgt so ziemlich dem alten Delphi Standard. Sobald sie die FilePath, TableLevel, und TableName Eignschaften gesetzt haben, manipulieren sie die FieldDefs Eigenschaft, um die Struktur festzulegen. Zum Beispiel:

MyDbf.FilePathFull := '/Ort/für/meine/Daten';
MyDbf.TableLevel := 7;
MyDbf.TableName := 'customers.dbf'; // Notiz: Wird .dbf wirklich benötigt?
With MyDbf.FieldDefs do begin
  Add('Id', ftAutoInc, 0, True);
  Add('Name', ftString, 80, True);
End;

Feld Typen sind definiert als:

  • ftUnknown
  • ftString
  • ftSmallInt
  • ftInteger
  • ftWord
  • ftBoolean
  • ftFloat
  • ftCurrency (TableLevel 25)
  • ftBCD (TableLevel 25)
  • ftDate
  • ftTime
  • ftDateTime
  • ftBytes (TableLevel 25)
  • ftVarBytes
  • ftAutoInc (TableLevel 7 oder 25)
  • ftBlob
  • ftMemo
  • ftGraphic
  • ftFmtMemo
  • ftParadoxOle
  • ftDBaseOle
  • ftTypedBinary
  • ftCursor
  • ftFixedChar
  • ftWideString
  • ftLargeInt
  • ftADT
  • ftArray
  • ftReference
  • ftDataSet
  • ftOraBlob
  • ftOraClob
  • ftVariant
  • ftInterface
  • ftIDispatch
  • ftGuid
  • ftTimeStamp
  • ftFMTBcd

Fett geschriebene Typen werden gegenwärtig unterstützt.

Gehen sie voran und erzeugen sie es!

Sobald sie die Felder definiert haben, die sie in ihrer neuen Tabelle benutzen wollen, können sie vorangehen und sie mit:

   MyDbf.CreateTable;

erzeugen.

Wie man einen Index zu einer Tabelle hinzufügt

Wenn ihre Datenbank größer ist als ein paar Datensätze, wollen sie möglicherweise Indexe definieren, um das Suchen zu beschleunigen. Um die Index Struktur einer Tabelle zu ändern, benötigen wir exklusiven Zugriff auf die Tabelle - welchen wir ohnehin haben, während wir ihn erzeugen.

       MyDbf.Exclusive := True;
       MyDbf.Open;

Nun, müssen wir einfach den Index hinzufügen.

       MyDbf.AddIndex('custid', 'Id', [ixPrimary, ixUnique]);
       MyDbf.AddIndex('custname','Name', [ixCaseInsensitive]);
       MyDbf.Close;

Bringen sie alles zusammen und sie erhalten...

Das folgende Beispiel erzeugt eine neue Tabelle "customers" im Code. Dies muß natürlich nur einmal getan werden, und danach öffnen sie die Tabelle nur, erzeugen sie sie nicht (erneut) ;-)

{ Wir benötigen die folgenden Units im USES Abschnitt:       }
{ uses Dbf, db, Dbf_Common                                   }
{ Dbf wird automatisch eingetragen wenn TDbf auf einem Formular abgelegt }
{ wird...   aber sie benötigen db für das DataSet Objekt und }
{ Dbf_Common für Dinge wie die Feldtyp Definitionen          }
var
  MyDbf: TDbf;
begin
  MyDbf := TDbf.Create(nil);
  try
    { benutzen sie relative Pfade zum "data" Verzeichnis}
    MyDbf.FilePath := 'data/'; 
    { wir wollen Visual dBase VII kompatible Tabellen benutzen }
    MyDbf.TableLevel := 7;
    MyDbf.Exclusive := True;
    MyDbf.TableName := 'customers.dbf';
    With MyDbf.FieldDefs do begin
      Add('Id', ftAutoInc, 0, True);
      Add('Name', ftString, 80, True);
    End;
    MyDbf.CreateTable;
    MyDbf.Open;
    MyDbf.AddIndex('custid', 'Id', [ixPrimary, ixUnique]);
    { fügt einen sekundären Index hinzu }
    MyDbf.AddIndex('custname','Name', [ixCaseInsensitive]);
    MyDbf.Close;
  finally
    MyDbf.Free;
  end;
end;

Externe Index Dateien

TDbf unterstützt auch das Speichern von Sekundärindexen in einer separaten Datei. Dies mag hilfreich sein, wenn die Datenbank sehr groß ist. Sekundärindex Dateien werden fast identisch erzeugt wie normale Indexe, aber mit dem Anhängen der '.ndx' Dateierweiterung:

    MyDbf.AddIndex('custname.ndx','Name', [ixCaseInsensitive]);


Jedes Mal wenn TDbf geöffnet wird, muß die Indexdatei geladen werden:

    MyDbf.OpenIndexFile('custname.ndx');


Und Indexe müssen referenziert werden inklusive der Erweiterung:

    MyDbf.IndexName := 'custname.ndx';


Index Dateien werden separat komprimiert mit:

    MyDbf.CompactIndexFile('custname.ndx');

Wie man TDbf mit datensensitiven Komponenten verbindet

Das Beispiel oberhalb zeigt wie man eine neue Datenbank Tabelle erzeugt im Code. Das Benutzen dieser Tabelle ist sogar noch einfacher.

Datensensitive Komponenten in Lazarus (so wie das TDbEdit Bedienelement) verbinden sich mit einer TDataSource Komponente unter Verwendung ihrer "DataSource" und "DataField" Eigenschaften. Die TDataSource Komponente wickelt die Kommunikation zwischen der Datenbank Engine und den datensensitiven Komponenten ab. Eine TDataSource verbindet sich dann mit der TDbf Komponente unter Verwendung ihrer "DataSet" Eigenschaft. Die Verbindung sieht wie folgt aus:

TDbEdit-------
             |
TDbEdit------|-->TDataSource-->TDbf
             |
TDbNavigator--


Stellen sie sicher, die FilePath (oder FilePathFulll), TableLevel, und TableName Eigenschaften ihrer TDbf Komponente zu setzen bevor sie

TDbf.Active := True;

aurufen.

Es gibt viel mehr als gesagt werden kann über die Programmierung mit Datenbanken in Lazarus, und ich würde ein gutes Delphi Datenbank Programmierung Buch oder zwei empfehlen da die grundlegenden Konzepte die selben sind. Ich verweise ständig auf mein Exemplar von "Delphi 2 Unleashed" weil die Konzepte und der wesentliche Code sich in 8 Jahren nicht sehr geändert haben.

Komprimieren und erneuern der Tabellen

Wenn ein Datensatz gelöscht wird, ist er nicht wirklich aus der physikalischen Tabelle entfernt. Periodisch müssen sie eine Tabelle komprimieren um diesen verlorenen Platz wiederzuerlangen. Dies sollte getan werden mit der Exklusivmodus Einstellung.

MyDbf.Exclusive := True;
MyDbf.Open;
MyDbf.PackTable;
// erneuert auch alle Indexe
MyDbf.RegenerateIndexes;
MyDbf.Close;
MyDbf.Exclusive := False;

Master Tabellen Beziehungen

Wirkliche Leistung bei der Datenbank Programmierung beginnt wenn sie mehrere Tabellen haben, die sich auf einander beziehen. Während TDbf die referentielle Integrität noch nicht unterstützt, unterstützt es eine Master / Detail Beziehung zwischen TDbf's.

Wenn zwei Tabellen in Beziehung stehen, zum Beispiel:

[Kunden]
Id       <----|
Name          |
Phone         |
Address       |
              |  Die CustID in Rechnungen bezieht sich auf ein Kunden Primärfeld
[Rechnungen]  |
Id            |
Amount        |
CustID   -----|  * Diese Feld ist als as "idxcustid" indiziert


Wenn sie alle Rechnungen zu einem bestimmten Kunden anzeigen wollen, kann die Detailtabelle (Rechnungen) automatisch in Synchronität mit der Mastertabelle (Kunden) bleiben.

In der Rechnungen TDbf Komponente stellen sie das Folgende ein:

InvDbf.IndexName := 'idxcustid'; // unser Feld, das der Kunden Tabellen ID entsprechen wird
InvDbf.MasterSource := dsCustomers; // Datasource die mit der Kunden TDbf verbunden ist
InvDbf.MasterFields := 'Id'; // Feld in der Kunden Tabelle we are matching against our index

Beispielanwendung - DB Browser

Ich habe eine einfache Anwendung geschrieben, welche TDbf benutzt, um Datenbank Tabellen unter Verwendung des dbGrid Bedienelements zu öffnen und anzuzeigen. Das Linux executable zusammen mit den Projektquellen, welche should compile fine unter Windows, ist verfügbar von: tony.maro.net

Dinge, deren sie sich bewußt sein müssen

Gegenwärtig gibt es keine Unterstützung für referentielle Integrität, oder intern verschlüsselte .dbf Dateien.