Arbeiten mit Daten in Visual FoxPro 9.0 - dFPUG

Werbung
DATA
Arbeiten mit Daten in
Visual FoxPro 9.0
deutschsprachige FoxPro User Group
Rainer Becker
Microsoft Visual FoxPro 9.0 Roadshow
Vortragsthemen











Datenbankcontainer
Tabellen und Felder
Nullwerte und Codepages
Indizes und Sortiersequenzen
Rushmore-Optimierung
Relationen
Buffering
Netzwerkprogrammierung
Transaktionen
Trigger
Referentielle Integrität
Datenbankcontainer

Verwaltet Zusatzinformationen







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!


Tabellenstrukturen im DBF-Header
Indexstrukturen im CDX-Header
Hinweise zum DBC


Projektmanager kann DBC offenhalten!
Separates Datadictionary notwendig
für Reindizierung oder Neuerzeugung



Tabellen und DBC sind eine Einheit


wahlweise Eigenbau (Alter Table), XCASE, SDT, VFX
wahlweise GENDBCX als Minimal-Lösung
Immer zusammen sichern / ändern
FREE TABLE problematisch bei langen Feldnamen

Auch copy to database kopiert Metadaten leider nicht
Datenbankengineänderungen


ALTER TABLE Memofelder vor/zurück
Umschalten mit


SET ENGINEBEHAVIOR oder SYS(3099)
Erinnerung: Leerzeichen



Leerzeichen in Tabellennamen zulässig
Immer „“ bzw. () statt & verwenden
Problematisch bei USE IN „tab 1 test“
Lange Feldtypenbezeichnungen

Datentyp
Character
Date
DateTime
Numeric
Floating
Integer
Double
Currency
Logical
Memo
General
Picture
Varchar
Varbinary
Blob
Langer Name
Char, Character
Date
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

Character / Zeichen








Character Binary
Numeric / Zahl
Date / Datum
Logical / Logisch
Memofelder (Char)

(c)
Memo Binary
General
AutoIncrement
Neu: Blob


(n)
(d)
(l)
m(c)






Integer / Integer
Double / Doppelte G.
Float / Fließkomma
Currency / Währung
DateTime / DatumZeit
Neu: VarCharacter
Neu: VarBinary
i(n)
b(n)
f(n)
y(y)
t(t)
Feldlänge Memo / General / Blob
von 4 Bytes
Blob





Alternative zu General-Feldern
Ohne OLE-Server, kein Overhead
Read-Only HexCode in Memofeldanzeige
Kompatibel zu SQL-Server
Beispiel Bilderspeicherung



pictureval
oimg.pictureval = filetostr / blob
loadpicture
VarChar / VarBinary





Format = „F“ verhindert Auffüllen des Value mit
Leerstellen bei VarChar oder CHR(0) bei VarBinary
.Inputmask =„HHHH…HH“ lässt nur
Hexadezimaleingaben zu (0…F), sonst Präfix "0h"
SET VarCharMapping ON | OFF
Keine Einstellung in Extras->Optionen, Default ON
Tabellen/Cursor-Spalten werden als VarChar
angelegt, wenn die erzeugende Funktion variable
Längen liefert (vorname+nachname, func() )
Gespeicherte Prozeduren I



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 II

Kompilate in DBC-Datensatz sind versionsabhängig
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!
DBC-Ereignisse

Ab VFP-Version 7, defaultmäßig deaktiviert
 einschalten über DBC-Optionen





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







EMPTY( )
ISBLANK( )
ISNULL( )
SET NULL
NVL( )
EVL( ) – besonders praktisch für Parameterprüfung!
Beispiel: Statistik, Logik
Indizes
Grundlagen:
 Separate Datei
 B-Baum
 Schlüssel 100 B. IDX/240
B. CDX
 Ausdruck 220 B.
 Kein Alltrim()!
 Ausdrücke
Benötigt für:
 Rushmore-Optimierung
 Suchbefehle
 Relationen
 dito persistent
 Referentielle Integrität
Indexarten



REGULAR - Normaler Schlüssel
CANDIDATE - Eindeutiger Schlüssel
PRIMARY - Primärschlüssel


UNIQUE - „Einmaliger“ Schlüssel


nur in DBC, nicht in freien Tabellen
NICHT VERWENDEN! Sinnvoll gelegentlich in Views
Neu: BINARY –Binärschlüssel
Primärschlüssel

Real-World-Schlüssel





meist zusammengesetzt
Änderungen immer möglich!
Eindeutigkeit letztendlich nicht garantiert
RI: Cascading Update notwendig!
Surrogate / Abstract -Schlüssel




fortlaufend
selbst erzeugt (ggf. mit zentraler Tabelle)
Datenmodell komplett erstellbar ohne Attribute
RI: kein Cascading Update notwendig
Funktionen und Relationen




SET RELATION
SET SKIP
Relation( )
Target( )
Hinweise:
 Umgebungsfenster
 SET RELATION TO
RECNO( )

Alternative:
SQL-Joins

Alternative:
SET KEY RANGE

Hinweis:
INDEXSEEK( )
Collate-Sequenzen






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

Optimierung und Vergleiche
basieren auf aktuell
eingestellter Sortiersequenz!




SET COLLATE gilt für
aktuelle Datasession

SCAN WHILE / REST bei
anderer Sortiersequenz
verlässt Schleife …
Sequenz MACHINE
„A“ = „a“  .F.
Sequenz GENERAL

„A“ = „a“  .T.
Codepages









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



Indexdefinition vorhanden
Keine FOR/NOT-Klausel im Index
Identische Indexdefinition







zusammengesetzte Felder, Alltrim()
Index auf Deleted() (bei SET DELE ON) problematisch!
Passende Collatesequenz (IDXCOLLATE)
Keine Sortierung (SET ORDER TO)
Keine Abfrage auf Empty( ) / IsBlank( )
Kein exakter Vergleich (SET EXACT/ANSI OFF/==)
Kontrolle mit SYS(3054,1/11, neu) und SYS(3092)
Optimierbare Befehle









AVERAGE
DELETE / BLANK
BROWSE => GRID (!)
CALCULATE
CHANGE / EDIT
COPY TO (ARRAY)
COUNT
LIST / DISPLAY
EXPORT









INDEX
LOCATE
RECALL
REPLACE (ARRAY)
LABEL / REPORT
SCAN
SORT
SUM
TOTAL
Optimierungsmöglichkeiten





Verzeichniskomprimierung (+10% Performance!)
Virusfilter für Endungen abschalten
Verzicht auf Verschlüsselung (siehe oben)
Verzicht auf Indizes mit wenig Unterscheidung
Hardware





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
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( ) / SetProp( )

Allgemein:



nur für Views (Auch im View-Designer):





Buffering (ein- /ausschalten, abfragen, Wert 1-5)
Caption (Auslesen Text für Feldlabel zur Laufzeit)
CompareMemo
Updatable
Updatable Field List
Where Type
Vorführung View-Designer
Sonderfälle
Allgemeine Probleme:

GETNEXTMODIFIED /
GETFIELDSTATE() => erst Feld
verlassen!

SetFldState( ) 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)



Row: Fehler erst beim
nächsten Satz!
Tablerevert: Revert im View
versagt
Primary Key doppelt:
Letzter gilt!
Transaktionen

BEGIN TRANS



END TRANS
ROLLBACK



*-- Datenzugriff
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!
MAKETRANSACTABLE







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


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: Buffering mit Tableupdate und dann END
TRANS
Freie Tabellen ohne Meldung!
Deadlocks möglich - Zugriffsreihenfolge!
Zugriffsreihenfolge beachten
Zur Vermeidung von Deadlocks im Netzbetrieb:
 Tabellen nach Parent->Child



Datensätze nach Primärschlüssel


Immer erst den Parent sperren
notfalls per SQL-Select erst die Parents holen
notfalls per SQL-Select umsortieren
Mehrere Parents ggf. alphabetisch

sofern Parents nicht in Parent-Child-Beziehung
Multiuser-Datenzugriff

Generell Öffnen im SHARED AGAIN-Modus

RECORD LOCK - Satzsperre




Einzelsatz, mehrere Sätze
FILE LOCK - Dateisperre
HEADER LOCK - Headersperre
EXCLUSIVE - exklusives Öffnen
Automatisches Sperren
FILE LOCK:




ALTER TABLE
INSERT (xBase)
DELETE / REPLACE mit
ALL/REST/NEXT x
UPDATE (beide)
HEADER LOCK:


APPEND / BLANK / FOR
INSERT (SQL)
RECORD LOCK:







APPEND MEMO
DELETE / REPLACE /
RECALL / w/wo NEXT 1
DELETE / BLANK REC.
GATHER
CHANGE / EDIT
MODI MEMO
BROWSE (Childs!)
Sperren auch beim Lesen



Beim Verarbeiten von
nebenstehenden Befehlen
wird nicht gesperrt!
SET LOCK ON oder
FLOCK() sinnvoll!
Ggf. vorher SQL-Select in
Cursor









AVERAGE
CALCULATE
COPY TO (ARRAY)
LIST / DISPLAY
LABEL / REPORT
SORT
COUNT
SUM
TOTAL
Hinweise zur Pufferung

Problem: Änderung von Datensätzen durch andere
Netz-User erst sichtbar durch/nach:

SET REFRESH




SKIP, GOTO, SEEK
Satzsperre RLOCK
Lösung: Beim Lesen 1x Sperren


Neue Parameter in VFP 9.0
Ggf. locate for recno() = lnrecno
Neu: FLUSH IN … (FORCE)
Referentielle Integrität (RI)



Bedeutung der
Referentiellen Integrität
einer Datenbank
Arbeiten mit dem
Referential Integrity
Builder
Empfehlung:
AMRI-Builder !
Programmatisch:
 CREATE TRIGGER
 DELETE TRIGGER
 _TRIGGERLEVEL
Arten von Triggern:
 DELETE
 UPDATE
 INSERT
Besonderheiten der Trigger

DELETE-Trigger: Childs löschen mit Parent / verhindern




INSERT-Trigger: Childs nur zu Parents



Bei DELETE -> Cascading Delete
Nicht bei ZAP (!)
Nicht bei PACK
Bei Append, Insert, Import
Auch bei RECALL
UPDATE-Trigger: Aktualisierung Fremdschlüsselfelder


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:
 VFP macht Rollback über
alle Ebenen

Nicht zulässig:
 Ändern von Daten!





Update-Endlosschleife...
Compound Keys
Verschiedene DBCs
Kein „Nullify“ für Delete
von Parent
Builder nicht änderbar
Zusammenfassung Verbesserungen








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








Strg+F
zum nächsten Datensatz
Strg+G
zum vorigen Datensatz
Strg+Y
neuen Datensatz anlegen
Strg+T
Löschflag umschalten
Strg+Pos1Memofenster öffnen
Strg+Enter
Memofenster schliessen
Strg+W
Speichern und Schliessen
Strg+F10 Maximieren/Wiederherstellen
Querverweise



03-21 Schützen einer Tabelle in einem DBC
03-23 Schützen von VFP Daten
03-24 Die Normalisierung von Daten
Zusammenfassung

Das war das Thema Datenbanken im
Schnelldurchlauf …











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
Herunterladen