Difference between revisions of "Lazarus Tdbf Tutorial/de"

From Free Pascal wiki
Jump to navigationJump to search
m (Fixed syntax highlighting)
 
(28 intermediate revisions by 7 users not shown)
Line 1: Line 1:
=Überblick=
+
{{Lazarus Tdbf Tutorial}}
  
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 [[User:Tonymaro | Tony Maro]] aber andere Mitwirkende sind willkommen!
 
  
===Was sie benötigen werden===
+
Zurück zu den [[Additional information/de|Zusätzlichen Informationen]].
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===
+
== Überblick ==
The TDbf provides access to dBase and FoxPro database tables for Lazarus (and others). It allows for reading, writing and creation of dBase III+, dBase IV, Visual dBase VII and FoxPro tables. It does all of this without the need for additional libraries or database engines. Simply drop the TDbf on your form and you have instant access to a cross-platform database environment. The TDbf works in both Windows and Linux using Lazarus.
 
  
=Wie man eine neue Datenbank Tabelle erzeugt=
+
Dieses Tutorial behandelt die grundlegende Datenbank Entwicklung unter Verwendung der [https://tdbf.sf.net TDbf] Komponente (entwickelt von Micha Nelissen) mit Lazarus. Zusätzliche Dokumentation für TDbf ist verfügbar. Diese Seite wurde erstellt von [[User:Tonymaro | Tony Maro]] aber auch andere Mitwirkende sind willkommen!
  
As there is no "Database Desktop" application for Lazarus yet, we must create a new database in code.
+
Für ein TDbf Dokumentation PDF gehen sie zur [https://sourceforge.net/project/showfiles.php?group_id=34085&package_id=26371  SourceForge] Seite. Es mag hilfreich sein, während des Lesens das PDF neben dieses Dokument zu halten.
  
===Setzen des Pfades===
+
=== Was sie benötigen werden ===
It's a good idea to give your application's database it's own directory. This simplifies making backups of the data. There are two ways to set the path. You can set the full path using the FilePathFull property, or you can set a path relative to the current application path with FilePath. For instance, setting "FilePath" at runtime to "data/" would use a data subdirectory just below the executable file. Setting the "FilePathFull" property to "/var/data/" would place everthing in that exact folder, ignoring the application's location.
 
  
=== Wählen eines Tabellenlevels ===
+
Das DBFLaz Package wird inzwischen standardmäßig bei der Installation von Lazarus mitinstalliert. Die TDbf Komponente befindet sich auf der 'Data Access' Seite in der Komponentenpalette.
By default, the TDbf will create dBase IV tables. While this is very compatible, there are features you may wish to use that are not supported. To support auto-incrementing fields, you must use something newer. The table types are:
+
 
 +
=== 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 auf eine cross-platform Datenbank-Umgebung. TDbf funktioniert unter 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 Tabellentypen sind:
  
 
*3 dBase III+
 
*3 dBase III+
Line 26: Line 36:
 
*25 FoxPro
 
*25 FoxPro
  
You choose a table type by setting the TableLevel property appropriately.
+
Sie wählen einen Tabellentyp, indem sie die TableLevel Eigenschaft entsprechend setzen.
 +
 
 +
=== Hinzufügen von Feldern ===
  
=== Adding Felder===
+
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 Eigenschaften gesetzt haben, manipulieren sie die FieldDefs Eigenschaft, um die Struktur festzulegen. Zum Beispiel:
Creating fields for your new table at runtime pretty much follows the old Delphi standard. Once you have set your FilePath, TableLevel, and TableName properties, manipulate the FieldDefs property to set up the structure. For example:
 
  
  MyDbf.FilePathFull := '/location/to/my/data';
+
<syntaxhighlight lang=pascal>
 +
  MyDbf.FilePathFull := '/Ort/für/meine/Daten';
 
  MyDbf.TableLevel := 7;
 
  MyDbf.TableLevel := 7;
  MyDbf.TableName := 'customers.dbf'; // note: is the .dbf really required?
+
  MyDbf.TableName := 'customers.dbf'; // Notiz: Wird .dbf wirklich benötigt?
 
  With MyDbf.FieldDefs do begin
 
  With MyDbf.FieldDefs do begin
 
   Add('Id', ftAutoInc, 0, True);
 
   Add('Id', ftAutoInc, 0, True);
 
   Add('Name', ftString, 80, True);
 
   Add('Name', ftString, 80, True);
 
  End;
 
  End;
 +
</syntaxhighlight>
  
Field types are defined as:
+
Feld Typen sind definiert als:
  
 
*    ftUnknown
 
*    ftUnknown
Line 55: Line 68:
 
*    '''ftBytes''' (TableLevel 25)
 
*    '''ftBytes''' (TableLevel 25)
 
*    ftVarBytes
 
*    ftVarBytes
*    '''ftAutoInc''' (TableLevel 7 or 25)
+
*    '''ftAutoInc''' (TableLevel 7 oder 25)
 
*    '''ftBlob'''
 
*    '''ftBlob'''
 
*    '''ftMemo'''
 
*    '''ftMemo'''
Line 80: Line 93:
 
*    ftFMTBcd
 
*    ftFMTBcd
  
Bold types are currently supported
+
Fett geschriebene Typen werden gegenwärtig unterstützt.
 +
 
 +
=== Erzeugen sie die Tabelle ! ===
  
===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:
 
Sobald sie die Felder definiert haben, die sie in ihrer neuen Tabelle benutzen wollen, können sie vorangehen und sie mit:
  
 +
<syntaxhighlight lang=pascal>
 
     MyDbf.CreateTable;
 
     MyDbf.CreateTable;
 +
</syntaxhighlight>
  
 
erzeugen.
 
erzeugen.
  
=Wie man einen Index zu einer Tabelle hinzufügt=
+
== Wie man einen Index zu einer Tabelle hinzufügt ==
  
If your database is larger than a few records, chances are you will want to have indexes defined to make searching faster. To change the index structure of a table, we will want to have exclusive access to the table - which we would have while creating it anyway.
+
Wenn ihre Datenbank größer ist als ein paar Datensätze, wollen sie möglicherweise Indizes definieren, um das Suchen zu beschleunigen. Um die Indexstruktur einer Tabelle zu ändern, benötigen wir exklusiven Zugriff auf die Tabelle - welchen wir ohnehin haben, während wir ihn erzeugen.
  
 +
<syntaxhighlight lang=pascal>
 
         MyDbf.Exclusive := True;
 
         MyDbf.Exclusive := True;
 
         MyDbf.Open;
 
         MyDbf.Open;
 +
</syntaxhighlight>
  
Now, we just have to add the index.
+
Nun, müssen wir einfach den Index hinzufügen.
  
 +
<syntaxhighlight lang=pascal>
 
         MyDbf.AddIndex('custid', 'Id', [ixPrimary, ixUnique]);
 
         MyDbf.AddIndex('custid', 'Id', [ixPrimary, ixUnique]);
 
         MyDbf.AddIndex('custname','Name', [ixCaseInsensitive]);
 
         MyDbf.AddIndex('custname','Name', [ixCaseInsensitive]);
 
         MyDbf.Close;
 
         MyDbf.Close;
 +
</syntaxhighlight>
  
= Bringen sie alles zusammen und sie erhalten...=
+
== Alles zusammen ergibt... ==
  
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) ;-)
+
Das folgende Beispiel erzeugt eine neue Tabelle "customers" im Code. Dies muss 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:      }
+
<syntaxhighlight lang=pascal>
{ uses Dbf, db, Dbf_Common                                   }
+
{$MODE OBJFPC}
{ Dbf wird automatisch eingetragen wenn TDbf auf einem Formular abgelegt }
+
Program DatabaseTest;  
{ wird...  aber sie benötigen db für das DataSet Objekt und }
+
{ Wir benötigen die folgenden Units im USES Abschnitt:      }
{ Dbf_Common für Dinge wie die Feldtyp Definitionen          }
+
uses Dbf, db, Dbf_Common;           
var
+
{ Dbf wird automatisch eingetragen wenn TDbf auf einem Formular abgelegt }
  MyDbf: TDbf;
+
{ wird...  aber sie benötigen db für das DataSet Objekt und }
begin
+
{ Dbf_Common für Dinge wie die Feldtyp Definitionen          }
  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=
+
var
 +
  MyDbf: TDbf;
 +
begin
 +
  MyDbf := TDbf.Create(nil);
 +
  try
 +
    { benutzen sie relative Pfade zum "data" Verzeichnis}
 +
    MyDbf.FilePath := 'data/';
  
The TDbf also supports storing secondary indexes in a separate file. This might be helpful if the database is expected to be very large. Secondary index files are created almost identically to normal indexes, but with the addition of the '.ndx' file extension:
+
    { 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.
 +
</syntaxhighlight>
 +
 +
== 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:
 +
 +
<syntaxhighlight lang=pascal>
 
     MyDbf.AddIndex('custname.ndx','Name', [ixCaseInsensitive]);
 
     MyDbf.AddIndex('custname.ndx','Name', [ixCaseInsensitive]);
 +
</syntaxhighlight>
  
 +
Jedes Mal wenn TDbf geöffnet wird, muss die Indexdatei geladen werden:
  
Each time the TDbf is opened, the index file must be loaded:
+
<syntaxhighlight lang=pascal>
 
 
 
     MyDbf.OpenIndexFile('custname.ndx');
 
     MyDbf.OpenIndexFile('custname.ndx');
 +
</syntaxhighlight>
  
 +
Und Indexe müssen referenziert werden inklusive der Erweiterung:
  
And indexes must be referenced including the extension:
+
<syntaxhighlight lang=pascal>
 
 
 
     MyDbf.IndexName := 'custname.ndx';
 
     MyDbf.IndexName := 'custname.ndx';
 +
</syntaxhighlight>
  
 +
Index Dateien werden separat komprimiert mit:
  
Index files are packed separately using:
+
<syntaxhighlight lang=pascal>
 
 
 
     MyDbf.CompactIndexFile('custname.ndx');
 
     MyDbf.CompactIndexFile('custname.ndx');
 +
</syntaxhighlight>
  
= Wie man TDbf mit data-aware Komponenten verbindet=
+
== Wie man TDbf mit datensensitiven Komponenten verbindet ==
  
The above examples show how to create a new database table in code. Using that table is even more simple.
+
Das Beispiel oberhalb zeigt wie man eine neue Datenbank Tabelle erzeugt im Code. Das Benutzen dieser Tabelle ist sogar noch einfacher.
  
Data aware components in Lazarus (such as the TDbEdit control) link to a TDataSource component using their "DataSource" and "DataField" properties. The TDataSource component handles communication between the database engine and the data aware components. A TDataSource then links to the TDbf component using it's "DataSet" property. The connection looks like this:
+
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-------
Line 171: Line 203:
  
  
Be sure to set the FilePath (or FilePathFulll), TableLevel, and TableName properties of your TDbf component before calling
+
Stellen sie sicher, die FilePath (oder FilePathFull), TableLevel, und TableName Eigenschaften ihrer TDbf Komponente zu setzen bevor sie
  
 
  TDbf.Active := True;
 
  TDbf.Active := True;
  
 +
aufrufen.
  
There is much more that can be said about programming with databases in Lazarus, and I would recommend a good Delphi database programming book or two as the underlying concepts are the same. I constantly refer to my copy of "Delphi 2 Unleashed" because the concepts and basic code haven't changed much in 8 years.
+
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.
  
 +
<syntaxhighlight lang=pascal>
 
  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;
 
  MyDbf.Exclusive := False;
 
  MyDbf.Exclusive := False;
 +
</syntaxhighlight>
  
= Master Tabellen Beziehungen=
+
== 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.
+
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.
  
When there are two tables related, for instance:
+
Wenn zwei Tabellen in Beziehung stehen, zum Beispiel:
  
  [customers]
+
  [Kunden]
 
  Id      <----|
 
  Id      <----|
 
  Name          |
 
  Name          |
 
  Phone        |
 
  Phone        |
 
  Address      |
 
  Address      |
               |  The CustID in invoices references a customer primary  field
+
               |  Die CustID in Rechnungen bezieht sich auf ein Kunden Primärfeld
  [invoices]   |
+
  [Rechnungen] |
 
  Id            |
 
  Id            |
 
  Amount        |
 
  Amount        |
  CustID  -----|  * This field indexed as "idxcustid"
+
  CustID  -----|  * Diese Feld ist als as "idxcustid" indiziert
 +
 
  
 +
Wenn sie alle Rechnungen zu einem bestimmten Kunden anzeigen wollen, kann die Detailtabelle (Rechnungen) automatisch in Synchronizität mit der Mastertabelle (Kunden) bleiben.
  
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.
+
In der Rechnungen TDbf Komponente stellen sie das Folgende ein:
  
On the invoices TDbf component set the following:
+
<syntaxhighlight lang=pascal>
 +
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, das wir gegen unseren Index abgleichen
 +
</syntaxhighlight>
  
  InvDbf.IndexName := 'idxcustid'; // our field that will match the customers table ID
+
== Beispielanwendung - DB Browser ==
InvDbf.MasterSource := dsCustomers; // datasource that is linked to the customers TDbf
+
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 auch unter Windows kompilieren sollten, ist verfügbar von: [http://tony.maro.net/mod.php?mod=downloads&op=showcat&id=3&level=1 tony.maro.net]
InvDbf.MasterFields := 'Id'; // field on the customers table we are matching against our index
 
  
= Beispielanwendung - DB Browser=
+
== Dinge, deren sie sich bewusst sein müssen ==
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:  [http://tony.maro.net/mod.php?mod=downloads&op=showcat&id=3&level=1 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.
  
Gegenwärtig gibt es keine Unterstützung für referentielle Integrität, oder intern verschlüsselte .dbf Dateien.
+
== See also ==
 +
*[[Example: TDbf (creating table and indexes, selecting of index)]]

Latest revision as of 00:34, 19 February 2020

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


Zurück zu den Zusätzlichen Informationen.


Ü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 auch andere Mitwirkende sind willkommen!

Für ein TDbf Dokumentation PDF gehen sie zur SourceForge Seite. Es mag hilfreich sein, während des Lesens das PDF neben dieses Dokument zu halten.

Was sie benötigen werden

Das DBFLaz Package wird inzwischen standardmäßig bei der Installation von Lazarus mitinstalliert. Die TDbf Komponente befindet sich auf der 'Data Access' Seite in der Komponentenpalette.

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 auf eine cross-platform Datenbank-Umgebung. TDbf funktioniert unter 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 Tabellentypen 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 Eigenschaften 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.

Erzeugen sie die Tabelle !

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 Indizes definieren, um das Suchen zu beschleunigen. Um die Indexstruktur 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;

Alles zusammen ergibt...

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

{$MODE OBJFPC}
Program DatabaseTest;  
{ 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, muss 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 FilePathFull), TableLevel, und TableName Eigenschaften ihrer TDbf Komponente zu setzen bevor sie

TDbf.Active := True;

aufrufen.

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 Synchronizitä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, das wir gegen unseren Index abgleichen

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 auch unter Windows kompilieren sollten, ist verfügbar von: tony.maro.net

Dinge, deren sie sich bewusst sein müssen

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

See also