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
DatenbankengineänderungenDatenbankengineänderungen
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
CharacterCharacter Char, CharacterChar, Character CCDateDate DateDate DDDateTimeDateTime DatetimeDatetime TTNumericNumeric Num, NumericNum, Numeric NNFloatingFloating FloatFloat FFIntegerInteger Int, IntegerInt, Integer IIDouble Double DoubleDouble BBCurrencyCurrency CurrencyCurrency YYLogicalLogical LogicalLogical LLMemoMemo MemoMemo MMGeneralGeneral GeneralGeneral GGPicturePicture PicturePicture PPVarcharVarchar VarcharVarchar VVVarbinaryVarbinary VarbinaryVarbinary QQBlobBlob BlobBlob WW
FeldartenFeldarten Character / ZeichenCharacter / Zeichen (c) (c)
Character BinaryCharacter Binary Numeric / ZahlNumeric / Zahl (n) (n) Date / DatumDate / Datum (d) (d) Logical / LogischLogical / Logisch (l) (l) Memofelder (Char)Memofelder (Char) m(c) m(c)
Memo BinaryMemo Binary GeneralGeneral AutoIncrementAutoIncrement Neu: BlobNeu: Blob
Integer / IntegerInteger / Integer i(n) i(n) Double / Doppelte G.Double / Doppelte G. b(n) b(n) Float / FließkommaFloat / Fließkomma f(n) f(n) Currency / WährungCurrency / Währung y(y) y(y) DateTime / DatumZeit t(t)DateTime / DatumZeit t(t) Neu: VarCharacterNeu: VarCharacter Neu: VarBinaryNeu: VarBinary
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
picturevalpictureval oimg.pictureval = filetostr / bloboimg.pictureval = filetostr / blob loadpictureloadpicture
VarChar / VarBinaryVarChar / VarBinary
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:
Feld-Validierung, Feld-FehlermeldungFeld-Validierung, Feld-Fehlermeldung Satz-Validierung, Satz-FehlermeldungSatz-Validierung, Satz-Fehlermeldung Feld-Default-WertFeld-Default-Wert Trigger-AufrufeTrigger-Aufrufe
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
Benötigt für:Benötigt für: Rushmore-OptimierungRushmore-Optimierung SuchbefehleSuchbefehle RelationenRelationen dito persistentdito persistent Referentielle IntegritätReferentielle Integrität
IndexartenIndexarten
REGULAR - Normaler SchlüsselREGULAR - Normaler Schlüssel CANDIDATE - Eindeutiger SchlüsselCANDIDATE - Eindeutiger Schlüssel PRIMARY - PrimärschlüsselPRIMARY - Primärschlüssel
nur in DBC, nicht in freien Tabellennur in DBC, nicht in freien Tabellen UNIQUE - „Einmaliger“ SchlüsselUNIQUE - „Einmaliger“ Schlüssel
NICHT VERWENDEN! Sinnvoll gelegentlich in ViewsNICHT VERWENDEN! Sinnvoll gelegentlich in Views
Neu: BINARY –BinärschlüsselNeu: BINARY –Binärschlüssel
PrimärschlüsselPrimärschlüssel
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 …
Sequenz MACHINESequenz MACHINE „„A“ = „a“ A“ = „a“ .F. .F.
Sequenz GENERALSequenz GENERAL „„A“ = „a“ A“ = „a“ .T. .T.
CodepagesCodepages
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
zusammengesetzte Felder, Alltrim()zusammengesetzte Felder, Alltrim()
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)
Optimierbare BefehleOptimierbare Befehle
AVERAGEAVERAGE DELETE / BLANKDELETE / BLANK BROWSE => GRID (!)BROWSE => GRID (!) CALCULATECALCULATE CHANGE / EDITCHANGE / EDIT COPY TO (ARRAY)COPY TO (ARRAY) COUNTCOUNT LIST / DISPLAYLIST / DISPLAY EXPORTEXPORT
INDEXINDEX LOCATELOCATE RECALLRECALL REPLACE (ARRAY)REPLACE (ARRAY) LABEL / REPORTLABEL / REPORT SCANSCAN SORTSORT SUMSUM TOTALTOTAL
OptimierungsmöglichkeitenOptimierungsmöglichkeiten
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
BuffermodeBuffermode
Buffermodes:Buffermodes: 1-None1-None 2-Pessimistic Row2-Pessimistic Row 3-Pessimistic Table3-Pessimistic Table 4-Optimistic Row4-Optimistic Row 5-Optimistic Table5-Optimistic Table Row: Skip = Update (!)Row: Skip = Update (!)
Optimistic:Optimistic: Record changed!Record changed! Curval/Oldval()Curval/Oldval() GetFldState()GetFldState()
Table-Buffering:Table-Buffering: Getnextmodified()Getnextmodified()
Funktionen im EinsatzFunktionen im Einsatz
Beispiele:Beispiele:
? GetFldState(-1) != Repl(„1“,Fcount()+1)? GetFldState(-1) != Repl(„1“,Fcount()+1)
? Left( GetFldState(-1),1) != „1“? Left( GetFldState(-1),1) != „1“
Goto ( GetNextModified( Recno() ) )Goto ( GetNextModified( Recno() ) )
? Field( At( „2“, GetFldState(-1) ) )? Field( At( „2“, GetFldState(-1) ) )
? SetFldState( „Feld“, 1 )? SetFldState( „Feld“, 1 ) && Views!&& Views!
Achtung: Negative Record-Nummern!Achtung: Negative Record-Nummern!
ReihenfolgeReihenfolge
Tabellenfeld-Valid (alle Felder)Tabellenfeld-Valid (alle Felder) Masken-Valid (aktuelles Element)Masken-Valid (aktuelles Element) Datensatz-Valid(ierung)Datensatz-Valid(ierung) Primary/Candidate-SchlüsselPrimary/Candidate-Schlüssel TriggerTrigger
kaskadierend über alle Childskaskadierend über alle Childs Achtung: _TRIGGERLEVEL kann hoch werdenAchtung: _TRIGGERLEVEL kann hoch werden
CursorGetProp( ) / SetProp( )CursorGetProp( ) / SetProp( )
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
Primary Key doppelt: Primary Key doppelt: Letzter gilt!Letzter gilt!
TransaktionenTransaktionen
BEGIN TRANSBEGIN TRANS *-- Datenzugriff*-- Datenzugriff
END TRANSEND TRANS ROLLBACKROLLBACK
Absturz = RollbackAbsturz = Rollback Rollback bei Öffnen!Rollback bei Öffnen!
TXNLEVEL()TXNLEVEL() bis 5 Ebenen tief!bis 5 Ebenen tief! Äußerste Ebene zählt!Äußerste Ebene zählt!
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!
Zugriffsreihenfolge beachtenZugriffsreihenfolge beachten
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
FILE LOCK - DateisperreFILE LOCK - Dateisperre HEADER LOCK - HeadersperreHEADER LOCK - Headersperre EXCLUSIVE - exklusives ÖffnenEXCLUSIVE - exklusives Öffnen
Automatisches SperrenAutomatisches Sperren
FILE LOCK:FILE LOCK: ALTER TABLEALTER TABLE INSERT (xBase)INSERT (xBase) DELETE / REPLACE mit DELETE / REPLACE mit
ALL/REST/NEXT xALL/REST/NEXT x UPDATE (beide)UPDATE (beide)
HEADER LOCK:HEADER LOCK: APPEND / BLANK / FORAPPEND / BLANK / FOR INSERT (SQL)INSERT (SQL)
RECORD LOCK:RECORD LOCK: APPEND MEMOAPPEND MEMO DELETE / REPLACE / DELETE / REPLACE /
RECALL / w/wo NEXT 1RECALL / w/wo NEXT 1 DELETE / BLANK REC.DELETE / BLANK REC. GATHERGATHER CHANGE / EDITCHANGE / EDIT MODI MEMOMODI MEMO BROWSE (Childs!)BROWSE (Childs!)
Sperren auch beim LesenSperren auch beim Lesen
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
SKIP, GOTO, SEEKSKIP, GOTO, SEEK Satzsperre RLOCKSatzsperre RLOCK
Lösung: Beim Lesen 1x SperrenLösung: Beim Lesen 1x Sperren Ggf. locate for recno() = lnrecnoGgf. locate for recno() = lnrecno
Neu: FLUSH IN … (FORCE)Neu: FLUSH IN … (FORCE)
Referentielle Integrität (RI)Referentielle Integrität (RI)
Bedeutung der Bedeutung der Referentiellen Integrität Referentiellen Integrität einer Datenbankeiner Datenbank
Arbeiten mit dem Arbeiten mit dem Referential Integrity Referential Integrity BuilderBuilder
Empfehlung:Empfehlung:AMRI-Builder !AMRI-Builder !
Programmatisch:Programmatisch: CREATE TRIGGERCREATE TRIGGER DELETE TRIGGERDELETE TRIGGER _TRIGGERLEVEL_TRIGGERLEVEL
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
Zusammenfassung VerbesserungenZusammenfassung Verbesserungen
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, ,
http://newsletter.dfpug.dehttp://newsletter.dfpug.de, , http://devcon.dfpug.dehttp://devcon.dfpug.de, , http://roadshow.dfpug.dehttp://roadshow.dfpug.de, , http://www.visualextend.dehttp://www.visualextend.de, ,
http://www.linuxtransfer.dehttp://www.linuxtransfer.de, , http://www.visualfoxpro.dehttp://www.visualfoxpro.de
Top Related