Sign in Join
Wiki copytemporary

Lazarus Tdbf Tutorial/de: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11Zurück zu den [[Additional information/de|Zusätzlichen Informationen]].
22
33## Überblick
44
55Dieses Tutorial behandelt die grundlegende Datenbank Entwicklung unter Verwendung der [TDbf](https://tdbf.sf.net) 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!
66
77Für ein TDbf Dokumentation PDF gehen sie zur [SourceForge](https://sourceforge.net/project/showfiles.php?group_id=34085&package_id=26371) Seite. Es mag hilfreich sein, während des Lesens das PDF neben dieses Dokument zu halten.
88
99### Was sie benötigen werden
1010
1111Das 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.
1212
1313### Was TDbf bietet
1414
1515TDbf 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.
1616
1717## Wie man eine neue Datenbank Tabelle erzeugt
1818
1919Da es noch keine "Datenbank Desktop" Anwendung für Lazarus gibt, müssen wir eine neue Datenbank im Code erzeugen.
2020
2121### Setzen des Pfades
2222
2323Es 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.
2424
2525### Wählen eines Tabellenlevels
2626
2727Per 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:
2828
2929- 3 dBase III+
3030- 4 dBase IV
3131- 7 Visual dBase VII
3232- 25 FoxPro
3333
3434Sie wählen einen Tabellentyp, indem sie die TableLevel Eigenschaft entsprechend setzen.
3535
3636### Hinzufügen von Feldern
3737
3838Das 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:
3939
4040``` pascal
4141 MyDbf.FilePathFull := '/Ort/für/meine/Daten';
4242 MyDbf.TableLevel := 7;
4343 MyDbf.TableName := 'customers.dbf'; // Notiz: Wird .dbf wirklich benötigt?
4444 With MyDbf.FieldDefs do begin
4545 Add('Id', ftAutoInc, 0, True);
4646 Add('Name', ftString, 80, True);
4747 End;
4848```
4949
5050Feld Typen sind definiert als:
5151
5252- ftUnknown
5353- **ftString**
5454- **ftSmallInt**
5555- **ftInteger**
5656- **ftWord**
5757- **ftBoolean**
5858- **ftFloat**
5959- **ftCurrency** (TableLevel 25)
6060- **ftBCD** (TableLevel 25)
6161- **ftDate**
6262- ftTime
6363- **ftDateTime**
6464- **ftBytes** (TableLevel 25)
6565- ftVarBytes
6666- **ftAutoInc** (TableLevel 7 oder 25)
6767- **ftBlob**
6868- **ftMemo**
6969- ftGraphic
7070- ftFmtMemo
7171- ftParadoxOle
7272- **ftDBaseOle**
7373- ftTypedBinary
7474- ftCursor
7575- **ftFixedChar**
7676- **ftWideString**
7777- **ftLargeInt**
7878- ftADT
7979- ftArray
8080- ftReference
8181- ftDataSet
8282- ftOraBlob
8383- ftOraClob
8484- ftVariant
8585- ftInterface
8686- ftIDispatch
8787- ftGuid
8888- ftTimeStamp
8989- ftFMTBcd
9090
9191Fett geschriebene Typen werden gegenwärtig unterstützt.
9292
9393### Erzeugen sie die Tabelle !
9494
9595Sobald sie die Felder definiert haben, die sie in ihrer neuen Tabelle benutzen wollen, können sie vorangehen und sie mit:
9696
9797``` pascal
9898 MyDbf.CreateTable;
9999```
100100
101101erzeugen.
102102
103103## Wie man einen Index zu einer Tabelle hinzufügt
104104
105105Wenn 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.
106106
107107``` pascal
108108 MyDbf.Exclusive := True;
109109 MyDbf.Open;
110110```
111111
112112Nun, müssen wir einfach den Index hinzufügen.
113113
114114``` pascal
115115 MyDbf.AddIndex('custid', 'Id', [ixPrimary, ixUnique]);
116116 MyDbf.AddIndex('custname','Name', [ixCaseInsensitive]);
117117 MyDbf.Close;
118118```
119119
120120## Alles zusammen ergibt...
121121
122122Das 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) ;-)
123123
124124``` pascal
125125{$MODE OBJFPC}
126126Program DatabaseTest;
127127{ Wir benötigen die folgenden Units im USES Abschnitt: }
128128uses Dbf, db, Dbf_Common;
129129{ Dbf wird automatisch eingetragen wenn TDbf auf einem Formular abgelegt }
130130{ wird... aber sie benötigen db für das DataSet Objekt und }
131131{ Dbf_Common für Dinge wie die Feldtyp Definitionen }
132132
133133var
134134 MyDbf: TDbf;
135135begin
136136 MyDbf := TDbf.Create(nil);
137137 try
138138 { benutzen sie relative Pfade zum "data" Verzeichnis}
139139 MyDbf.FilePath := 'data/';
140140
141141 { wir wollen Visual dBase VII kompatible Tabellen benutzen }
142142 MyDbf.TableLevel := 7;
143143 MyDbf.Exclusive := True;
144144 MyDbf.TableName := 'customers.dbf';
145145 With MyDbf.FieldDefs do begin
146146 Add('Id', ftAutoInc, 0, True);
147147 Add('Name', ftString, 80, True);
148148 End;
149149 MyDbf.CreateTable;
150150
151151 MyDbf.Open;
152152 MyDbf.AddIndex('custid', 'Id', [ixPrimary, ixUnique]);
153153 { fügt einen sekundären Index hinzu }
154154 MyDbf.AddIndex('custname','Name', [ixCaseInsensitive]);
155155 MyDbf.Close;
156156 finally
157157 MyDbf.Free;
158158 end;
159159end.
160160```
161161
162162## Externe Index Dateien
163163
164164TDbf 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:
165165
166166``` pascal
167167 MyDbf.AddIndex('custname.ndx','Name', [ixCaseInsensitive]);
168168```
169169
170170Jedes Mal wenn TDbf geöffnet wird, muss die Indexdatei geladen werden:
171171
172172``` pascal
173173 MyDbf.OpenIndexFile('custname.ndx');
174174```
175175
176176Und Indexe müssen referenziert werden inklusive der Erweiterung:
177177
178178``` pascal
179179 MyDbf.IndexName := 'custname.ndx';
180180```
181181
182182Index Dateien werden separat komprimiert mit:
183183
184184``` pascal
185185 MyDbf.CompactIndexFile('custname.ndx');
186186```
187187
188188## Wie man TDbf mit datensensitiven Komponenten verbindet
189189
190190Das Beispiel oberhalb zeigt wie man eine neue Datenbank Tabelle erzeugt im Code. Das Benutzen dieser Tabelle ist sogar noch einfacher.
191191
192192Datensensitive 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:
193193
194-`TDbEdit-------`\
195-`             |`\
196-`TDbEdit------|-->TDataSource-->TDbf`\
197-`             |`\
198-`TDbNavigator--`
194+```text
195+TDbEdit-------
196+ |
197+TDbEdit------|-->TDataSource-->TDbf
198+ |
199+TDbNavigator--
200+```
199201
200202Stellen sie sicher, die FilePath (oder FilePathFull), TableLevel, und TableName Eigenschaften ihrer TDbf Komponente zu setzen bevor sie
201203
202-`TDbf.Active := True;`
204+``` pascal
205+TDbf.Active := True;
206+```
203207
204208aufrufen.
205209
206210Es 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.
207211
208212## Komprimieren und Erneuern der Tabellen
209213
210214Wenn 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.
211215
212216``` pascal
213217 MyDbf.Exclusive := True;
214218 MyDbf.Open;
215219 MyDbf.PackTable;
216220 // erneuert auch alle Indexe
217221 MyDbf.RegenerateIndexes;
218222 MyDbf.Close;
219223 MyDbf.Exclusive := False;
220224```
221225
222226## Master Tabellen Beziehungen
223227
224228Wirkliche 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.
225229
226230Wenn zwei Tabellen in Beziehung stehen, zum Beispiel:
227231
228-`[Kunden]`\
229-`Id       <----|`\
230-`Name          |`\
231-`Phone         |`\
232-`Address       |`\
233-`              |  Die CustID in Rechnungen bezieht sich auf ein Kunden Primärfeld`\
234-`[Rechnungen]  |`\
235-`Id            |`\
236-`Amount        |`\
237-`CustID   -----|  * Diese Feld ist als as "idxcustid" indiziert`
232+```text
233+[Kunden]
234+Id <----|
235+Name |
236+Phone |
237+Address |
238+ | Die CustID in Rechnungen bezieht sich auf ein Kunden Primärfeld
239+[Rechnungen] |
240+Id |
241+Amount |
242+CustID -----| * Diese Feld ist als as "idxcustid" indiziert
243+```
238244
239245Wenn sie alle Rechnungen zu einem bestimmten Kunden anzeigen wollen, kann die Detailtabelle (Rechnungen) automatisch in Synchronizität mit der Mastertabelle (Kunden) bleiben.
240246
241247In der Rechnungen TDbf Komponente stellen sie das Folgende ein:
242248
243249``` pascal
244250 InvDbf.IndexName := 'idxcustid'; // unser Feld, das der Kunden Tabellen ID entsprechen wird
245251 InvDbf.MasterSource := dsCustomers; // Datasource die mit der Kunden TDbf verbunden ist
246252 InvDbf.MasterFields := 'Id'; // Feld in der Kunden Tabelle, das wir gegen unseren Index abgleichen
247253```
248254
249255## Beispielanwendung - DB Browser
250256
251257Ich 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](http://tony.maro.net/mod.php?mod=downloads&op=showcat&id=3&level=1)
252258
253259## Dinge, deren sie sich bewusst sein müssen
254260
255261Gegenwärtig gibt es keine Unterstützung für referentielle Integrität oder intern verschlüsselte .dbf Dateien.
256262
257263## See also
258264
259265- [[Example: TDbf (creating table and indexes, selecting of index)]]
260266
261267---
262268*From the Free Pascal wiki, page "Lazarus Tdbf Tutorial/de", as it stood on 2020-02-18 after a change by Trev, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history