Datenbankcontainer in Microsoft Visual FoxPro
Diese Schulung dient zur Einführung der Schulungsteilnehmer in die Arbeit mit Datenbankcontainer (im Vergleich zu Einzeltabellen) in Visual FoxPro
Themenübersicht Datenbankcontainer (Sinn/Struktur) Arbeiten mit dem Datenbankcontainer Grundbefehle des Datenbankcontainers Tabellen und Felder im DBC Buffering und Buffermode Transaktionen Referentielle Integrität Trigger (Insert, Update, Delete, Fehler)
Datenbankcontainer Datenbankcontainer fassen „freie Tabellen“ zu einer Datenbank zusammen und verwalten die Metadaten
Datenbankcontainer Ein DBC ist kein Data-Dictionary! Tabellenstrukturen im DBF-Header Indexstrukturen im CDX-Header Verwaltet Zusatzinformationen zu Feldern und Tabellen (nicht „freie“ Tabellen) Verwaltet persistente Relationen Verwaltet referentielle Integrität
Logische Bestandteile rules / triggers tables relations connections local views stored procedures remote views indexes
Physische Bestandteile FPT1 DBF1 CDX1 DBC DCT DCX CDXn DBFn DBF2 FPTn FPT2 CDX2
Arbeiten mit dem DBC Anlegen einer Tabelle Feldeigenschaften Anlegen einer Relation (Drag & Drop) Anlegen einer Ansicht (View) Anlegen einer Verbindung (Connection) Anlegen einer Remote Ansicht (View)
Tabellen im DBC CREATE TABLE ALTER TABLE ADD TABLE REMOVE TABLE FREE TABLE (!) CLOSE TABLE INDBC( ) VALID RULE VALID TEXT CAPTION COMMENT UPD TRIGGER () INS TRIGGER () DEL TRIGGER ()
Felder im DBC FORMAT MASK CAPTION VALID RULE VALID TEXT DEFAULT CLASS CLASSLIBS COMMENT Optionen beachten! (Klassenzuordnung)
Validierungen Feld-Ebene: VALID-Funktion Fehlermeldung Wahlweise Funktion oder Konstante Default-Wert dazu! Satz-Ebene: für Validierung über mehrere Felder ansonsten siehe Feld-Validierung Trigger kommen als separates Thema
Gespeicherte Prozeduren (1) Gehören imanent zu den Tabellen und wird als Prozedur-Datei gesetzt! Werden auch über ODBC ausgeführt! Verwendet für: Feld-Validierung, Feld-Fehlermeldung Satz-Validierung, Satz-Fehlermeldung Feld-Default-Wert Trigger-Aufrufe
Gespeicherte Prozeduren (2) Kompilate in DBC-Datensatz sind versionsabhängig (VFP 3.0, 5.0 / 6.0) - d.h. Neukompilieren (!) ggf. ausgelagerte Prozedurdatei verwenden Tabellen/Felder finden „richtige“ Prozedurdatei - eigene Anwendung verwendet aber nur aktiven DBC! Set database to Namenskonventionen für DBC-Funktionen!
Views im DBC Felder (Ausdrücke) Verknüpfung Filter Sortierung Gruppierung Aktualisierung Verschiedenes Schlüssel setzen Felder setzen SQL-Update setzen Where-Klausel Schlüssel änderbar! Feldeigenschaften!
Struktur des DBC OBJECTID PARENTID OBJECTTYPE => OBJECTNAME PROPTERY (M) CODE (M) RIINFO USER (M) Objekt-Typen: DATABASE TABLE FIELD INDEX VIEW CONNECTION
Grundbefehle DBC (1) CREATE DATA OPEN DATA MODIFY DATA CLOSE DATA DELETE DATA PACK DATA sortiert Schlüssel neu! VALIDATE DATA Zeigt manche Fehler nur! SET DATA TO Achtung: Projektmanager kann DBC offenhalten! Info-Funktionen: DBC() DBUSED()
Grundbefehle DBC (2) Sonstige Funktionen: Anzeigefunktionen: LIST DATABASE LIST TABLES LIST VIEWS LIST CONNECTIONS LIST PROCEDURE Sonstige Funktionen: ADATABASES( ) ADBOBJECTS( ) Eigenschaften ändern: DBGETPROP( ) DBSETPROP( )
DbGetProp( ) / DbSetProp( ) Datenbanken Tabellen Felder in Tabellen Ansichten Felder in Ansichten Verbindungen
Strukturänderungen Eigenlösungen: Neuen DBC mit geänderten Tabellen versenden SQL Alter Table-Befehl versenden Keine Primary Keys in VFP 3.0 / VFP 5.0 ! Fremdlösungen: XCASE-Zusatztool SDT-Zusatztool (Stonefield Database Toolkit)
Hinweise zum DBC Separates Datadictionary notwendig für Reindizierung od. Neuerzeugung wahlweise Eigenbau, XCase oder Stonefield wahlweise GENDBCX als Minimal-Lösung Tabellen und DBC sind eine Einheit Immer zusammen sichern / ändern FREE TABLE mit Vorsicht!
Buffering dient zur Zwischenspeicherung von Änderungen
Prinzip des Buffering OLDVAL- Puffer DBF- Eingabe- Datei Maske Daten- Methode zum automatischen Puffern von Daten zwischen einer Eingabe-Maske und der DBF-Datei auf der Festplatte OLDVAL- Puffer Eingabe- Maske DBF- Datei Daten- Puffer
Tablebuffering TABLEREVERT() TABLEUPDATE() CURSOR-GETPROP() CURSOR-SETPROP() CURVAL() OLDVAL() GETNEXT-MODIFIED() GETFLDSTATE() SETFLDSTATE()
Tableupdate / Tablerevert Parameter für Tableupdate( ) --- Einzelsatz .T. bis 1. Fehler 2 alle die gehen .T. Forced Update Parameter für Tablerevert( ) Einzelsatz Alle Änderungen Schließen = Revert!
Buffermode Buffermodes: 1-None 2-Pessimistic Row 3-Pessimistic Table 4-Optimistic Row 5-Optimistic Table Row: Skip = Update (!) Optimistic: Record changed! Curval/Oldval() GetFldState() Table-Buffering: Getnextmodified()
Funktionen im Einsatz Beispiele: ? GetFldState(-1) != Repl(„1“,Fcount()+1) ? Left( GetFldState(-1),1) != „1“ Goto ( GetNextModified( Recno() ) ) ? Field( At( „2“, GetFldState(-1) ) ) ? SetFldState( „Feld“, 1 ) && Views! Achtung: Negative Record-Nummern!
Reihenfolge Tabellenfeld-Valid (alle Felder) Masken-Valid (aktuelles Element) Datensatz-Valid(ierung) Primary/Candidate-Schlüssel Trigger kaskadierend über alle Childs Achtung: _TRIGGERLEVEL kann hoch werden
CursorGetProp( ) / CSetProp( ) Allgemein: Buffering (ein- /ausschalten, abfragen, Wert 1-5) Caption (Auslesen Text für Feldlabel zur Laufzeit) nur für Views (Auch im View-Designer): CompareMemo Updatable Updatable Field List Where Type
Vorsicht Falle! Allgemeine Probleme: GETNEXTMODIFIED / GETFIELDSTATE() => erst Feld verlassen! SetFldState( ) bei Views mit Requery() Table changed im View-Designer sofern alle Felder gewählt wurden (*) Sonderfall: Buffered Views auf Buffered Tables! Row: Fehler erst beim nächsten Satz! Tablerevert: Revert im View versagt Primary Key doppelt: Letzter gilt!
Transaktionen Transaktionen dienen dem vollständigen Abspeichern einer Gruppe von Datensätzen
Transaktionen BEGIN TRANS END TRANS ROLLBACK TXNLEVEL() *-- Datenzugriff END TRANS ROLLBACK Absturz = Rollback Rollback bei Öffnen! TXNLEVEL() bis 5 Ebenen tief! Äußerste Ebene zählt! Experimente mit Transaktionen: 1 Tabelle 2 Tabellen aus DBC Verschiedene DBCs Freie Tabellen Geschachtelt Task-Manager!
Probleme bei Transaktionen Buffering eingeschaltet = Transaktion läuft nur auf Buffer und nicht auf Platte! Buffering ausgeschaltet = Transaktion läßt Einschalten Buffering nicht zu! Dadurch ggf. neue Sätze nicht anlegbar (Valid) Lösung möglicherweise Buffering mit Tableupdate und dann END TRANS Freie Tabellen ohne Meldung! Deadlocks möglich - Zugriffsreihenfolge!
Zugriffsreihenfolge (Deadlocks!) Tabellen nach Parent->Child Immer erst den Parent sperren notfalls per SQL-Select erst die Parents holen Datensätze nach Primärschlüssel notfalls per SQL-Select umsortieren Mehrere Parents ggf. alphabetisch sofern Parents nicht in Parent-Child-Beziehung
Referentielle Integrität RI dient zur Wahrung der inhaltlichen Konsistenz Beziehungen zwischen Tabellen
Referentielle Integrität (RI) Bedeutung der Referentiellen Integrität einer Datenbank Arbeiten mit dem Referential Integrity Builder Programmatisch: CREATE TRIGGER DELETE TRIGGER _TRIGGERLEVEL Arten von Triggern: DELETE UPDATE INSERT
DELETE-Trigger Auslöser: DELETE-Befehl Nicht bei ZAP (!) Gefährlich!!! Nicht bei PACK (da Sätze gelöscht) Verhalten: CASCASE Cascading Delete RESTRICT sofern Parent vorh. IGNORE
INSERT-Trigger Auslöser: APPEND FROM APPEND BLANK IMPORT INSERT-SQL RECALL (!) Verhalten: RESTRICT Child nur zu Parent IGNORE INSERT unzulässig
UPDATE-Trigger Auslöser: GATHER REPLACE REPLACE FROM UPDATE-SQL nicht bei DELETED() (!) Verhalten: CASCADE Schlüssel zu Childs RESTRICT Parentschlüssel gesperrt IGNORE
Probleme mit Triggern Im Gegensatz zu Feld-Valid und Satz-Valid ist ein Triggerfehler ein endgültiger Fehler! Das heißt: VFP macht Rollback über alle Ebenen Probleme: Ändern von Daten! Update-Endlosschleife... Compound Keys Verschiedene DBCs Kein „Nullify“ für Delete von Parent Builder nicht ändern
Fehlermeldungen 1539 Trigger failed 1581 Field no NULL 1582 Field Rule 1=Ins, 2=Upd, 3=Del 1581 Field no NULL 1582 Field Rule 1583 Record Rule 1585 Change by A. 1700 Used by A. 1884 Unique index AERROR( ) Error() Message() Sys(2018) Select() Trigger-Art .NULL. Weitere Elemente für ODBC-Fehlermeldungen
Vielen Dank! Datenbankcontainer Arbeiten mit DBC Grundbefehle DBC Das waren die Themen: Datenbankcontainer Arbeiten mit DBC Grundbefehle DBC Tabellen und Felder Buffering Transaktionen Referentielle Integrität Trigger
Wenn Fragen bestehen: Wizards & Builders Frankfurter Str. 21b Methodische Software-Entwicklung GmbH Frankfurter Str. 21b 61476 Kronberg Tel.: 06173-950906 Fax: 06173-950907 CIS: 101605,175