DATA Arbeiten mit Daten in Visual Fox Pro
DATA Arbeiten mit Daten in Visual Fox. Pro 9. 0 deutschsprachige Fox. Pro User Group Rainer Becker Microsoft Visual Fox. Pro 9. 0 Roadshow
Vortragsthemen n n Datenbankcontainer Tabellen und Felder Nullwerte und Codepages Indizes und Sortiersequenzen Rushmore-Optimierung Relationen Buffering Netzwerkprogrammierung Transaktionen Trigger Referentielle Integrität
Datenbankcontainer n Verwaltet Zusatzinformationen n n n zu Tabellen (nicht „freie“ Tabellen) Felder und Indizes persistente Relationen gespeicherte Prozeduren referentielle Integrität / Trigger , Ereignisse Verbindungen, lokale und remote Views Ein DBC ist kein Data-Dictionary! n n Tabellenstrukturen im DBF-Header Indexstrukturen im CDX-Header
Hinweise zum DBC n n Projektmanager kann DBC offenhalten! Separates Datadictionary notwendig für Reindizierung oder Neuerzeugung n n n Tabellen und DBC sind eine Einheit n n wahlweise Eigenbau (Alter Table), XCASE, SDT, VFX wahlweise GENDBCX als Minimal-Lösung Immer zusammen sichern / ändern FREE TABLE problematisch bei langen Feldnamen n Auch copy to database kopiert Metadaten leider nicht
Datenbankengineänderungen n n ALTER TABLE Memofelder vor/zurück Umschalten mit n n SET ENGINEBEHAVIOR oder SYS(3099) Erinnerung: Leerzeichen n Leerzeichen in Tabellennamen zulässig Immer „“ bzw. () statt & verwenden Problematisch bei USE IN „tab 1 test“
Lange Feldtypenbezeichnungen n Datentyp Character Date. Time Numeric Floating Integer Double Currency Logical Memo General Picture Varchar Varbinary Blob Langer Name Char, Character Datetime Num, Numeric Float Int, Integer Double Currency Logical Memo General Picture Varchar Varbinary Blob Kurzer Name C D T N F I B Y L M G P V Q W
Feldarten n Character / Zeichen n n n n Character Binary Numeric / Zahl Date / Datum Logical / Logisch Memofelder (Char) n (c) Memo Binary General Auto. Increment Neu: Blob n n (n) (d) (l) m(c) n n n Integer / Integer Double / Doppelte G. Float / Fließkomma Currency / Währung Date. Time / Datum. Zeit Neu: Var. Character Neu: Var. Binary i(n) b(n) f(n) y(y) t(t) Feldlänge Memo / General / Blob von 4 Bytes
Blob n n n Alternative zu General-Feldern Ohne OLE-Server, kein Overhead Read-Only Hex. Code in Memofeldanzeige Kompatibel zu SQL-Server Beispiel Bilderspeicherung n n n pictureval oimg. pictureval = filetostr / blob loadpicture
Var. Char / Var. Binary n n n Format = „F“ verhindert Auffüllen des Value mit Leerstellen bei Var. Char oder CHR(0) bei Var. Binary. Inputmask =„HHHH…HH“ lässt nur Hexadezimaleingaben zu (0…F), sonst Präfix "0 h" SET Var. Char. Mapping ON | OFF Keine Einstellung in Extras->Optionen, Default ON Tabellen/Cursor-Spalten werden als Var. Char angelegt, wenn die erzeugende Funktion variable Längen liefert (vorname+nachname, func() )
Gespeicherte Prozeduren I n n n Gehören imanent zu den Tabellen und wird als Prozedur-Datei gesetzt! Werden auch über ODBC ausgeführt! Verwendet für: n n Feld-Validierung, Feld-Fehlermeldung Satz-Validierung, Satz-Fehlermeldung Feld-Default-Wert Trigger-Aufrufe
Gespeicherte Prozeduren II n Kompilate in DBC-Datensatz sind versionsabhängig d. h. Neukompilieren (!) n n ggf. ausgelagerte Prozedurdatei verwenden Tabellen/Felder finden „richtige“ Prozedurdatei eigene Anwendung verwendet aber nur aktiven DBC! n n Set database to Namenskonventionen für DBC-Funktionen!
DBC-Ereignisse n Ab VFP-Version 7, defaultmäßig deaktiviert n einschalten über DBC-Optionen n n Dbsetprop(„Main. dbc“, “Database“, “DBCEVENTS“, . t. ) Wenn aktiviert, DBC nicht mehr abwärtskompatibel Funktionen liegen im DBC bei den gespeicherten Prozeduren oder in einer externen PRG-Datei Vorsicht: Datasessions beachten! Für Zugriffsschutz und zur Protokollierung …
Sonderfälle Leerfelder n n n n EMPTY( ) ISBLANK( ) ISNULL( ) SET NULL NVL( ) EVL( ) – besonders praktisch für Parameterprüfung! Beispiel: Statistik, Logik
Indizes Grundlagen: Benötigt für: n Separate Datei n Rushmore-Optimierung n B-Baum n Suchbefehle n Schlüssel 100 B. IDX/240 B. n Relationen CDX n dito persistent n Ausdruck 220 B. n Referentielle Integrität n Kein Alltrim()! n Ausdrücke
Indexarten n REGULAR - Normaler Schlüssel CANDIDATE - Eindeutiger Schlüssel PRIMARY - Primärschlüssel n n UNIQUE - „Einmaliger“ Schlüssel n n nur in DBC, nicht in freien Tabellen NICHT VERWENDEN! Sinnvoll gelegentlich in Views Neu: BINARY –Binärschlüssel
Primärschlüssel n Real-World-Schlüssel n n n meist zusammengesetzt Änderungen immer möglich! Eindeutigkeit letztendlich nicht garantiert RI: Cascading Update notwendig! Surrogate / Abstract -Schlüssel n n fortlaufend selbst erzeugt (ggf. mit zentraler Tabelle) Datenmodell komplett erstellbar ohne Attribute RI: kein Cascading Update notwendig
Funktionen und Relationen n n SET RELATION SET SKIP Relation( ) Target( ) Hinweise: n Umgebungsfenster n SET RELATION TO RECNO( ) n n n Alternative: SQL-Joins Alternative: SET KEY RANGE Hinweis: INDEXSEEK( )
Collate-Sequenzen n n n SET COLLATE TO „<collate>“ Default „GENERAL“ (2 Byte, A=a!) Original „MACHINE“ (schnell!) Alternativ: „GERMAN“, „UNIQWT“ Sonstige: „DUTCH“, „ICELAND“, „NORDAN“, „SPANISH“, „SWEFIN“ Ggf. doppelte Index-Definition mit verschiedenen Collate-Sequenzen!
Die große Vergleichsfalle n Optimierung und Vergleiche basieren auf aktuell eingestellter Sortiersequenz! n n n SET COLLATE gilt für aktuelle Datasession SCAN WHILE / REST bei anderer Sortiersequenz verlässt Schleife … Sequenz MACHINE „A“ = „a“ . F. Sequenz GENERAL n „A“ = „a“ . T.
Codepages n n n n n 437, 850, 1252, 10000 CPCURRENT( ), CPDBF( ) CPCONVERT( ) GETCP( ) CODEPAGE=auto SET NOCPTRANS Character Binary, Memo Binary, usw. SET CPDIALOG, SET CPCOMPILE DO CPZERO. PRG
Rushmore-Optimierung n n n Indexdefinition vorhanden Keine FOR/NOT-Klausel im Index Identische Indexdefinition n n n zusammengesetzte Felder, Alltrim() Index auf Deleted() (bei SET DELE ON) problematisch! Passende Collatesequenz (IDXCOLLATE) Keine Sortierung (SET ORDER TO) Keine Abfrage auf Empty( ) / Is. Blank( ) Kein exakter Vergleich (SET EXACT/ANSI OFF/==) Kontrolle mit SYS(3054, 1/11, neu) und SYS(3092)
Optimierbare Befehle n n n n n AVERAGE DELETE / BLANK BROWSE => GRID (!) CALCULATE CHANGE / EDIT COPY TO (ARRAY) COUNT LIST / DISPLAY EXPORT n n n n n INDEX LOCATE RECALL REPLACE (ARRAY) LABEL / REPORT SCAN SORT SUM TOTAL
Optimierungsmöglichkeiten n n Verzeichniskomprimierung (+10% Performance!) Virusfilter für Endungen abschalten Verzicht auf Verschlüsselung (siehe oben) Verzicht auf Indizes mit wenig Unterscheidung Hardware n n n Schnelle Netzwerkkarten / Verbindungen Mehrere Netzwerkkarten im Server User auf Stränge verteilen (z. B. 10 User/Strang) Gute HD-Controller mit viel Cache Verteilung von DBF und CDX auf versch. Festplatten
Buffermodes: n 1 -None n 2 -Pessimistic Row n 3 -Pessimistic Table n 4 -Optimistic Row n 5 -Optimistic Table n Row: Skip = Update (!) Optimistic: n Record changed! n Curval/Oldval() n Get. Fld. State() Table-Buffering: n Getnextmodified()
Funktionen im Einsatz n Beispiele: ? Get. Fld. State(-1) != Repl(„ 1“, Fcount()+1) ? Left( Get. Fld. State(-1), 1) != „ 1“ Goto ( Get. Next. Modified( Recno() ) ) ? Field( At( „ 2“, Get. Fld. State(-1) ) ) ? Set. Fld. State( „Feld“, 1 ) && Views! n Achtung: Negative Record-Nummern!
Reihenfolge n n n Tabellenfeld-Valid (alle Felder) Masken-Valid (aktuelles Element) Datensatz-Valid(ierung) Primary/Candidate-Schlüssel Trigger n n kaskadierend über alle Childs Achtung: _TRIGGERLEVEL kann hoch werden
Cursor. Get. Prop( ) / Set. Prop( ) n Allgemein: n nur für Views (Auch im View-Designer): n n n Buffering (ein- /ausschalten, abfragen, Wert 1 -5) Caption (Auslesen Text für Feldlabel zur Laufzeit) Compare. Memo Updatable Field List Where Type Vorführung View-Designer
Sonderfälle Allgemeine Probleme: n n n GETNEXTMODIFIED / GETFIELDSTATE() => erst Feld verlassen! Set. Fld. State( ) bei Views mit Requery() Table changed im View-Designer sofern alle Felder gewählt wurden (*) -> geändert! Sonderfall: Buffered Views auf Buffered Tables! (SQL öffnet neuen Alias) n n n Row: Fehler erst beim nächsten Satz! Tablerevert: Revert im View versagt Primary Key doppelt: Letzter gilt!
Transaktionen n BEGIN TRANS n n n END TRANS ROLLBACK n n n *-- Datenzugriff Absturz = Rollback bei Öffnen! TXNLEVEL() n n bis 5 Ebenen tief! Äußerste Ebene zählt! Experimente mit Transaktionen: n 1 Tabelle n 2 Tabellen aus DBC n Verschiedene DBCs n Freie Tabellen n Geschachtelt n Task-Manager!
MAKETRANSACTABLE n n n n Maketransactable( ) für freie Tabellen, Cursor von freien Tabellen oder Created Cursor Istransactable( ) für Prüfung Darf noch nicht anderweitig geöffnet sein Kein Table Buffering erlaubt Bei Row Buffering wird Tableupdate durchgeführt Kann danach anderweitig geöffnet werden Transactable endet mit Schliessen letzter Instanz
Hinweise zu Transaktionen n n Buffering eingeschaltet = Transaktion läuft nur auf Buffer und nicht auf Platte! Buffering ausgeschaltet = Transaktion läßt Einschalten Buffering nicht zu! n n Dadurch ggf. neue Sätze nicht anlegbar (Valid) Lösung: Buffering mit Tableupdate und dann END TRANS Freie Tabellen ohne Meldung! Deadlocks möglich - Zugriffsreihenfolge!
Zugriffsreihenfolge beachten Zur Vermeidung von Deadlocks im Netzbetrieb: n Tabellen nach Parent->Child n n n Datensätze nach Primärschlüssel n n Immer erst den Parent sperren notfalls per SQL-Select erst die Parents holen notfalls per SQL-Select umsortieren Mehrere Parents ggf. alphabetisch n sofern Parents nicht in Parent-Child-Beziehung
Multiuser-Datenzugriff n Generell Öffnen im SHARED AGAIN-Modus n RECORD LOCK - Satzsperre n n Einzelsatz, mehrere Sätze FILE LOCK - Dateisperre HEADER LOCK - Headersperre EXCLUSIVE - exklusives Öffnen
Automatisches Sperren FILE LOCK: n n ALTER TABLE INSERT (x. Base) DELETE / REPLACE mit ALL/REST/NEXT x UPDATE (beide) HEADER LOCK: n n APPEND / BLANK / FOR INSERT (SQL) RECORD LOCK: n n n n APPEND MEMO DELETE / REPLACE / RECALL / w/wo NEXT 1 DELETE / BLANK REC. GATHER CHANGE / EDIT MODI MEMO BROWSE (Childs!)
Sperren auch beim Lesen n Beim Verarbeiten von nebenstehenden Befehlen wird nicht gesperrt! SET LOCK ON oder FLOCK() sinnvoll! Ggf. vorher SQL-Select in Cursor n n n n n AVERAGE CALCULATE COPY TO (ARRAY) LIST / DISPLAY LABEL / REPORT SORT COUNT SUM TOTAL
Hinweise zur Pufferung n Problem: Änderung von Datensätzen durch andere Netz-User erst sichtbar durch/nach: n SET REFRESH n n SKIP, GOTO, SEEK Satzsperre RLOCK Lösung: Beim Lesen 1 x Sperren n n Neue Parameter in VFP 9. 0 Ggf. locate for recno() = lnrecno Neu: FLUSH IN … (FORCE)
Referentielle Integrität (RI) n n n Bedeutung der Referentiellen Integrität einer Datenbank Arbeiten mit dem Referential Integrity Builder Empfehlung: AMRI-Builder ! Programmatisch: n CREATE TRIGGER n DELETE TRIGGER n _TRIGGERLEVEL Arten von Triggern: n DELETE n UPDATE n INSERT
Besonderheiten der Trigger n DELETE-Trigger: Childs löschen mit Parent / verhindern n n INSERT-Trigger: Childs nur zu Parents n n n Bei DELETE -> Cascading Delete Nicht bei ZAP (!) Nicht bei PACK Bei Append, Insert, Import Auch bei RECALL UPDATE-Trigger: Aktualisierung Fremdschlüsselfelder n n Bei replace, Gather, Update Nicht bei DELETED()
Hinweise zu Triggern Im Gegensatz zu Feld-Valid und Satz-Valid ist ein Triggerfehler ein endgültiger Fehler! Das heißt: n VFP macht Rollback über alle Ebenen n Nicht zulässig: n Ändern von Daten! n n n Update-Endlosschleife. . . Compound Keys Verschiedene DBCs Kein „Nullify“ für Delete von Parent Builder nicht änderbar
Zusammenfassung Verbesserungen n n n n Transaktionsunterstützung für freie Tabellen Unterstützung für lange Feldtypen Leerzeichen in Tabellen und View-Namen Datentyp Varchar / Varbinary Datentyp Blob Binär-Index (logischer Ausdruck = 1 Bit) Performanceverbesserungen Neues Tool: Memo Corruption Scanner
BROWSE-Tastaturkürzel n n n n Strg+F zum nächsten Datensatz Strg+G zum vorigen Datensatz Strg+Y neuen Datensatz anlegen Strg+T Löschflag umschalten Strg+Pos 1 Memofenster öffnen Strg+Enter Memofenster schliessen Strg+W Speichern und Schliessen Strg+F 10 Maximieren/Wiederherstellen
Querverweise n n n 03 -21 Schützen einer Tabelle in einem DBC 03 -23 Schützen von VFP Daten 03 -24 Die Normalisierung von Daten
Zusammenfassung n Das war das Thema Datenbanken im Schnelldurchlauf … n n n Datenbankcontainer Tabellen und Felder Nullwerte und Codepages Indizes und Sortiersequenzen Rushmore-Optimierung Relationen Buffering Netzwerkprogrammierung Transaktionen Trigger Referentielle Integrität
Vielen Dank! Besuchen Sie unsere Webseiten: http: //www. dfpug. de, http: //portal. dfpug. de, http: //forum. dfpug. de, http: //newsletter. dfpug. de, http: //devcon. dfpug. de, http: //roadshow. dfpug. de, http: //www. visualextend. de, http: //www. linuxtransfer. de, http: //www. visualfoxpro. de
- Slides: 44