1 / 44

Arbeiten mit Daten in Visual FoxPro 9.0

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

queenie
Download Presentation

Arbeiten mit Daten in Visual FoxPro 9.0

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. DATA Arbeiten mit Daten in Visual FoxPro 9.0 deutschsprachige FoxPro User Group Rainer Becker Microsoft Visual FoxPro 9.0 Roadshow

  2. Vortragsthemen • Datenbankcontainer • Tabellen und Felder • Nullwerte und Codepages • Indizes und Sortiersequenzen • Rushmore-Optimierung • Relationen • Buffering • Netzwerkprogrammierung • Transaktionen • Trigger • Referentielle Integrität

  3. 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

  4. Hinweise zum DBC • Projektmanager kann DBC offenhalten! • Separates Datadictionary notwendigfür Reindizierung oder Neuerzeugung • wahlweise Eigenbau (Alter Table), XCASE, SDT, VFX • wahlweise GENDBCX als Minimal-Lösung • Tabellen und DBC sind eine Einheit • Immer zusammen sichern / ändern • FREE TABLE problematisch bei langen Feldnamen • Auch copy to database kopiert Metadaten leider nicht

  5. 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“

  6. Lange Feldtypenbezeichnungen • Datentyp Langer Name Kurzer NameCharacter Char, Character CDate Date DDateTime Datetime TNumeric Num, Numeric NFloating Float FInteger Int, Integer IDouble Double BCurrency Currency YLogical Logical LMemo Memo MGeneral General GPicture Picture PVarchar Varchar VVarbinary Varbinary QBlob Blob W

  7. Character / Zeichen (c) Character Binary Numeric / Zahl (n) Date / Datum (d) Logical / Logisch (l) Memofelder (Char) m(c) Memo Binary General AutoIncrement Neu: Blob Integer / Integer i(n) Double / Doppelte G. b(n) Float / Fließkomma f(n) Currency / Währung y(y) DateTime / DatumZeit t(t) Neu: VarCharacter Neu: VarBinary Feldlänge Memo / General / Blob von 4 Bytes Feldarten

  8. 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

  9. 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() )

  10. 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

  11. 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!

  12. 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 …

  13. Sonderfälle Leerfelder • EMPTY( ) • ISBLANK( ) • ISNULL( ) • SET NULL • NVL( ) • EVL( ) – besonders praktisch für Parameterprüfung! • Beispiel: Statistik, Logik

  14. 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 Indizes

  15. Indexarten • REGULAR - Normaler Schlüssel • CANDIDATE - Eindeutiger Schlüssel • PRIMARY - Primärschlüssel • nur in DBC, nicht in freien Tabellen • UNIQUE - „Einmaliger“ Schlüssel • NICHT VERWENDEN! Sinnvoll gelegentlich in Views • Neu: BINARY –Binärschlüssel

  16. 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

  17. SET RELATION SET SKIP Relation( ) Target( ) Hinweise: Umgebungsfenster SET RELATION TO RECNO( ) Alternative: SQL-Joins Alternative: SET KEY RANGE Hinweis: INDEXSEEK( ) Funktionen und Relationen

  18. 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!

  19. 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. Die große Vergleichsfalle

  20. 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

  21. 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 mitSYS(3054,1/11, neu) und SYS(3092)

  22. 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 Optimierbare Befehle

  23. 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

  24. 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() Buffermode

  25. 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!

  26. 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

  27. CursorGetProp( ) / SetProp( ) • 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 • Vorführung View-Designer

  28. Allgemeine Probleme: GETNEXTMODIFIED / GETFIELDSTATE() => erst Feld verlassen! SetFldState( ) bei Views mit Requery() Table changedim 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! Sonderfälle

  29. BEGIN TRANS *-- 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! Transaktionen

  30. 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

  31. 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!

  32. Zugriffsreihenfolge beachten Zur Vermeidung von Deadlocks im Netzbetrieb: • 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

  33. Multiuser-Datenzugriff • Generell Öffnen im SHARED AGAIN-Modus • RECORD LOCK - Satzsperre • Einzelsatz, mehrere Sätze • FILE LOCK - Dateisperre • HEADER LOCK - Headersperre • EXCLUSIVE - exklusives Öffnen

  34. 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!) Automatisches Sperren

  35. 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 Sperren auch beim Lesen

  36. Hinweise zur Pufferung • Problem: Änderung von Datensätzen durch andere Netz-User erst sichtbar durch/nach: • SET REFRESH • Neue Parameter in VFP 9.0 • SKIP, GOTO, SEEK • Satzsperre RLOCK • Lösung: Beim Lesen 1x Sperren • Ggf. locate for recno() = lnrecno • Neu: FLUSH IN … (FORCE)

  37. 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 Referentielle Integrität (RI)

  38. DELETE-Trigger: Childs löschen mit Parent / verhindern Bei DELETE -> Cascading Delete Nicht bei ZAP (!) Nicht bei PACK INSERT-Trigger: Childs nur zu Parents Bei Append, Insert, Import Auch bei RECALL UPDATE-Trigger: Aktualisierung Fremdschlüsselfelder Bei replace, Gather, Update Nicht bei DELETED() Besonderheiten der Trigger

  39. 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 Hinweise zu Triggern

  40. 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

  41. 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+Pos1 Memofenster öffnen • Strg+Enter Memofenster schliessen • Strg+W Speichern und Schliessen • Strg+F10 Maximieren/Wiederherstellen

  42. Querverweise • 03-21 Schützen einer Tabelle in einem DBC • 03-23 Schützen von VFP Daten • 03-24 Die Normalisierung von Daten

  43. 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

  44. 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

More Related