DatenstrukturenSQL 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. TabellenVFP 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:
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:
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.
Sätze (Zeilen)Die Gesamtheit der Spalten in einer Zeile der Tabelle bildet einen „Satz“ DatentypenBei der Definition einer Spalte muß angegeben werden, welchen Datentyp sie speichern soll. Die folgende Tabelle zeigt die in VFP 5.0 zulässigen Typen:
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. VergleichsoperatorenAbfragen 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!
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:
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! OptimierungRushmore (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 SatzsperrenWenn 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. SpeichersnutzungVFP 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. DenormierungAbfragen 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.
|