Inhaltsverzeichnis | 6 |
Teil I: Grundlagen | 6 |
Teil II: Datenschnittstellen | 12 |
Teil III: Weitere Technologien | 19 |
Vorwort | 28 |
1 Einführung | 34 |
1.1 VBA-Programmierung in Access | 34 |
1.1.1 Visual Basic versus VBA | 34 |
1.1.2 Objekt- und ereignisorientierte Programmierung | 35 |
1.1.3 VBA- oder Makro-Programmierung? | 36 |
1.1.4 Die VBA-Entwicklungsumgebung | 37 |
1.1.5 Formularentwurf | 37 |
1.1.6 Code-Fenster und Symbolleiste | 38 |
1.1.7 Das Eigenschaftenfenster | 39 |
1.1.8 Der Projekt-Explorer | 40 |
1.1.9 Das Code-Fenster | 40 |
1.1.10 Arbeiten mit der Hilfe | 43 |
1.2 Sicherheitseinstellungen | 44 |
1.2.1 Zur Geschichte der Access-Sicherheit | 44 |
1.2.2 Eine nicht vertrauenswürdige Datenbank öffnen | 45 |
1.2.3 Das Sicherheitscenter | 47 |
1.2.4 Definition vertrauenswürdiger Speicherorte | 50 |
1.3 Einführungsbeispiele | 51 |
1.3.1 Erstellen der Testdatenbank | 52 |
1.3.2 Konventionelle Programmierung | 53 |
1.3.3 Programmieren mit VBA | 57 |
1.3.4 Automatische Makrokonvertierung | 62 |
1.3.5 Programmieren mit Datenmakros | 63 |
1.4 Highlights und Features von Access 2016 | 65 |
1.4.1 Zur Geschichte der Vorgängerversionen | 65 |
1.4.2 Microsoft Access 2016 – viel Lärm um nichts? | 68 |
1.4.3 Der inoffizielle Access-Friedhof (Access 2013/2016) | 69 |
1.5 Übersichten und Ergänzungen | 69 |
1.5.1 Deutsche und englische Bezeichner | 69 |
1.5.2 DoCmd-Objekt | 71 |
2 Programmieren mit VBA | 74 |
2.1 Datentypen, Variablen und Konstanten | 74 |
2.1.1 Übersicht | 74 |
2.1.2 Variablendeklaration | 75 |
2.1.3 Konstantendeklaration | 80 |
2.1.4 Gültigkeitsbereiche | 81 |
2.2 Einzelheiten zu den Datentypen | 84 |
2.2.1 Single- und Double-Datentypen | 84 |
2.2.2 Integer-, Long- und Boolean-Datentypen | 84 |
2.2.3 Date-Datentyp | 85 |
2.2.4 Currency-Datentyp | 87 |
2.2.5 String-Datentyp | 88 |
2.2.6 Variant-Datentyp | 90 |
2.3 Datenfelder (Arrays) | 93 |
2.3.1 Statische Arrays | 93 |
2.3.2 Dynamische Arrays | 95 |
2.4 Benutzerdefinierte Datentypen | 97 |
2.4.1 Type-Anweisung | 97 |
2.4.2 With-Anweisung | 98 |
2.4.3 Strings innerhalb Type | 98 |
2.4.4 Enumerationen | 99 |
2.4.5 Arrays in benutzerdefinierten Typen | 100 |
2.5 Operatoren | 101 |
2.5.1 Arithmetische Operatoren | 102 |
2.5.2 Logische Operatoren | 104 |
2.5.3 Vergleichsoperatoren | 105 |
2.6 Kontrollstrukturen | 106 |
2.6.1 Bedingte Verzweigungen | 106 |
2.6.2 Schleifenanweisungen | 108 |
2.6.3 GoTo und GoSub | 110 |
2.7 Zeichenkettenfunktionen | 111 |
2.7.1 Stringverarbeitung | 111 |
2.7.2 Format-Funktion | 113 |
2.8 Vordefinierte Funktionen | 117 |
2.8.1 Mathematische Funktionen | 117 |
2.8.2 Finanzmathematische Funktionen | 120 |
2.8.3 Datums-/Zeitfunktionen | 121 |
2.9 Benutzerdefinierte Funktionen/Prozeduren | 124 |
2.9.1 Funktion | 124 |
2.9.2 Prozedur | 125 |
2.9.3 Parameterübergabe ByRef oder ByVal | 125 |
2.9.4 Optionale Argumente | 126 |
2.9.5 Benannte Argumente | 127 |
2.9.6 Parameter-Arrays | 127 |
2.9.7 Dynamische Arrays als Argumente | 128 |
2.9.8 Rückgabe von Arrays | 128 |
2.9.9 Private-, Public- und Static-Deklarationen | 129 |
2.10 Fehlersuche | 131 |
2.10.1 Direktfenster | 132 |
2.10.2 Verwendung des Debug-Objekts | 132 |
2.10.3 Arbeiten mit dem Lokal-Fenster | 133 |
2.10.4 Überwachungs-Fenster | 135 |
2.10.5 Noch mehr Debugging | 136 |
2.11 Fehlerbehandlung | 140 |
2.11.1 Anweisungen zum Error-Handling | 140 |
2.11.2 Beispiele zum Error-Handling | 141 |
2.11.3 Fehlerbehandlung per Ereignis | 143 |
2.11.4 Fehlerbehandlung komplett deaktivieren | 144 |
2.12 Standarddialogfelder | 144 |
2.12.1 Einfache Anweisung | 145 |
2.12.2 Ausführliche Anweisung | 146 |
2.12.3 Rückgabewerte der MsgBox-Funktion | 146 |
2.12.4 Abfrage von Werten mit der InputBox-Funktion | 148 |
2.13 Übersichten und Ergänzungen | 149 |
2.13.1 Datumskonstanten | 149 |
2.13.2 Rückgabewerte der VarType-Funktion | 149 |
2.14 Praxisbeispiele | 150 |
2.14.1 In einem Textfeld suchen | 150 |
2.14.2 Zeitangaben runden | 151 |
2.14.3 Das Wochenende feststellen | 153 |
2.14.4 Mit dynamischen Arrays rechnen | 154 |
2.14.5 Arbeiten mit dem Debugger | 158 |
3 Makros – eine Einführung | 164 |
3.1 Klassische Makros | 164 |
3.1.1 Entwurfsoberfläche | 164 |
3.1.2 Eigenständige Makros | 165 |
3.1.3 Eingebettete Makros | 168 |
3.1.4 Das AutoKeys-Makro | 172 |
3.1.5 Das AutoExec-Makro | 174 |
3.1.6 Potenziell gefährliche Makroaktionen | 174 |
3.2 Datenmakros | 175 |
3.2.1 Einsatzmöglichkeitem | 176 |
3.2.2 Funktionsprinzip | 176 |
3.2.3 Erzeugen von Datenmakros | 177 |
3.2.4 Datenmakros umbenennen, löschen und ändern | 178 |
3.2.5 USysApplicationLog | 178 |
3.2.6 Aktionen in Datenmakros | 179 |
3.2.7 Auswahl des richtigen Tabellenereignisses | 180 |
3.3 Praxisbeispiele | 181 |
3.3.1 Eingabe-Formular mit neuem Datensatz öffnen | 182 |
3.3.2 Einen Datensatznavigator selbst bauen | 183 |
3.3.3 Ein ereignisgesteuertes Datenmakro erstellen | 185 |
3.3.4 Arbeiten mit einem benannten Datenmakro | 190 |
3.3.5 Per VBA auf ein benanntes Datenmakro zugreifen | 194 |
3.3.6 Änderungen von Tabelleninhalten protokollieren | 195 |
4 Formulare und Steuerelemente | 198 |
4.1 Allgemeines | 198 |
4.1.1 Gruppen von Eigenschaften | 199 |
4.1.2 Methoden | 199 |
4.1.3 Gruppen von Ereignissen | 199 |
4.2 Das Form-Objekt | 200 |
4.2.1 Format-Eigenschaften | 200 |
4.2.2 Daten-Eigenschaften | 207 |
4.2.3 Weitere Eigenschaften | 207 |
4.2.4 Fenster- und Fokus-Ereignisse | 209 |
4.2.5 Tastatur- und Maus-Ereignisse | 211 |
4.2.6 Daten- und Filter-Ereignisse | 213 |
4.2.7 Weitere Ereignisse | 215 |
4.2.8 Methoden | 215 |
4.2.9 Unterformulare | 218 |
4.3 Steuerelemente (Controls) | 219 |
4.3.1 Allgemeines | 219 |
4.3.2 Allgemeine Eigenschaften auf einen Blick | 220 |
4.3.3 Allgemeine Ereignisse auf einen Blick | 230 |
4.3.4 Methoden von Steuerelementen | 231 |
4.3.5 Das Screen-Objekt | 232 |
4.4 ActiveX-Steuerelemente | 234 |
4.4.1 Vergleich mit den integrierten Steuerelementen | 234 |
4.4.2 StatusBar als Beispiel | 236 |
4.5 Praxisbeispiele | 240 |
4.5.1 Das Textfeld programmieren | 240 |
4.5.2 In ungebundene Textfelder ein- und ausgeben | 242 |
4.5.3 Ein ungebundenes Kombinationsfeld füllen | 243 |
4.5.4 Ein Unterformular programmieren | 246 |
4.5.5 Das Register-Steuerelement kennen lernen | 249 |
4.5.6 Die Statusleiste programmieren | 253 |
4.5.7 Verwenden von Bild-Ressourcen | 256 |
4.5.8 Programmieren des Navigationssteuerelements | 258 |
5 Berichte | 262 |
5.1 Allgemeines | 262 |
5.1.1 Reportansichten | 262 |
5.1.2 Die OpenReport-Methode | 263 |
5.1.3 Parameterübergabe | 264 |
5.2 Wichtige Berichtseigenschaften | 264 |
5.2.1 Formateigenschaften | 264 |
5.2.2 Dateneigenschaften | 265 |
5.2.3 Grafikeigenschaften | 265 |
5.2.4 Linien- und Stifteigenschaften | 269 |
5.2.5 Schrifteigenschaften | 270 |
5.2.6 Farb- und Mustereigenschaften | 270 |
5.2.7 Sonstige Eigenschaften | 272 |
5.3 Berichtsereignisse | 274 |
5.3.1 Allgemeine Ereignisse | 274 |
5.3.2 Tastatur- und Mausereignisse | 276 |
5.4 Berichtsmethoden | 277 |
5.4.1 Grafikmethoden (Übersicht) | 277 |
5.4.2 Scale | 277 |
5.4.3 Line | 278 |
5.4.4 PSet | 279 |
5.4.5 Circle | 280 |
5.4.6 Print | 281 |
5.4.7 TextWidth und TextHeight | 282 |
5.4.8 Sonstige Methoden | 283 |
5.5 Weitere Features des Report-Objekts | 283 |
5.5.1 Rich-Text-Felder drucken | 283 |
5.5.2 Verlauf eines Memofeldes drucken | 284 |
5.5.3 Eine Liste der Anlagen drucken | 284 |
5.5.4 Berichte nachträglich filtern | 287 |
5.5.5 Berichte als PDF-Datei exportieren | 288 |
5.5.6 Berichte als RTF-Datei exportieren | 289 |
5.6 Das Printer-Objekt | 289 |
5.6.1 Wo finde ich das Printer-Objekt? | 290 |
5.6.2 Die Printers-Collection | 290 |
5.6.3 Auswahl eines Druckers | 291 |
5.6.4 Speichern von Berichts-Optionen | 293 |
5.6.5 Eigenschaften des Printers | 294 |
5.7 Direkte Druckausgabe | 295 |
5.8 Übersichten | 295 |
5.8.1 DrawMode-Eigenschaft | 295 |
5.8.2 Farbkonstanten | 296 |
5.9 Praxisbeispiele | 296 |
5.9.1 Aufruf eines Berichts mit Datenfilter | 296 |
5.9.2 Im Report gruppieren und rechnen | 300 |
5.9.3 Erstellen und Drucken eines Diagramms | 304 |
5.9.4 Berichte in Formularen anzeigen | 308 |
6 Programmieren mit Objekten | 310 |
6.1 Objektvariablen | 310 |
6.1.1 Objekttypen und Set-Anweisung | 310 |
6.1.2 Object-Datentyp | 312 |
6.1.3 Form- und Report-Objekt | 313 |
6.1.4 Control-Objekt | 314 |
6.2 Formular- und Berichtsmodule | 318 |
6.2.1 Instanzen von Formularen und Berichten | 318 |
6.2.2 Benutzerdefinierte Form-/Report-Objekte | 320 |
6.2.3 Eigenständige Klassenmodule | 321 |
6.3 Auflistungen | 325 |
6.3.1 Forms/Reports | 325 |
6.3.2 Controls | 326 |
6.3.3 Collection-Objekt | 328 |
6.3.4 Dictionary-Objekt | 330 |
6.3.5 Property und Properties | 330 |
6.3.6 Module-Objekt und Modules-Auflistung | 331 |
6.3.7 Reference-Objekt und References-Auflistung | 333 |
6.4 Die Access-Objekthierarchie | 335 |
6.4.1 Der Objektkatalog | 335 |
6.4.2 Das Application-Objekt allgemein | 336 |
6.4.3 Eigenschaften und Methoden des Application-Objekts | 339 |
6.4.4 Weitere wichtige Objekte | 344 |
6.4.5 AccessObject | 345 |
6.4.6 CurrentProject | 346 |
6.4.7 CurrentData | 348 |
6.5 Übersichten | 348 |
6.5.1 Konstanten der ControlType-Eigenschaft | 348 |
6.5.2 Rückgabewerte der CurrentObjectType-Funktion | 349 |
6.6 Praxisbeispiele | 349 |
6.6.1 Ein Steuerelemente-Array automatisch erstellen | 349 |
6.6.2 Mit Formular-Instanzen arbeiten | 353 |
6.6.3 Mit einer eigenständigen Klasse experimentieren | 355 |
6.6.4 Auf Objekte in Auflistungen zugreifen | 358 |
6.6.5 Properties-Auflistungen untersuchen | 361 |
7 DAO-Programmierung | 366 |
7.1 Allgemeines | 366 |
7.1.1 DBEngine | 366 |
7.1.2 Workspace-Objekt | 367 |
7.1.3 Database-Objekt | 368 |
7.1.4 Recordset-Objekt | 368 |
7.1.5 Verwendung der Datenbankobjekte | 369 |
7.2 Grundlegende Arbeitstechniken | 369 |
7.2.1 Arbeitsumgebung festlegen | 370 |
7.2.2 Datenbank anlegen und öffnen | 370 |
7.2.3 Tabellen/Indizes anlegen | 374 |
7.2.4 Tabellen einbinden | 379 |
7.2.5 Tabellen verknüpfen (Relationen) | 380 |
7.2.6 Abfragen erstellen/ausführen | 382 |
7.2.7 Öffnen von Tabellen/Abfragen | 384 |
7.3 Arbeiten mit Recordsets | 387 |
7.3.1 Eigenschaften und Methoden von Recordsets | 387 |
7.3.2 Datensätze anzeigen | 390 |
7.3.3 Datensätze hinzufügen/ändern | 392 |
7.3.4 Datensätze löschen | 394 |
7.3.5 Datensätze sortieren | 396 |
7.3.6 Datensätze suchen | 397 |
7.3.7 Datensätze filtern | 398 |
7.3.8 DAO in gebundenen Formularen | 399 |
7.3.9 Auf Anlage-Felder zugreifen | 402 |
7.3.10 Auf mehrwertige Felder zugreifen | 405 |
7.3.11 Verlaufsverfolgung eines Memo-Felds | 406 |
7.4 Weitere Funktionen | 407 |
7.4.1 Eigenschaften (Properties) | 407 |
7.4.2 Transaktionen | 409 |
7.5 Praxisbeispiele | 410 |
7.5.1 Eine Tabelle anlegen | 410 |
7.5.2 Navigieren mit DAO | 413 |
7.5.3 Den Datensatzzeiger bewegen | 416 |
7.5.4 In Recordsets suchen | 420 |
7.5.5 Eine Datenbank analysieren | 423 |
7.6 Komplexbeispiel: Telefonverzeichnis | 426 |
7.6.1 Eingabemaske | 426 |
7.6.2 Anforderungen | 426 |
7.6.3 Programmierung | 427 |
7.6.4 Test und Bemerkungen | 436 |
8 ADO-Programmierung | 438 |
8.1 Ein erster Blick auf ADO | 438 |
8.1.1 Kleines Einführungsbeispiel | 439 |
8.1.2 Zur Geschichte von ADO | 440 |
8.1.3 Hinweise zu den ADO-Bibliotheken | 441 |
8.1.4 ADO und OLE DB | 442 |
8.1.1 ADO-Objektmodell | 443 |
8.2 ADO-Grundoperationen | 445 |
8.2.1 Beziehungen zwischen den Objekten | 445 |
8.2.2 Die Verbindung zur Datenquelle | 446 |
8.2.3 Aktionsabfragen mit dem Command-Objekt | 450 |
8.2.4 Recordsets mit Daten füllen | 452 |
8.3 Weitere Operationen mit Recordsets | 457 |
8.3.1 Welche Recordset-Features werden unterstützt? | 457 |
8.3.2 Editieren von Datensätzen | 458 |
8.3.3 Hinzufügen von Datensätzen | 459 |
8.3.4 Löschen von Datensätzen | 459 |
8.3.5 Recordsets filtern | 460 |
8.3.6 Ungebundene Recordsets | 461 |
8.3.7 Recordsets abspeichern | 462 |
8.3.8 Bewegen in Recordsets | 462 |
8.3.9 Daten direkt einlesen | 463 |
8.3.10 Sortieren | 464 |
8.3.11 Suchen | 465 |
8.3.12 Ereignisse auswerten | 465 |
8.4 Zugriff auf ADO-Auflistungen | 467 |
8.4.1 Allgemeine Features | 467 |
8.4.2 Property und Properties | 468 |
8.4.3 Field und Fields | 469 |
8.4.4 Parameter und Parameters | 470 |
8.4.5 Error und Errors | 471 |
8.5 Übersichten | 472 |
8.5.1 Connection-Objekt | 472 |
8.5.2 Command-Objekt | 473 |
8.5.3 Recordset-Objekt | 473 |
8.6 Praxisbeispiele | 475 |
8.6.1 Mit ADO auf eine Access-Datenbank zugreifen | 475 |
8.6.2 Ein ADO-Datenklassenmodul verwenden | 477 |
8.6.3 Ein intelligentes ADO-Frontend entwickeln | 480 |
9 Datenbankverwaltung | 486 |
9.1 Datenbankverwaltung mit ADOX | 486 |
9.1.1 Datenbanken erstellen | 488 |
9.1.2 Tabellendefinition | 490 |
9.1.3 Indexdefinition | 494 |
9.1.4 Erstellen von Prozeduren und Sichten | 496 |
9.1.5 Tabellen verknüpfen (Relationen) | 497 |
9.2 Erstellen spezieller Feldtypen | 498 |
9.2.1 Automatische Zufallswerte (GUID) | 498 |
9.2.2 Memofeld mit Archiv-Funktion (Nur anfügen) | 500 |
9.2.3 Anlage-Feld | 502 |
9.2.4 Rich-Text-Feld | 503 |
9.2.5 Multivalue-Feld (MVF) | 504 |
9.2.6 Berechnete Spalten | 509 |
9.2.7 Beschreibung von Datenbankfeldern setzen | 511 |
9.3 Zugriffsschutz in Access-Datenbanken | 513 |
9.3.1 Grundlagen | 513 |
9.3.2 Sichern auf Datenbankebene (DAO) | 515 |
9.3.3 Sichern auf Datenbankebene (ADO/ADOX) | 516 |
9.3.4 Erstellen neuer Benutzer und Gruppen (DAO) | 516 |
9.3.5 Vergabe von Rechten (DAO) | 518 |
9.3.6 Komplettbeispiel: Nutzerbasierte Sicherheit | 520 |
9.3.7 Erstellen neuer Benutzer und Gruppen (ADOX) | 525 |
9.3.8 Vergabe von Rechten (ADOX) | 526 |
9.3.9 Verschlüsseln von Datenbanken | 528 |
9.4 Multiuserzugriff | 531 |
9.4.1 Verwenden der DAO | 532 |
9.4.2 Verwenden der ADO | 535 |
9.5 ODBC-Verbindungen | 536 |
9.5.1 Ein Blick auf den ODBC-Datenquellen-Administrator | 536 |
9.5.2 Erstellen einer ODBC-Verbindung (DAO) | 538 |
9.5.3 Öffnen einer ODBC-Verbindung (DAO) | 539 |
9.5.4 Öffnen einer ODBC-Verbindung (ADO) | 541 |
9.5.5 Konfigurieren von ODBC-Verbindungen | 542 |
9.6 Zugriff auf Fremdformate | 542 |
9.6.1 dBASE III/IV- und FoxPro-Datenbanken | 543 |
9.6.2 Textdateien (TXT/ASC/CSV) | 547 |
9.7 Einbinden externer Tabellen | 551 |
9.7.1 Verwenden der DAO | 551 |
9.7.2 Verwenden der ADOX | 553 |
9.8 Exportieren von Daten | 555 |
9.8.1 TransferDatabase-Methode | 555 |
9.8.2 Exportieren mit SQL-Anweisungen | 556 |
9.9 Replizieren von Datenbanken | 556 |
9.10 Optimierung | 557 |
9.10.1 Indizes | 557 |
9.10.2 Abfrage-Optimierung | 557 |
9.10.3 Weitere Möglichkeiten | 558 |
9.10.4 ADO/DAO/ODBC – Was ist schneller? | 559 |
9.11 Tipps & Tricks | 561 |
9.11.1 Wie prüft man die ADO-Versionsnummer? | 561 |
9.11.2 Access-Datenbanken exklusiv öffnen | 561 |
9.11.3 Access-Datenbanken im Netzwerk | 562 |
9.11.4 Alle aktiven Verbindungen zur Datenbank auflisten | 562 |
9.11.5 Das Datenbank-Kennwort ändern | 563 |
9.11.6 Abfragen über mehrere Datenbanken | 564 |
9.11.7 Datenbanken reparieren/komprimieren | 564 |
10 Microsoft SQL Server | 566 |
10.1 Ein erster Schock ... | 566 |
10.2 Allgemeines | 567 |
10.2.1 SQL Server LocalDB | 568 |
10.2.2 SQL Server Express | 569 |
10.2.3 Unterschiede SQL Server-Varianten/Jet-Engine | 570 |
10.2.4 Client- versus Fileserver-Programmierung | 572 |
10.2.5 Installation SQL Server Express | 574 |
10.2.6 Netzwerkzugriff für den SQL Server Express | 578 |
10.2.7 Die wichtigsten Tools von SQL Server | 580 |
10.2.8 Vordefinierte Datenbanken | 583 |
10.2.9 Einschränkungen | 584 |
10.2.10 Weitere SQL Server-Funktionen im Kurzüberblick | 585 |
10.2.11 Datenbanken verwalten | 586 |
10.3 Transact-SQL – die Sprache des SQL Servers | 588 |
10.3.1 Schreibweise | 588 |
10.3.2 Kommentare | 589 |
10.3.3 Zeichenketten | 589 |
10.3.4 Variablen deklarieren/verwenden | 590 |
10.3.5 Bedingungen mit IF/ELSE auswerten | 591 |
10.3.6 Verwenden von CASE | 592 |
10.3.7 Verwenden von WHILE…BREAK/CONTINUE | 592 |
10.3.8 Datum und Uhrzeit in T-SQL | 593 |
10.3.9 Verwenden von GOTO | 593 |
10.4 Praktisches Arbeiten mit dem SQL Server | 594 |
10.4.1 Erstellen neuer SQL Server-Datenbanken | 594 |
10.4.2 Erzeugen und Verwalten von Tabellen | 595 |
10.4.3 Erzeugen und Verwenden von Sichten (Views) | 596 |
10.4.4 Verwenden von Gespeicherten Prozeduren | 598 |
10.4.5 Programmieren von Triggern | 602 |
10.4.6 Erzeugen von Datenbankdiagrammen | 606 |
10.4.7 Volltextabfragen | 607 |
10.4.8 Datenbanken sichern und wiederherstellen | 613 |
10.5 Fehlerbehandlung | 616 |
10.5.1 Das Fehlermodell des SQL Servers | 617 |
10.5.2 Verwenden von @@ERROR | 617 |
10.5.3 Verwenden von RAISEERROR | 618 |
10.5.4 Fehlerbehandlung mit TRY...CATCH | 619 |
10.5.5 Fehlerbehandlung mit den ADO | 621 |
10.6 Datensicherheit auf dem Microsoft SQL Server | 623 |
10.6.1 Überblick Sicherheitsmodell | 624 |
10.6.2 Verwalten mit dem SQL Server Management Studio | 626 |
10.6.3 Verwalten mit T-SQL | 630 |
10.7 Tipps & Tricks | 633 |
10.7.1 Alle registrierten Microsoft SQL Server ermitteln | 633 |
10.7.2 Alle Datenbanken ermitteln | 634 |
10.7.3 Alle Tabellen ermitteln | 634 |
10.7.4 Eine Tabelle löschen | 635 |
10.7.5 Anzahl der Datensätze beschränken | 636 |
10.7.6 Platzhalterzeichen in TSQL | 637 |
10.7.7 Leerzeichen entfernen | 637 |
10.7.8 Teilstrings erzeugen | 637 |
10.7.9 Mit einer Datenbankdatei verbinden | 638 |
10.7.10 Warum wird @@ERROR nicht korrekt verarbeitet? | 639 |
10.7.11 Die Anzahl der Datensätze bestimmen | 639 |
10.7.12 Warum sind Abfragen mit Platzhaltern so langsam? | 639 |
10.7.13 Groß-/Kleinschreibung berücksichtigen | 640 |
10.7.14 Das Ergebnis einer Stored Procedure speichern | 640 |
10.7.15 Eine Datenbank umbenennen | 640 |
10.7.16 Eine Datenbank zwischen Servern verschieben | 641 |
10.7.17 Die Datenbankstruktur kopieren | 642 |
10.7.18 Nach dem Löschen IDENTITY auf 0 setzen | 643 |
10.7.19 Eine Tabellenspalte umbenennen | 643 |
10.7.20 Temporäre Tabellen unterscheiden | 643 |
10.7.21 Daten aus verschiedenen Datenbanken anzeigen | 644 |
10.7.22 Einen SMO-Mapper realisieren | 644 |
10.8 Übersichten | 649 |
10.8.1 Datentypen | 649 |
10.8.2 Unterschiede Access- und SQL Server-Datentypen | 650 |
11 Access und Azure SQL | 652 |
11.1 Einführung in SQL Azure-Datenbanken | 653 |
11.1.1 Das Grundprinzip der "Webdatenbank" | 653 |
11.1.2 Der Azure-Server | 655 |
11.1.3 Die Frage nach den Kosten | 656 |
11.2 Einrichten des Servers | 657 |
11.2.1 Die zentrale Organisationsstruktur | 658 |
11.2.2 Einen Server und eine Datenbank erstellen | 659 |
11.2.3 IP-Filter konfigurieren | 663 |
11.2.4 Bemerkungen zum neu erstellten Account | 664 |
11.2.5 Die drei konzeptionellen Zugriffsmodelle | 664 |
11.3 Administrieren von Azure SQL-Datenbanken | 667 |
11.3.1 Zugriff mit dem SQL Server Management Studio | 667 |
11.3.2 Weitere Accounts erstellen | 669 |
11.3.3 Lokale Datenbanken migrieren | 672 |
11.3.4 Migrieren von Access-Datenbanken | 675 |
11.4 Praktische Umsetzung in Access | 677 |
11.4.1 Tabellen einbinden | 678 |
11.4.2 DAO- oder ADO-Zugriff – keine Frage! | 681 |
11.4.3 Unsere AzureSQL-Library | 681 |
11.4.4 Verbindung mit ADO aufbauen | 682 |
11.4.5 Datenbank erstellen | 686 |
11.4.6 Ist die Datenbank schon vorhanden? | 687 |
11.4.7 Den aktuellen "Füllstand" abrufen | 688 |
11.4.8 Was passiert, wenn die Datenbank zu klein wird? | 691 |
11.4.9 Eine Datenbankkopie erstellen | 691 |
11.4.10 Tabelle(n) erstellen | 692 |
11.4.11 Daten exportieren | 693 |
11.4.12 Daten einbinden | 694 |
11.4.13 Daten lesen | 695 |
11.4.14 Daten schreiben | 696 |
11.5 Abschließende Hinweise | 697 |
11.5.1 Synchronisieren | 697 |
11.5.2 Performance-Tipps | 698 |
11.5.3 Die Firewall per T-SQL konfigurieren | 698 |
11.5.4 Arbeiten mit sqlcmd | 700 |
11.6 Fazit | 700 |
12 Zugriff auf SQLite | 702 |
12.1 Was eigentlich ist SQLite? | 703 |
12.1.1 Vorteile | 703 |
12.1.2 Nachteile | 704 |
12.2 Vorbereitungen | 704 |
12.2.1 Download/Installation des ODBC-Treibers | 705 |
12.2.2 Download/Installation SQLite for Excel | 706 |
12.3 Datenbank-Tools | 707 |
12.3.1 Database .NET | 707 |
12.3.2 SQLite Administrator | 709 |
12.4 Praktische Aufgabenstellungen | 710 |
12.4.1 Einbinden von SQLite-Tabellen per Assistent | 710 |
12.4.2 Einbinden von SQLite-Tabellen per VBA-Code | 711 |
12.4.3 Datenbank per Code erstellen | 712 |
12.4.4 Tabellen erzeugen | 713 |
12.4.5 Datenbankzugriff per ADO realisieren | 715 |
12.4.6 Die Bedeutung von Transaktionen bei SQLite | 716 |
12.4.7 SOUNDEX verwenden | 717 |
12.4.8 Volltextabfragen realisieren | 718 |
12.5 Praxisbeispiele | 721 |
12.5.1 Verwenden der Volltextsuche | 721 |
12.5.2 Implementieren der Klasse SQLiteDatabase | 726 |
12.5.3 Verwenden der Klasse SQLiteDatabase | 736 |
12.6 Tipps & Tricks | 738 |
12.6.1 Für Liebhaber der Kommandozeile – Sqlite3.exe | 738 |
12.6.2 Eine SQLite-Datenbank reparieren | 740 |
12.6.3 Eine Beispieldatenbank herunterladen | 741 |
12.6.4 Testen ob Tabelle vorhanden ist | 741 |
12.6.5 Die Datenbank defragmentieren | 741 |
12.6.6 Mehrere Datenbanken verknüpfen | 742 |
12.6.7 Eine Abfrage/Tabelle kopieren | 742 |
12.6.8 Ein Backup implementieren | 743 |
12.6.9 Tabellen zwischen Datenbanken kopieren | 743 |
12.6.10 Ersatz für TOP | 743 |
12.6.11 Metadaten auswerten | 744 |
12.6.12 Timestamp als Defaultwert verwenden | 745 |
12.6.13 Export in XML-Format | 746 |
12.7 Fazit | 746 |
13 Dateien und Verzeichnisse | 750 |
13.1 Allgemeines | 750 |
13.1.1 ANSI/ASCII/Unicode | 750 |
13.1.2 Gemeinsamer Dateizugriff | 751 |
13.1.3 Verwenden der File System Objects | 751 |
13.2 Zugriff auf das Dateisystem | 753 |
13.2.1 Ermitteln aller Laufwerke und deren Eigenschaften | 753 |
13.2.2 Ermitteln aller Verzeichnis-Eigenschaften | 754 |
13.2.3 Auflisten aller Unterverzeichnisse eines Folders | 755 |
13.2.4 Rekursiv alle Unterverzeichnisse auflisten | 756 |
13.2.5 Ein Verzeichnis erzeugen | 757 |
13.2.6 Das Datenbankverzeichnis bestimmen | 758 |
13.2.7 Abfragen des Temp-/System/...-Verzeichnisses | 758 |
13.2.8 Prüfen, ob eine Datei existiert | 759 |
13.2.9 Verzeichnisse/Dateien kopieren/löschen | 760 |
13.2.10 Auflisten aller Dateien eines Verzeichnisses | 760 |
13.2.11 Name, Pfad und Extension einer Datei ermitteln | 761 |
13.2.12 Einen Tempfile-Namen erzeugen | 763 |
13.3 Textdateien | 763 |
13.3.1 Klassischer Zugriff auf Textdateien | 764 |
13.3.2 Zugriff auf Textdateien mit den File System Objects | 766 |
13.4 Typisierte Dateien | 769 |
13.4.1 Öffnen | 769 |
13.4.2 Lesen/Schreiben | 769 |
13.5 Weitere Dateien | 771 |
13.5.1 Binärdateien | 771 |
13.5.2 INI-Dateien | 772 |
13.6 Die Registrierdatenbank | 774 |
13.6.1 Einführung | 774 |
13.6.2 API/VBA-Zugriff auf die Registrierungsdatenbank | 775 |
13.6.3 API-Konstanten/Funktionen für den Registry-Zugriff | 776 |
13.6.4 Prüfen, ob ein Schlüssel existiert | 778 |
13.6.5 Einen vorhandenen Wert auslesen | 778 |
13.6.6 Einen Schlüssel erstellen | 779 |
13.6.7 Einen Wert setzen bzw. ändern | 780 |
13.6.8 Einen Schlüssel löschen | 780 |
13.6.9 Ein Feld löschen | 780 |
13.6.10 Aufruf der Funktionen | 781 |
13.7 Dateidialoge | 783 |
13.7.1 Variante 1 (Office 16 Library) | 784 |
13.7.2 Variante 2 (Windows-API) | 786 |
13.7.3 Verzeichnisdialog (Windows-API) | 791 |
13.8 Übersichten | 793 |
13.8.1 Dateifunktionen in Access | 793 |
13.8.2 FSO-Eigenschaften und -Methoden | 794 |
13.9 Praxisbeispiele | 795 |
13.9.1 Auf eine Textdatei zugreifen | 795 |
13.9.2 Dateien suchen | 800 |
13.9.3 Die Shellfunktionen verwenden | 802 |
13.9.4 Einen Verzeichnisbaum in eine TreeView einlesen | 807 |
14 XML in Theorie und Praxis | 808 |
14.1 XML – etwas Theorie | 808 |
14.1.1 Allgemeines | 808 |
14.1.2 Der XML-Grundaufbau | 811 |
14.1.3 Wohlgeformte Dokumente | 812 |
14.1.4 Processing Instructions (PI) | 814 |
14.1.5 Elemente und Attribute | 815 |
14.1.6 Verwendbare Zeichensätze | 816 |
14.2 XSD-Schemas | 818 |
14.2.1 Das Grundprinzip | 818 |
14.2.2 Ein XSD-Schema mit Microsoft Access erzeugen | 820 |
14.3 XML-Verarbeitung mit dem DOM | 824 |
14.3.1 Was ist das DOM? | 824 |
14.3.2 Erste Schritte | 825 |
14.3.3 Erzeugen von Instanzen | 826 |
14.3.4 Laden von Dokumenten | 827 |
14.3.5 XML-Fehlerprüfung/-Analyse | 828 |
14.3.6 Erzeugen von XML-Dokumenten | 830 |
14.3.7 Auslesen von XML-Dateien | 832 |
14.3.8 Einfügen von Informationen | 835 |
14.3.9 Attribute oder Element | 838 |
14.3.10 Suchen in den Baumzweigen | 841 |
14.3.11 Das Interpretieren von Leerzeichen | 844 |
14.4 XML-Integration in Access | 847 |
14.4.1 Importieren | 847 |
14.4.2 Exportieren | 850 |
14.4.3 XML-Transformation mit XSLT | 854 |
14.4.4 Application-Objekt (ImportXML/ExportXML) | 857 |
14.4.5 ADO-Recordset | 860 |
14.5 Vor- und Nachteile von XML | 862 |
14.5.1 Grundsätzlicher Vergleich | 863 |
14.5.2 Zeitvergleich ADO/XML | 863 |
14.6 Praxisbeispiele | 865 |
14.6.1 Speichern im UTF-8-/UTF-16-Format | 865 |
14.6.2 UTF-8-/UTF-16 aus einem ADO-Stream laden | 867 |
14.6.3 XML-Daten asynchron verarbeiten | 869 |
14.6.4 XML-Daten in einer TreeView darstellen | 871 |
14.6.5 Navigieren zwischen einzelnen XML-Baumknoten | 874 |
14.6.6 ADO-XML-Streams nachbearbeiten | 877 |
14.6.7 Textdaten in XML-Dokumente umwandeln | 880 |
15 SQL im Einsatz | 882 |
15.1 Einführung | 882 |
15.1.1 SQL-Dialekte | 883 |
15.1.2 Kategorien von SQL-Anweisungen | 883 |
15.2 Etwas (Datenbank-)Theorie | 885 |
15.2.1 Allgemeines/Begriffe | 885 |
15.2.2 Normalisieren von Tabellen | 890 |
15.2.3 Beziehungen zwischen den Tabellen | 895 |
15.2.4 Verknüpfen von Tabellen | 897 |
15.3 Testprogramm und Beispieldatenbank | 901 |
15.3.1 Hinweise zur Bedienung | 901 |
15.3.2 Die Beispieldatenbank im Überblick | 901 |
15.3.3 ADO Query | 902 |
15.3.4 Bemerkungen | 903 |
15.4 Daten abfragen | 904 |
15.4.1 Abfragen mit SELECT | 905 |
15.4.2 Alle Spalten auswählen | 905 |
15.4.3 Auswahl der Spalten | 906 |
15.4.4 Filtern | 907 |
15.4.5 Beschränken der Ergebnismenge | 913 |
15.4.6 Eindeutige Records/doppelte Datensätze | 914 |
15.4.7 Tabellen verknüpfen | 915 |
15.4.8 Tabellen vereinigen | 918 |
15.4.9 Datensätze sortieren | 919 |
15.4.10 Datensätze gruppieren | 919 |
15.4.11 Unterabfragen | 921 |
15.4.12 Anlage-Felder mit SQL verwalten | 925 |
15.4.13 History-Felder mit SQL abfragen | 927 |
15.4.14 Mehrwertige Felder mit SQL abfragen | 929 |
15.5 Daten manipulieren | 930 |
15.5.1 Einfügen einzelner Datensätze | 931 |
15.5.2 Einfügen von Abfragedaten | 932 |
15.5.3 Exportieren/Importieren von Abfragedaten | 934 |
15.5.4 Aktualisieren/Ändern | 936 |
15.5.5 Löschen | 937 |
15.6 Erweiterte SQL-Funktionen | 938 |
15.6.1 Berechnete/Formatierte Spalten | 939 |
15.6.2 Berechnungsfunktionen | 945 |
15.6.3 NULL-Werte | 946 |
15.6.4 Datum und Zeit in SQL-Abfragen | 948 |
15.6.5 Datentypumwandlungen | 953 |
15.6.6 Kreuztabellenabfragen | 954 |
15.6.7 Steuerelemente in Abfragen verwenden | 957 |
15.6.8 Globale Variablen in Abfragen verwenden | 958 |
15.7 Datenbankverwaltung mit SQL (DDL) | 958 |
15.7.1 Datenbanken | 959 |
15.7.2 Tabellen | 959 |
15.7.3 Indizes | 960 |
15.7.4 Tabellen/Indizes löschen oder verändern | 963 |
15.7.5 Sichten (Views) | 963 |
15.7.6 Nutzer- und Rechteverwaltung | 965 |
15.7.7 Transaktionen | 965 |
15.8 SQL in der Access-Praxis | 966 |
15.8.1 SQL in Abfragen | 966 |
15.8.2 SQL im Basic-Code | 967 |
15.8.3 SQL beim Oberflächenentwurf | 969 |
15.8.4 VBA-Funktionen in SQL-Anweisungen | 969 |
15.9 Tipps & Tricks | 971 |
15.9.1 Wie kann ich die Anzahl der Datensätze ermitteln? | 971 |
15.9.2 Wie nutze ich Datumsteile in SQL zur Suche? | 972 |
15.9.3 Die Groß-/Kleinschreibung berücksichtigen | 972 |
15.9.4 Warum erhalte ich zu viele Datensätze ? | 973 |
15.9.5 Doppelte Datensätze aus einer Tabelle löschen | 974 |
15.10 Praxisbeispiele | 975 |
15.10.1 Ein komfortables SQL-Abfrageprogramm erstellen | 975 |
15.10.2 Datum und Zeit in SQL einbauen | 977 |
16 Anwendungsdesign | 980 |
16.1 Access-Oberflächengestaltung | 980 |
16.1.1 Beschriften der Kopfzeile | 981 |
16.1.2 Informationen in der Statuszeile anzeigen | 983 |
16.1.3 Fortschrittsanzeige mit dem Progressbar realisieren | 984 |
16.1.4 Navigationsbereich konfigurieren | 985 |
16.1.5 Access-Hauptfenster komplett ausblenden | 991 |
16.2 Steuern der Anwendung | 994 |
16.2.1 Autostart mit AutoExec-Makro | 994 |
16.2.2 Formulare automatisch starten | 996 |
16.2.3 Warten auf das Ende | 996 |
16.2.4 Access per VBA beenden | 997 |
16.2.5 Den Runtime-Modus aktivieren | 997 |
16.2.6 Befehlszeilen-Optionen verwenden | 998 |
16.3 Entwickeln von Assistenten und Add-Ins | 1000 |
16.3.1 Assistenten-Typen | 1000 |
16.3.2 Einbinden der Assistenten in die Access-IDE | 1000 |
16.3.3 Menü-Assistent (Beispiel) | 1002 |
16.3.4 Objekt-Assistent (Beispiel) | 1004 |
16.3.5 Steuerelemente-Assistent (Beispiel) | 1008 |
16.3.6 Eigenschaften-Assistent | 1011 |
16.4 Entwickeln/Einbinden von Managed Add-Ins | 1012 |
16.4.1 Interaktion Anwendung/Add-In | 1012 |
16.4.2 Entwurf des Add-Ins | 1013 |
16.4.3 Oberfläche | 1015 |
16.4.4 Der Quellcode des Add-Ins | 1016 |
16.4.5 Formularentwurf für das Add-In | 1018 |
16.4.6 Kompilieren und Einbinden | 1018 |
16.4.7 Testen | 1019 |
16.5 Libraries unter Access | 1020 |
16.5.1 Erstellen und Einbinden | 1020 |
16.5.2 Debugging | 1021 |
16.5.3 Einfaches Beispiel | 1022 |
16.5.4 Hinweise | 1024 |
16.6 Praxisbeispiele | 1025 |
16.6.1 Mehr über die aktuelle Access-Version erfahren | 1025 |
16.6.2 Access neu starten/Datenbank neu laden | 1026 |
16.6.3 Mit Reference-Objekten arbeiten | 1027 |
16.6.4 Benutzerdefinierte Eigenschaften einsetzen | 1031 |
16.6.5 Den aktuellen Datenbanknutzer ermitteln | 1035 |
16.6.6 Überlappende Fenster einstellen | 1035 |
16.6.7 Access-Optionen abrufen/setzen | 1036 |
17 Menüband und Backstage | 1038 |
17.1 Allgemeine Grundlagen | 1038 |
17.1.1 Manuelle Konfigurationsmöglichkeiten | 1039 |
17.1.2 Grundprinzip der Programmierung | 1040 |
17.1.3 Verwenden der Tabelle USysRibbons | 1042 |
17.1.4 Application.LoadCustomUI als Alternative | 1043 |
17.2 Ein kleines Testprogramm | 1043 |
17.3 Praktische Aufgabenstellungen | 1045 |
17.3.1 Infos über Steuerelemente und Symbole erhalten | 1045 |
17.3.2 Hauptregisterkarten ausblenden | 1047 |
17.3.3 Einzelne Registerkarten ausblenden | 1048 |
17.3.4 Einzelne Gruppen ausblenden | 1049 |
17.3.5 Registerkarten, Gruppen und Schaltflächen einfügen | 1050 |
17.3.6 Ereignisbehandlung mit VBA-Code/Makros | 1052 |
17.3.7 Verändern von Eigenschaften mit VBA-Callbacks | 1053 |
17.3.8 Aktualisieren des Menübands per VBA-Code | 1053 |
17.3.9 Kontextabhängige Registerkarten | 1054 |
17.3.10 Registerkarten per VBA aktivieren | 1055 |
17.3.11 Fehlermeldungen des Menübands anzeigen | 1056 |
17.3.12 Vorhandene Funktionen des Menübands ändern | 1056 |
17.3.13 Die Schnellzugriffsleiste erweitern/programmieren | 1057 |
17.4 Übersicht der Steuerelemente | 1058 |
17.4.1 labelControl-Steuerelement | 1058 |
17.4.2 Steuerelement | 1058 |
17.4.3 Steuerelement | 1062 |
17.4.4 toggleButton-Steuerelement | 1063 |
17.4.5 buttonGroup-Steuerelement | 1064 |
17.4.6 checkBox-Steuerelement | 1065 |
17.4.7 editBox-Steuerelement | 1066 |
17.4.8 Steuerelement | 1067 |
17.4.9 dropDownElement-Steuerelement | 1071 |
17.4.10 gallery-Steuerelement | 1074 |
17.4.11 menu-Steuerelement | 1076 |
17.4.12 splitButton-Steuerelement | 1079 |
17.4.13 dialogBoxLauncher | 1080 |
17.5 Die Backstage-Ansicht anpassen | 1082 |
17.5.1 Die Standardansicht verändern | 1083 |
17.5.2 Die drei möglichen Layouts für Registerkarten | 1085 |
17.5.3 Die neuen Möglichkeiten von Gruppen | 1092 |
17.5.4 Verwenden von LayoutContainern | 1094 |
17.5.5 Das Verhalten der Schaltflächen beeinflussen | 1095 |
17.5.6 Mit VBA/Makros auf Ereignisse reagieren | 1096 |
17.6 Tipps & Tricks | 1097 |
17.6.1 Die guten alten Access 2003-Menüs anzeigen | 1097 |
17.6.2 Das Office-Menü für Access 2007 anpassen | 1099 |
17.6.3 XML-Daten komfortabel editieren | 1100 |
17.6.4 Arbeiten mit dem RibbonCreator | 1101 |
17.7 Übersichten | 1102 |
18 Programmschnittstellen | 1104 |
18.1 Zwischenablage | 1104 |
18.1.1 Kopieren/Einfügen mittels DoCmd-Objekt | 1104 |
18.1.2 Ein Clipboard-Objekt programmieren | 1105 |
18.2 API- und DLL-Einbindung | 1108 |
18.2.1 Allgemeines | 1108 |
18.2.2 Und was ist mit der 64-Bit Access Version? | 1109 |
18.2.3 Woher bekomme ich Infos über die Win32-API? | 1111 |
18.2.4 Einbinden der Deklaration | 1112 |
18.2.5 Wert oder Zeiger? | 1114 |
18.2.6 Übergabe von Strings | 1115 |
18.2.7 Verwenden von As Any | 1116 |
18.2.8 Übergabe von Arrays | 1116 |
18.2.9 Besonderheiten mit Records | 1117 |
18.2.10 Zuordnen der Datentypen | 1119 |
18.3 OLE/ActiveX | 1120 |
18.3.1 Überblick | 1120 |
18.3.2 OLE | 1121 |
18.3.3 Übersicht zum Objektfeld-Steuerelement | 1122 |
18.3.4 Programmieren mit dem Objektfeld | 1125 |
18.3.5 ActiveX-Code-Komponenten (OLE-Automation) | 1128 |
18.3.6 Programmieren mit ActiveX-Code-Komponenten | 1129 |
18.4 DDE | 1131 |
18.4.1 Funktionsprinzip | 1131 |
18.4.2 Verwenden von Steuerelementen | 1132 |
18.4.3 VBA-Programmierung | 1133 |
18.5 Scanner-Unterstützung per WIA | 1135 |
18.5.1 Was kann WIA? | 1135 |
18.5.2 Installation/Vorbereitung | 1135 |
18.5.3 Einstieg mit kleiner Beispielanwendung | 1136 |
18.5.4 Reagieren auf das Verbinden/Trennen von Geräten | 1137 |
18.5.5 Ermitteln der verfügbaren Geräte | 1138 |
18.5.6 Anzeige der Geräteeigenschaften | 1138 |
18.5.7 Ein Bild einlesen | 1140 |
18.5.8 Bild(er) drucken (Assistent) | 1141 |
18.5.9 Den Scanner-Assistent aufrufen | 1142 |
18.5.10 Grafikbearbeitung | 1143 |
18.6 Zugriff auf Excel-Arbeitsmappen | 1145 |
18.6.1 Zugriffsmöglichkeiten | 1145 |
18.6.2 TransferSpreadsheet | 1146 |
18.6.3 Import/Export per DAO | 1150 |
18.6.4 Daten auslesen | 1154 |
18.6.5 Zugriff auf Tabellenbereiche | 1156 |
18.6.6 OLE-Automation | 1157 |
18.7 Praxisbeispiele | 1160 |
18.7.1 Eine externe Anwendung starten | 1160 |
18.7.2 Informationen über das aktuelle System ermitteln | 1162 |
18.7.3 Das aktuelle Betriebssystem ermitteln | 1165 |
18.7.4 Den Windows-Lizenznehmer ermitteln | 1168 |
18.7.5 Zeitmessungen in Access durchführen | 1170 |
18.7.6 Microsoft Word über ActiveX steuern | 1174 |
18.7.7 Microsoft Excel über ActiveX steuern | 1178 |
Index | 1180 |