Arbeiten mit Arbeiten mit Daten in Visual Daten in Visual FoxPro 9.0 FoxPro 9.0 deutschsprachige FoxPro User deutschsprachige FoxPro User Group Group Rainer Becker Rainer Becker Microsoft Visual FoxPro 9.0 Microsoft Visual FoxPro 9.0 Roadshow Roadshow DATA
44
Embed
Arbeiten mit Daten in Visual FoxPro 9.0 deutschsprachige FoxPro User Group Rainer Becker Microsoft Visual FoxPro 9.0 Roadshow DATA.
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Arbeiten mit Daten in Arbeiten mit Daten in Visual FoxPro 9.0Visual FoxPro 9.0
deutschsprachige FoxPro User Groupdeutschsprachige FoxPro User Group
Rainer BeckerRainer Becker
Microsoft Visual FoxPro 9.0 RoadshowMicrosoft Visual FoxPro 9.0 Roadshow
DATA
VortragsthemenVortragsthemen DatenbankcontainerDatenbankcontainer Tabellen und FelderTabellen und Felder Nullwerte und CodepagesNullwerte und Codepages Indizes und SortiersequenzenIndizes und Sortiersequenzen Rushmore-OptimierungRushmore-Optimierung RelationenRelationen BufferingBuffering NetzwerkprogrammierungNetzwerkprogrammierung TransaktionenTransaktionen TriggerTrigger Referentielle IntegritätReferentielle Integrität
DatenbankcontainerDatenbankcontainer
Verwaltet ZusatzinformationenVerwaltet Zusatzinformationen zu Tabellen (nicht „freie“ Tabellen)zu Tabellen (nicht „freie“ Tabellen) Felder und IndizesFelder und Indizes persistente Relationen persistente Relationen gespeicherte Prozedurengespeicherte Prozeduren referentielle Integrität / Trigger , Ereignissereferentielle Integrität / Trigger , Ereignisse Verbindungen, lokale und remote ViewsVerbindungen, lokale und remote Views
Ein DBC ist kein Data-Dictionary!Ein DBC ist kein Data-Dictionary! Tabellenstrukturen im DBF-HeaderTabellenstrukturen im DBF-Header Indexstrukturen im CDX-HeaderIndexstrukturen im CDX-Header
Hinweise zum DBCHinweise zum DBC
Projektmanager kann DBC offenhalten!Projektmanager kann DBC offenhalten! Separates Datadictionary notwendigSeparates Datadictionary notwendig
für Reindizierung oder Neuerzeugungfür Reindizierung oder Neuerzeugung wahlweise Eigenbau (Alter Table), XCASE, SDT, VFXwahlweise Eigenbau (Alter Table), XCASE, SDT, VFX wahlweise GENDBCX als Minimal-Lösungwahlweise GENDBCX als Minimal-Lösung
Tabellen und DBC sind eine EinheitTabellen und DBC sind eine Einheit Immer zusammen sichern / ändernImmer zusammen sichern / ändern
FREE TABLE problematisch bei langen FeldnamenFREE TABLE problematisch bei langen Feldnamen Auch copy to database kopiert Metadaten leider nichtAuch copy to database kopiert Metadaten leider nicht
ALTER TABLE Memofelder vor/zurückALTER TABLE Memofelder vor/zurück Umschalten mitUmschalten mit
SET ENGINEBEHAVIOR oder SYS(3099)SET ENGINEBEHAVIOR oder SYS(3099)
Erinnerung: LeerzeichenErinnerung: Leerzeichen Leerzeichen in Tabellennamen zulässigLeerzeichen in Tabellennamen zulässig Immer „“ bzw. () statt & verwendenImmer „“ bzw. () statt & verwenden Problematisch bei USE IN „tab 1 test“Problematisch bei USE IN „tab 1 test“
Lange FeldtypenbezeichnungenLange Feldtypenbezeichnungen DatentypDatentyp Langer NameLanger Name Kurzer NameKurzer Name
Feldlänge Memo / General / Blob Feldlänge Memo / General / Blob von 4 Bytesvon 4 Bytes
BlobBlob
Alternative zu General-FeldernAlternative zu General-Feldern Ohne OLE-Server, kein OverheadOhne OLE-Server, kein Overhead Read-Only HexCode in MemofeldanzeigeRead-Only HexCode in Memofeldanzeige Kompatibel zu SQL-ServerKompatibel zu SQL-Server Beispiel BilderspeicherungBeispiel Bilderspeicherung
Format = „F“ verhindert Auffüllen des Value mit Format = „F“ verhindert Auffüllen des Value mit Leerstellen bei VarChar oder CHR(0) bei VarBinaryLeerstellen bei VarChar oder CHR(0) bei VarBinary
.Inputmask =„HHHH…HH“ lässt nur .Inputmask =„HHHH…HH“ lässt nur Hexadezimaleingaben zu (0…F), sonst Präfix "0h" Hexadezimaleingaben zu (0…F), sonst Präfix "0h"
SET VarCharMapping ON SET VarCharMapping ON | OFF| OFF Keine Einstellung in Extras->Optionen, Default ONKeine Einstellung in Extras->Optionen, Default ON Tabellen/Cursor-Spalten werden als VarChar Tabellen/Cursor-Spalten werden als VarChar
angelegt, wenn die erzeugende Funktion variable angelegt, wenn die erzeugende Funktion variable Längen liefert (vorname+nachname, func() )Längen liefert (vorname+nachname, func() )
Gespeicherte Prozeduren IGespeicherte Prozeduren I
Gehören imanent zu den Tabellen und wird als Gehören imanent zu den Tabellen und wird als Prozedur-Datei gesetzt!Prozedur-Datei gesetzt!
Werden auch über ODBC ausgeführt!Werden auch über ODBC ausgeführt! Verwendet für:Verwendet für:
Gespeicherte Prozeduren IIGespeicherte Prozeduren II
Kompilate in DBC-Datensatz sind versionsabhängig Kompilate in DBC-Datensatz sind versionsabhängig d.h. Neukompilieren (!)d.h. Neukompilieren (!) ggf. ausgelagerte Prozedurdatei verwendenggf. ausgelagerte Prozedurdatei verwenden
Tabellen/Felder finden „richtige“ Prozedurdatei - Tabellen/Felder finden „richtige“ Prozedurdatei - eigene Anwendung verwendet aber nur aktiven DBC!eigene Anwendung verwendet aber nur aktiven DBC! Set database toSet database to Namenskonventionen für DBC-Funktionen!Namenskonventionen für DBC-Funktionen!
DBC-EreignisseDBC-Ereignisse
Ab VFP-Version 7, defaultmäßig deaktiviertAb VFP-Version 7, defaultmäßig deaktiviert einschalten über DBC-Optioneneinschalten über DBC-Optionen Dbsetprop(„Main.dbc“,“Database“,“DBCEVENTS“,.t.)Dbsetprop(„Main.dbc“,“Database“,“DBCEVENTS“,.t.)
Wenn aktiviert, DBC nicht mehr abwärtskompatibelWenn aktiviert, DBC nicht mehr abwärtskompatibel Funktionen liegen im DBC bei den gespeicherten Funktionen liegen im DBC bei den gespeicherten
ProzedurenProzeduren oder in einer externen PRG-Datei oder in einer externen PRG-Datei Vorsicht: Datasessions beachten!Vorsicht: Datasessions beachten! Für Zugriffsschutz und zur Protokollierung …Für Zugriffsschutz und zur Protokollierung …
Sonderfälle LeerfelderSonderfälle Leerfelder
EMPTY( )EMPTY( ) ISBLANK( )ISBLANK( ) ISNULL( )ISNULL( ) SET NULLSET NULL NVL( )NVL( ) EVL( ) – besonders praktisch für Parameterprüfung!EVL( ) – besonders praktisch für Parameterprüfung! Beispiel: Statistik, LogikBeispiel: Statistik, Logik
IndizesIndizes
Grundlagen:Grundlagen: Separate DateiSeparate Datei B-BaumB-Baum Schlüssel 100 B. IDX/240 Schlüssel 100 B. IDX/240
B. CDXB. CDX Ausdruck 220 B.Ausdruck 220 B. Kein Alltrim()!Kein Alltrim()! AusdrückeAusdrücke
Real-World-SchlüsselReal-World-Schlüssel meist zusammengesetztmeist zusammengesetzt Änderungen immer möglich! Änderungen immer möglich! Eindeutigkeit letztendlich nicht garantiertEindeutigkeit letztendlich nicht garantiert RI: Cascading Update notwendig!RI: Cascading Update notwendig!
Surrogate / Abstract -SchlüsselSurrogate / Abstract -Schlüssel fortlaufendfortlaufend selbst erzeugt (ggf. mit zentraler Tabelle)selbst erzeugt (ggf. mit zentraler Tabelle) Datenmodell komplett erstellbar ohne AttributeDatenmodell komplett erstellbar ohne Attribute RI: kein Cascading Update notwendigRI: kein Cascading Update notwendig
Funktionen und RelationenFunktionen und Relationen
SET RELATIONSET RELATION SET SKIPSET SKIP Relation( )Relation( ) Target( )Target( )
Hinweise:Hinweise: UmgebungsfensterUmgebungsfenster SET RELATION TO SET RELATION TO
RECNO( )RECNO( )
Alternative: Alternative:
SQL-JoinsSQL-Joins
Alternative:Alternative:
SET KEY RANGESET KEY RANGE
Hinweis:Hinweis:
INDEXSEEK( )INDEXSEEK( )
Collate-SequenzenCollate-Sequenzen
SET COLLATE TO „<collate>“SET COLLATE TO „<collate>“ Default „GENERAL“ (2 Byte, A=a!)Default „GENERAL“ (2 Byte, A=a!) Original „MACHINE“ (schnell!)Original „MACHINE“ (schnell!) Alternativ: „GERMAN“, „UNIQWT“Alternativ: „GERMAN“, „UNIQWT“ Sonstige: „DUTCH“, „ICELAND“, „NORDAN“, Sonstige: „DUTCH“, „ICELAND“, „NORDAN“,
„SPANISH“, „SWEFIN“„SPANISH“, „SWEFIN“ Ggf. doppelte Index-Definition mit verschiedenen Ggf. doppelte Index-Definition mit verschiedenen
Collate-Sequenzen!Collate-Sequenzen!
Die große VergleichsfalleDie große Vergleichsfalle
Optimierung und Vergleiche Optimierung und Vergleiche basieren auf aktuell basieren auf aktuell eingestellter Sortiersequenz!eingestellter Sortiersequenz!
SET COLLATE gilt für SET COLLATE gilt für aktuelle Datasessionaktuelle Datasession
SCAN WHILE / REST bei SCAN WHILE / REST bei anderer Sortiersequenz anderer Sortiersequenz verlässt Schleife …verlässt Schleife …
437, 850, 1252, 10000437, 850, 1252, 10000 CPCURRENT( ), CPDBF( )CPCURRENT( ), CPDBF( ) CPCONVERT( )CPCONVERT( ) GETCP( )GETCP( ) CODEPAGE=autoCODEPAGE=auto SET NOCPTRANSSET NOCPTRANS Character Binary, Memo Binary, usw.Character Binary, Memo Binary, usw. SET CPDIALOG, SET CPCOMPILESET CPDIALOG, SET CPCOMPILE DO CPZERO.PRGDO CPZERO.PRG
Rushmore-OptimierungRushmore-Optimierung
Indexdefinition vorhandenIndexdefinition vorhanden Keine FOR/NOT-Klausel im IndexKeine FOR/NOT-Klausel im Index Identische IndexdefinitionIdentische Indexdefinition
Index auf Deleted() (bei SET DELE ON) problematisch!Index auf Deleted() (bei SET DELE ON) problematisch! Passende Collatesequenz Passende Collatesequenz (IDXCOLLATE)(IDXCOLLATE)
Keine Sortierung (SET ORDER TO)Keine Sortierung (SET ORDER TO) Keine Abfrage auf Empty( ) / IsBlank( )Keine Abfrage auf Empty( ) / IsBlank( ) Kein exakter Vergleich (SET EXACT/ANSI OFF/==)Kein exakter Vergleich (SET EXACT/ANSI OFF/==) Kontrolle mitKontrolle mit SYS(3054,1/11, neu) und SYS(3092)SYS(3054,1/11, neu) und SYS(3092)
Verzeichniskomprimierung (+10% Performance!)Verzeichniskomprimierung (+10% Performance!) Virusfilter für Endungen abschaltenVirusfilter für Endungen abschalten Verzicht auf Verschlüsselung (siehe oben)Verzicht auf Verschlüsselung (siehe oben) Verzicht auf Indizes mit wenig UnterscheidungVerzicht auf Indizes mit wenig Unterscheidung HardwareHardware
Schnelle Netzwerkkarten / VerbindungenSchnelle Netzwerkkarten / Verbindungen Mehrere Netzwerkkarten im ServerMehrere Netzwerkkarten im Server User auf Stränge verteilen (z.B. 10 User/Strang)User auf Stränge verteilen (z.B. 10 User/Strang) Gute HD-Controller mit viel CacheGute HD-Controller mit viel Cache Verteilung von DBF und CDX auf versch. FestplattenVerteilung von DBF und CDX auf versch. Festplatten
Allgemein:Allgemein: Buffering (ein- /ausschalten, abfragen, Wert 1-5)Buffering (ein- /ausschalten, abfragen, Wert 1-5) Caption (Auslesen Text für Feldlabel zur Laufzeit)Caption (Auslesen Text für Feldlabel zur Laufzeit)
nur für Views (Auch im View-Designer):nur für Views (Auch im View-Designer): CompareMemoCompareMemo UpdatableUpdatable Updatable Field ListUpdatable Field List Where TypeWhere Type
Vorführung View-DesignerVorführung View-Designer
SonderfälleSonderfälle
Allgemeine Probleme:Allgemeine Probleme:
GETNEXTMODIFIED / GETNEXTMODIFIED / GETFIELDSTATE() => erst Feld GETFIELDSTATE() => erst Feld verlassen!verlassen!
SetFldState( ) bei Views mit SetFldState( ) bei Views mit Requery()Requery()
Table changedTable changedim View-Designer sofern im View-Designer sofern alle Felder gewählt wurden alle Felder gewählt wurden (*) -> geändert!(*) -> geändert!
Sonderfall: Sonderfall: Buffered Views auf Buffered Views auf Buffered Tables!Buffered Tables!(SQL öffnet neuen Alias)(SQL öffnet neuen Alias)
Row: Fehler erst beim Row: Fehler erst beim nächsten Satz!nächsten Satz!
Tablerevert: Revert im Tablerevert: Revert im View versagtView versagt
Experimente mit Experimente mit Transaktionen:Transaktionen:
1 Tabelle1 Tabelle 2 Tabellen aus DBC2 Tabellen aus DBC Verschiedene DBCsVerschiedene DBCs Freie TabellenFreie Tabellen GeschachteltGeschachtelt Task-Manager!Task-Manager!
MAKETRANSACTABLEMAKETRANSACTABLE
Maketransactable( ) für freie Tabellen, Cursor von Maketransactable( ) für freie Tabellen, Cursor von freien Tabellen oder Created Cursorfreien Tabellen oder Created Cursor
Istransactable( ) für PrüfungIstransactable( ) für Prüfung Darf noch nicht anderweitig geöffnet seinDarf noch nicht anderweitig geöffnet sein Kein Table Buffering erlaubtKein Table Buffering erlaubt Bei Row Buffering wird Tableupdate durchgeführtBei Row Buffering wird Tableupdate durchgeführt Kann danach anderweitig geöffnet werdenKann danach anderweitig geöffnet werden Transactable endet mit Schliessen letzter InstanzTransactable endet mit Schliessen letzter Instanz
Hinweise zu TransaktionenHinweise zu Transaktionen
Buffering eingeschaltet = Transaktion läuft nur auf Buffering eingeschaltet = Transaktion läuft nur auf Buffer und nicht auf Platte!Buffer und nicht auf Platte!
Buffering ausgeschaltet = Transaktion läßt Buffering ausgeschaltet = Transaktion läßt Einschalten Buffering nicht zu!Einschalten Buffering nicht zu! Dadurch ggf. neue Sätze nicht anlegbar (Valid)Dadurch ggf. neue Sätze nicht anlegbar (Valid)
Lösung: Buffering mit Tableupdate und dann END Lösung: Buffering mit Tableupdate und dann END TRANSTRANS
Freie Tabellen ohne Meldung!Freie Tabellen ohne Meldung! Deadlocks möglich - Zugriffsreihenfolge!Deadlocks möglich - Zugriffsreihenfolge!
Zur Vermeidung von Deadlocks im Netzbetrieb:Zur Vermeidung von Deadlocks im Netzbetrieb: Tabellen nach Parent->ChildTabellen nach Parent->Child
Immer erst den Parent sperrenImmer erst den Parent sperren notfalls per SQL-Select erst die Parents holennotfalls per SQL-Select erst die Parents holen
Datensätze nach PrimärschlüsselDatensätze nach Primärschlüssel notfalls per SQL-Select umsortierennotfalls per SQL-Select umsortieren
Mehrere Parents ggf. alphabetischMehrere Parents ggf. alphabetisch sofern Parents nicht in Parent-Child-Beziehungsofern Parents nicht in Parent-Child-Beziehung
Multiuser-DatenzugriffMultiuser-Datenzugriff
Generell Öffnen im SHARED AGAIN-ModusGenerell Öffnen im SHARED AGAIN-Modus
RECORD LOCK - SatzsperreRECORD LOCK - Satzsperre Einzelsatz, mehrere SätzeEinzelsatz, mehrere Sätze
Beim Verarbeiten von Beim Verarbeiten von nebenstehenden Befehlen nebenstehenden Befehlen wird nicht gesperrt!wird nicht gesperrt!
SET LOCK ON oder SET LOCK ON oder FLOCK() sinnvoll!FLOCK() sinnvoll!
Ggf. vorher SQL-Select in Ggf. vorher SQL-Select in CursorCursor
AVERAGEAVERAGE CALCULATECALCULATE COPY TO (ARRAY)COPY TO (ARRAY) LIST / DISPLAYLIST / DISPLAY LABEL / REPORTLABEL / REPORT SORTSORT COUNTCOUNT SUMSUM TOTALTOTAL
Hinweise zur PufferungHinweise zur Pufferung
Problem: Änderung von Datensätzen durch andere Problem: Änderung von Datensätzen durch andere Netz-User erst sichtbar durch/nach:Netz-User erst sichtbar durch/nach: SET REFRESHSET REFRESH
Neue Parameter in VFP 9.0Neue Parameter in VFP 9.0
Arten von Triggern:Arten von Triggern: DELETEDELETE UPDATEUPDATE INSERTINSERT
Besonderheiten der TriggerBesonderheiten der Trigger
DELETE-Trigger: Childs löschen mit Parent / verhindernDELETE-Trigger: Childs löschen mit Parent / verhindern Bei DELETE -> Cascading DeleteBei DELETE -> Cascading Delete Nicht bei ZAP (!)Nicht bei ZAP (!) Nicht bei PACKNicht bei PACK
INSERT-Trigger: Childs nur zu ParentsINSERT-Trigger: Childs nur zu Parents Bei Append, Insert, ImportBei Append, Insert, Import Auch bei RECALLAuch bei RECALL
UPDATE-Trigger: Aktualisierung FremdschlüsselfelderUPDATE-Trigger: Aktualisierung Fremdschlüsselfelder Bei replace, Gather, UpdateBei replace, Gather, Update Nicht bei DELETED()Nicht bei DELETED()
Hinweise zu TriggernHinweise zu Triggern
Im Gegensatz zu Feld-Valid Im Gegensatz zu Feld-Valid und Satz-Valid ist ein und Satz-Valid ist ein Triggerfehler ein Triggerfehler ein endgültiger Fehler!endgültiger Fehler!
Das heißt:Das heißt: VFP macht Rollback über VFP macht Rollback über
alle Ebenenalle Ebenen
Nicht zulässig:Nicht zulässig: Ändern von Daten!Ändern von Daten!
Update-Endlosschleife...Update-Endlosschleife...
Compound KeysCompound Keys Verschiedene DBCsVerschiedene DBCs Kein „Nullify“ für Delete Kein „Nullify“ für Delete
von Parentvon Parent Builder nicht änderbarBuilder nicht änderbar
Transaktionsunterstützung für freie TabellenTransaktionsunterstützung für freie Tabellen Unterstützung für lange FeldtypenUnterstützung für lange Feldtypen Leerzeichen in Tabellen und View-NamenLeerzeichen in Tabellen und View-Namen Datentyp Varchar / VarbinaryDatentyp Varchar / Varbinary Datentyp BlobDatentyp Blob Binär-Index (logischer Ausdruck = 1 Bit)Binär-Index (logischer Ausdruck = 1 Bit) PerformanceverbesserungenPerformanceverbesserungen Neues Tool: Memo Corruption ScannerNeues Tool: Memo Corruption Scanner
BROWSE-Tastaturkürzel BROWSE-Tastaturkürzel
Strg+FStrg+F zum nächsten Datensatzzum nächsten Datensatz Strg+GStrg+G zum vorigen Datensatzzum vorigen Datensatz Strg+YStrg+Y neuen Datensatz anlegenneuen Datensatz anlegen Strg+TStrg+T Löschflag umschaltenLöschflag umschalten Strg+Pos1Strg+Pos1 Memofenster öffnenMemofenster öffnen Strg+EnterStrg+Enter Memofenster schliessenMemofenster schliessen Strg+WStrg+W Speichern und SchliessenSpeichern und Schliessen Strg+F10Strg+F10 Maximieren/WiederherstellenMaximieren/Wiederherstellen
QuerverweiseQuerverweise
03-21 Schützen einer Tabelle in einem DBC03-21 Schützen einer Tabelle in einem DBC 03-23 Schützen von VFP Daten03-23 Schützen von VFP Daten 03-24 Die Normalisierung von Daten03-24 Die Normalisierung von Daten
ZusammenfassungZusammenfassung Das war das Thema Datenbanken im Das war das Thema Datenbanken im
Schnelldurchlauf …Schnelldurchlauf … DatenbankcontainerDatenbankcontainer Tabellen und FelderTabellen und Felder Nullwerte und CodepagesNullwerte und Codepages Indizes und SortiersequenzenIndizes und Sortiersequenzen Rushmore-OptimierungRushmore-Optimierung RelationenRelationen BufferingBuffering NetzwerkprogrammierungNetzwerkprogrammierung TransaktionenTransaktionen TriggerTrigger Referentielle IntegritätReferentielle Integrität
Vielen Dank!Vielen Dank!
Besuchen Sie unsere Webseiten: Besuchen Sie unsere Webseiten: http://www.dfpug.dehttp://www.dfpug.de, , http://portal.dfpug.dehttp://portal.dfpug.de, , http://forum.dfpug.dehttp://forum.dfpug.de, ,