Difference between revisions of "Lazarus Tdbf Tutorial/de"

From Free Pascal wiki
Jump to navigationJump to search
Line 179: Line 179:
 
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.
 
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.
  
= Packen und erneuern der Tabellen=
+
= Komprimieren und erneuern der Tabellen=
  
When a record is deleted, it's not truly removed from the physical table. Periodically you must "pack" a table to recover that lost space. This should be done with exclusive mode set.
+
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.Exclusive := True;
 
  MyDbf.Open;
 
  MyDbf.Open;
 
  MyDbf.PackTable;
 
  MyDbf.PackTable;
  // let's also rebuild all the indexes
+
  // erneuert auch alle Indexe
 
  MyDbf.RegenerateIndexes;
 
  MyDbf.RegenerateIndexes;
 
  MyDbf.Close;
 
  MyDbf.Close;

Revision as of 18:46, 7 September 2005

Ü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

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.

You will also need to install the DbfLaz package that comes with Lazarus. It's located in the lazarus/components/tdbf/ directory.

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

Real power in database programming begins when you have multiple tables that reference each other. While TDbf does not yet support referential integrity, it does support a master / detail relationship between TDbf's.

When there are two tables related, for instance:

[customers]
Id       <----|
Name          |
Phone         |
Address       |
              |  The CustID in invoices references a customer primary  field
[invoices]    |
Id            |
Amount        |
CustID   -----|  * This field indexed as "idxcustid"


If you wanted to display all invoices for a given customer, the detail table (invoices) can stay in sync with the master table (customers) automatically.

On the invoices TDbf component set the following:

InvDbf.IndexName := 'idxcustid'; // our field that will match the customers table ID
InvDbf.MasterSource := dsCustomers; // datasource that is linked to the customers TDbf
InvDbf.MasterFields := 'Id'; // field on the customers table 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.