[ 1 ] [ 2 ] [ 3 ] [ 4 ]

Datenstrukturen

SQL als Abfrage- und Manipulationssprache setzt strukturierte Daten voraus.

In VFP und allen anderen relationalen DBMS werden Daten in Tabellen gespeichert.

Informationen über die Struktur der Daten werden als „Metadaten“ (Daten über Daten) bezeiuchnet.

Tabellen

VFP ist als Datenbanksystem ein Zwitter. Einerseits arbeitet es mit „Freien Tabellen“, die nicht explizit in Datenbanken enthalten sind, andererseits erlaubt es die Anlage echter Datenbanken.

Beide Konzepte funktionieren gleichzeitig in der gleichen Anwendung.

Tabellen bestehen aus Spalten, Zeilen und Kopfinformationen (Header)

FoxPro-Tabellen enthalten zahlreiche Metadaten in ihrem Header:

Hier ein Auszug aus der VFP Hilfedatei

Visual FoxPro speichert Daten, die verschiedene Dateitypen definieren, in Tabellen. Die folgenden Dateitypen werden als Tabellendateien gespeichert:

  • Tabelle (.DBF)
  • Datenbank (.DBC)
  • Formular (.SCX)
  • Etikett (.LBX)
  • Menü (.MNX)
  • Projekt (.PJX)
  • Bericht (.FRX)
  • Bibliothek visueller Klassen (.VCX)

Da es sich bei diesen Dateien um Tabellen handelt, können Sie sie so verwenden und durchblättern, wie dies bei .DBF-Dateien möglich ist.

Eine Tabellendatei besteht aus einem Vorspanndatensatz und Daten-Datensätzen. Der Vorspanndatensatz definiert die Struktur der Tabelle und enthält auch alle anderen mit der Tabelle zusammenhängenden Informationen. Er beginnt an Dateiposition 0. Nach dem Vorspann folgen die Daten-Datensätze1 (in aufeinanderfolgenden Bytes), die den aktuellen Text der Felder enthalten.

Informationen über die Tabellenstrukturen der unterschiedlichen Dateitypen finden Sie unter "Tabellenstruktur von Tabellendateien".

Die Länge eines Datensatzes (in Bytes) erhalten Sie durch Summieren der definierten Länge aller Felder. Ganzzahlen werden in Tabellendateien mit dem niedrigstwertigen Byte zuerst gespeichert.

Struktur des Vorspanndatensatzes einer Tabelle

Versatz in Bytes   Beschreibung

0             Dateityp

0x02       FoxBASE

0x03       FoxBASE+/dBASE III PLUS, kein Memo

0x30       Visual FoxPro

0x43       dBASE IV SQL-Tabellendateien, kein Memo

0x63       dBASE IV SQL-Systemdateien, kein Memo

0x83       FoxBASE+/dBASE III PLUS, mit Memo

0x8B      dBASE IV mit Memo

0xCB      dBASE IV SQL-Tabellendateien, mit Memo

0xF5      FoxPro 2.x (oder früher) mit Memo

0xFB      FoxBASE

1 - 3        Letzte Aktualisierung (JJMMTT)

4 - 7        Anzahl der Datensätze in der Datei

8 - 9        Position des ersten Daten-Datensatzes

10 - 11   Länge eines Daten-Datensatzes (einschließlich Löschattribut)

12 - 27   Reserviert

28           Tabellenattribute

0x01       Datei hat eine strukturierte .CDX-Datei

0x02       Datei hat ein Memofeld

0x04       Datei ist eine Datenbank (.DBC)

Beachten Sie, daß dieses Byte eine Summe aus

oben genannten Werten enthalten kann. 0x03 gibt z.B. an,

daß die Datei eine strukturierte .CDX-Datei

und ein Memofeld hat.

29           Code-Seitenmarkierung

30 - 31   Reserviert, enthält 0x00

32 - n     Feld-Teildatensätze

Die Anzahl der Felder legt die Anzahl an

Feld-Teildatensätzen fest. Für jedes Feld der Tabelle gibt es einen Feld-Teildatensatz.

n+1        Vorspanndatensatz-Endzeichen (0x0D)

n+2 to n+264      Ein 263 Bytes umfassender Bereich, der die Rückverweisinformationen, also den relativen Pfad zur zugehörigen Datenbank (.DBC), enthält. Ist das erste Byte 0x00, ist die Tabelle nicht mit einer Datenbank verbunden. Datenbankdateien weisen an dieser Position deshalb immer den Wert 0x00 auf.

1 Die Daten in der Datendatei beginnen an der Position, die durch die Bytes 8 bis 9 des Vorspanndatensatzes angegeben ist. Daten-Datensätze beginnen mit einem Byte, das das Löschattribut setzt. Ist dieses Byte der ASCII-Wert für Leerzeichen (0x20), wird der Datensatz nicht gelöscht. Ist das erste Byte ein Sternchen (0x2A), wird der Datensatz gelöscht. Die Daten der Felder, die in den Feld-Teildatensätzen genannt sind, folgen auf das Löschattribut.

Struktur der Feld-Teildatensätze

Versatz in Bytes   Beschreibung

0 - 10     Feldname (maximal 10 Zeichen, bei weniger als 10 Zeichen wird der Name mit Nullzeichen (0x00) aufgefüllt)

11           Feldtyp:

C             -              Zeichen

Y             -              Währung

N             -              Numerisch

F             -              Gleitkomma

D             -              Datum

T             -              DatumZeit

B             -              Double

I              -              Integer

L             -              Logisch

M            -              Memo

G             -              Objekt

C             -              Zeichen (binär)

M            -              Memo (binär)

P             -              Bild

12 - 15   Adressenversatz des Feldes im Datensatz

16           Feldlänge (in Bytes)

17           Anzahl der Dezimalstellen

18           Feldattribute

0x01       Systemspalte (für Benutzende nicht sichtbar)

0x02       Spalte kann Nullwerte enthalten

0x04       Binärspalte (nur für CHAR und MEMO)

19 - 32   Reserviert

Informationen über die Einschränkungen hinsichtlich der Anzahl der Zeichen pro Datensatz, der Höchstzahl an Feldern usw. finden Sie unter "Kapazität von Visual FoxPro-Systemkomponenten".

Bemerkungen

Visual FoxPro ändert den Vorspann einer Datei, die im FoxPro 2.x-Dateiformat gespeichert wurde, nur, wenn die Datei mindestens um eine der folgenden Eigenschaften erweitert wurde:

  • Unterstützung von Nullwerten
  • Die Datentypen "DatumZeit", "Währung" und "Double" wurden hinzugefügt
  • CHAR- oder MEMO-Feld ist als binär markiert
  • Eine Tabelle wurde zu einer Datenbankdatei (.DBC) hinzugefügt

Tip   Mit der folgenden Formel können Sie die Anzahl der Felder einer Tabellendatei zurückgeben lassen: (x - 296/32). In dieser Formel ist x die Position des ersten Datensatzes (Bytes 8 bis 9 im Tabellenvorspann-Datensatz), 296 = 263 (Rückverweisinformationen) + 1 (Vorspanndatensatz-Endzeichen) + 32 (erster Feld-Teildatensatz), und 32 ist die Länge eines Feld-Teildatensatzes.

Ende Auszug aus VFP Hilfe

Spalten (Felder)

Tabellenspalten haben Namen. Je eine Spalte kann genau einen Typ von Daten enthalten.
Jedes DBMS hat eigene Regeln über die Bildung der Spaltennamen

  • Länge
  • Verwendbare Zeichen
  • Verbot von Schlüsselwörtern

Sätze (Zeilen)

Die Gesamtheit der Spalten in einer Zeile der Tabelle bildet einen „Satz“

Datentypen

Bei der Definition einer Spalte muß angegeben werden, welchen Datentyp sie speichern soll.

Die folgende Tabelle zeigt die in VFP 5.0 zulässigen Typen:

FieldType FieldWidth Nprecision Beschreibung

C

n

-

Zeichenfeld der Breite n

D

- (immer 8)

-

Datum

T

-

-

DatumZeit

N

N

D

Numerisches Feld der Breite n mit d Dezimalstellen

F

N

D

Gleitkommafeld der Breite n mit d Dezimalstellen

I

- (immer 4)

-

Integer

B

-

D

Double

Y

-

-

Währung

L

-   (1)

-

Logisch

M

-

-

Memo

G

-

-

Objekt

Für die Typen D, T, I, Y, L, M, G und P werden nFieldWidth und nPrecision ignoriert. Für die Feldtypen N und F gilt für nPrecision standardmäßig der Wert 0 (keine Dezimalstellen), wenn Sie nPrecision nicht angeben. Wird für den Feldtyp B nPrecision nicht angegeben, so wird der mittels SET DECIMAL eingestellte Wert verwendet.

NULL   Gibt an, daß das Feld Nullwerte enthalten kann. Können ein oder mehrere Felder Nullwerte enthalten, reduziert sich die Anzahl möglicher Felder um von 255 eins auf 254.

NOT NULL   Gibt an, daß das Feld keine Nullwerte enthalten darf.

Vergleichsoperatoren

Abfragen zielen immer wieder auf Daten, die bestimmten Bedingungen entsprechen (where ...)

Diese Bedingungen werden mit Hilfe von Operatoren beschrieben, die Feldinhalte miteinander oder mit externen Parametern vergleichen. Das Ergebnis eines Vergleiches muß .T. oder .F. sein, damit der entsprechende Satz in das Abfrageergebnis übernommen wird.

Nur Werte vom gleichen Datentyp lassen sich vergleichen!

Operator Vergleich

=

Gleich

= =

Genau gleich

LIKE

SQL LIKE

<>, !=, #

Ungleich

>

Größer als

>=

Größer als oder gleich

<

Kleiner als

<=

Kleiner als oder gleich

Wenn Sie den Operator = mit Zeichenfolgen verwenden, hängt seine Wirkungsweise von der SET ANSI-Einstellung ab. Ist SET ANSI auf OFF eingestellt, behandelt Visual FoxPro Zeichenfolgenvergleiche genau wie in Xbase. Ist SET ANSI auf ON eingestellt, werden Zeichenfolgenvergleiche entsprechend den ANSI-Regeln behandelt. Weitere Informationen, wie Visual FoxPro Zeichenfolgenvergleiche vornimmt, finden Sie unter SET ANSI und SET EXACT.

Vergleichsfunktionen

Ebenso wie mit Operatoren steuert man Vergleiche zum Zwecke der Datenauswahl (Restriktion) mit funktionen.

Am häufigsten verwendet man

INLIST(<Vergleichsausdruck>,<Parameterliste>)

<Vergleichsausdruck> IN (<Parameterliste>), IN (<subquery>)

EXISTS (<subquery>)

<Vergleichsausdruck> BETWEEN <unterer Wert> AND <oberer Wert>

Alle Vergleiche können auch negiert werden: Where NOT EXISTS () etc.

Die folgenden Feldfunktionen sind für ein Auswahlelement (Select_Item) verfügbar, wenn das Element ein Feld oder ein Ausdruck ist, der ein Feld betrifft:

Feldfunktion Beschreibung

AVG(Select_Item)

berechnet den Durchschnitt einer Spalte mit numerischen Daten.

COUNT(Select_Item)

zählt, wie viele Elemente einer Spalte ausgewählt sind.

COUNT(*)

Zählt die Anzahl der Zeilen der Abfrageausgabe.

MIN(Select_Item)

Ermittelt den kleinsten Wert von Select_Item in einer Spalte.

MAX(Select_Item)

Ermittelt den größten Wert von Select_Item in einer Spalte.

SUM(Select_Item)

Berechnet die Summe einer Spalte mit numerischen Daten.

Sie können Feldfunktionen nicht verschachteln.

Schlüssel (Kandidaten, Primäre S., Fremdschlüssel)

Schlüssel sind Teil oder Teile des Datensatzes, durch die er zu identifizieren ist.

Man unterscheidet eindeutige und mehrdeutige Schlüssel.

In einer Gruppe von Personen ist der Familienname zwar ein Schlüssel, der eine Untergruppe identifiziert, erc ist jedoch nicht sicher eindeutig. Innerhalb der entsprechenden Familie ist er offensichtlich als Schlüssen unbrauchbar. Zusammen mit dem Vornamen, der üblicherweise in der Familie eindeutig ist, kann er in einer größeren Personengruppe eindeutigen Schlüssel sein.

Die Gültigkeit von Schlüsseln ist davon abhängig, mit welcher Absicht sie Verwendet werden!

Optimierung

Rushmore (Indexoptimierung)

Indizes sind bei VFP für die Suche optimierte, sogenannte „gewichtete Bäume“. Das heißt, daß mit sehr wenigen Suchverzweigungen der erste Treffer einer Abfrage gefunden wird. Alle weiteren Sätze der Ergebnismenge liegen dann in unmittelbarer Nähe.

VFP versucht, aus Ihrer SQL- Abfrage „das beste zu machen“.

Wenn Sie in der Where-Klausel ihrer Abfrage die gleichen Ausdrücke verwenden, mit denen Sie die Indizes der Tabellen angelegt haben, kann VFP die Indizes verwenden, um die Treffermenge festzustellen.

Beispiel:

 Use Kunden 
 Index on upper(name) tag name 
 Select * from Kunden where name = „Maier“ (Nicht optimierbar) 
 Select * from Kunden where upper(name) = „Maier“ (Optimierbar) 

Optimierbare Ausdrücke sind grundsätzlich wie folgt gestaltet:

Indexausdruck Vergleichsoperator Vergleichsausdruck

-oder-

Vergleichsausdruck Vergleichsoperator Indexausdruck

Dabei gelten folgende Bedingungen:

Indexausdruck entspricht genau dem Ausdruck, mit dem der Index gebildet wurde.

Indexausdruck ist ein beliebiger Ausdruck und kann Variablen und Felder von anderen Tabellen enthalten

Vergleichsoperator ist einer der folgenden Operatoren:
<, >, =, <=, >=, <>, #, ==, !=.

Sie können auch isnull(), between(), oder inlist() benutzen.

Vorsicht: isblank( ) and emty( ) sind nicht optimierbar.

Optimierbare und nicht optimierbare Ausdrücke können kombiniert werden. Der komplexe Ausdruck kann dann teiloptimierbar sein.

Wird ein optimierbarer Ausdruck durch „or“ mit einem nicht optimierbaren verknüpft, so ist der komplexe Ausdruck nicht optimierbar.

Auch für die Verknüpfung von Quelltabellen (join) benutzt VFP Indizes, wenn sie den Join-Bedingungen entsprechen.

Indizes, die nicht mit der aktuellen Collate-Sequenz erstellt wurden, sind nicht optimierungstauglich.

Ebenso Indizes, die eine For-Klausel enthalten.

Verwenden Sie die Funktion SYS(3054), um sich den Optimierungsstatus anzeigen zu lassen!

Pufferungsoptionen – Datei- und Satzsperren

Wenn Ihre Datenbank (oder Tabelle), auf der Sie eine Abfrage ausführen, im Mehrbenutzerbetrieb „geshared“ geöffnet ist, muß VFP abhängig vom eingestellten Pufferungsmodus (kein, pessimistische Satzpufferung, ..., optimistische Tabellenpufferung) bei jedem Zugriff Nebenarbeiten erledigen, um die Konsistenz der Daten zu gewährleisten.

Speichersnutzung

VFP lädt Tabellen, Indices, Zwischenergebnisse in den Speicher – solange freier Speicher zur Verfügung steht. Ist der Hauptspeicher belegt, werden weitere Zugriffe auf der Festplatte des lokalen Rechners oder des Fileservers (!) ausgeführt.

Denormierung

Abfragen auf „flache“ Tabellen, die alle Merkmale redundant enthalten, können schneller sein, als „Joins“ mit vielen Relationen. „Flache“ Tabellen können aber sehr groß werden und auch deshalb Laufzeitprobleme bereiten.

[ 1 ] [ 2 ] [ 3 ] [ 4 ]