VBA Basics: Nz, IIf, Switch und Choose

Mit If…Then und Select Case entscheiden wir, welche Anweisungen VBA ausführt. Oft brauchen wir aber einen Wert, der von einer Bedingung abhängt, etwa einen Rabattsatz oder die Vorgabe für ein leeres Feld. Dafür stehen die Funktionen Nz, IIf, Switch und Choose zur Verfügung. Sie werten alle Parameter aus und liefern in bestimmten Fällen Null, was zu Fehlern führen kann. Wie die Funktionen arbeiten und wann wir besser If…Then verwenden, liest Du in diesem Artikel.

Weiterlesen

VBA Basics: Auflistungen mit Collections

Arrays haben eine feste Grösse – oder müssen mit ReDim Preserve umständlich vergrössert werden. Sobald wir eine Liste brauchen, die während der Laufzeit wächst und schrumpft, ist die Collection das Mittel der Wahl. Sie gehört zur VBA-Laufzeitbibliothek, steht ohne zusätzlichen Verweis in jedem Projekt zur Verfügung und lässt sich mit For Each durchlaufen. Dieser Beitrag zeigt, was die Collection kann, wo ihre Grenzen liegen und wie wir sie in der Praxis einsetzen.

Weiterlesen

SQL Server: datetime und datetime2 in Access

Wir verknüpfen eine Tabelle des SQL Servers mit Access, öffnen den Direktbereich und lesen mit DLookup ein Datum aus der ersten Zeile. Bei einem Feld liefert der Aufruf den Wert, bei einem anderen scheitert derselbe Aufruf mit der Meldung Typen unverträglich. Beide Felder enthalten ein Datum mit Uhrzeit. Der Unterschied liegt im Datentyp: Der SQL Server kennt mehrere Datentypen für Datum und Uhrzeit, und Access bindet sie je nach Einstellung unterschiedlich ein. Welche Konstellationen ohne Probleme laufen, welche Fehler auftreten und wie wir die Anbindung einrichten, zeigt dieser Beitrag.

Weiterlesen

SQL Server: PDFs in varbinary(max)-Feld speichern

Rechnungen, Angebote und Lieferscheine liegen als PDF-Dateien auf einem Netzlaufwerk, während in der Datenbank nur der Pfad zur Datei steht. Wird eine Datei verschoben, umbenannt oder gelöscht, verweist der Pfad auf keine Datei mehr. Auch ein Backup der Datenbank enthält die Dokumente nicht. Der SQL Server kann die Dateien dagegen in der Datenbank speichern. Dafür nimmt der Datentyp varbinary(max) Binärdaten bis zu einer Größe von knapp 2 Gigabyte auf, auch ein PDF-Dokument. In diesem Beitrag zeigen wir, wie wir ein PDF-Dokument mit ADODB in ein Feld dieses Datentyps schreiben, wieder in eine Datei auf der Festplatte speichern und in einem Access-Formular im Edge-Steuerelement anzeigen.

Weiterlesen

T-SQL, Teil 2: SELECT in der Praxis

Die Montagsauswertung für den Vertrieb entsteht in Access im Abfrageentwurf: Positionen, Kunden, Umsätze und einige Gruppierungen. Zieht das Backend auf den SQL Server um, laufen Teile davon nicht mehr oder liefern in unserer Konfiguration andere Zahlen. Ein TOP 1 liefert dann eine Zeile statt zweier, ein Durchschnitt verliert seine Nachkommastellen, und eine Summe kommt als Text in Access an. Wer SELECT in T-SQL schreibt, kennt viel davon aus Access. Umdenken müssen wir an einigen Stellen, und einige davon zeigen keine Fehlermeldung, sondern nur andere Ergebnisse. Wie wir die Abfragen schreiben, die im Alltag gebraucht werden, und worauf wir dabei achten, zeigt dieser zweite Teil der Reihe.

Weiterlesen

T-SQL, Teil 1: Von Jet-SQL zu T-SQL

Die Abfrage läuft in Access seit Jahren fehlerfrei – bis die Tabellen auf den SQL Server umziehen. Plötzlich liefert Format im Gruppierungsausdruck eine Fehlermeldung, Like „M*“ findet keinen einzigen Datensatz, und ein Aufruf von Nz endet mit der Meldung, der Server kenne diese Funktion nicht. Wer Access mit einem SQL Server als Backend betreibt, kommt früher oder später nicht mehr um T-SQL herum, die Abfragesprache des Servers. Was sich dabei gegenüber dem SQL von Access ändert und wie wir T-SQL aus Access und aus VBA heraus ausführen, zeigt der erste Teil dieser Reihe.

Weiterlesen

Select Case in der Praxis

Wer VBA-Bedingungen schreibt, greift fast automatisch zu If…Then…ElseIf. Das funktioniert, wird aber bei mehr als zwei, drei Zweigen schnell unübersichtlich – und fehleranfällig, weil jede Zeile den Prüfausdruck wiederholt. Select Case ist die Alternative: kompakter, lesbarer und in vielen Fällen auch schneller. Dieser Beitrag zeigt die Grundform, alle Varianten der Case-Klausel und drei Praxismuster, die über das hinausgehen, was die meisten VBA-Entwickler kennen.

Weiterlesen

VBA Basics: Auflistungen mit Collections

Arrays haben eine feste Grösse – oder müssen mit ReDim Preserve umständlich vergrössert werden. Sobald wir eine Liste brauchen, die während der Laufzeit wächst und schrumpft, ist die Collection das Mittel der Wahl. Sie gehört zur VBA-Laufzeitbibliothek, steht ohne zusätzlichen Verweis in jedem Projekt zur Verfügung und lässt sich mit For Each durchlaufen. Dieser Beitrag zeigt, was die Collection kann, wo ihre Grenzen liegen und wie wir sie in der Praxis einsetzen.

Weiterlesen

VBA Basics: Strings und Stringfunktionen

Kaum eine VBA-Prozedur kommt ohne Zeichenketten aus. Wir zerlegen Dateinamen, setzen SQL-Anweisungen zusammen, bereinigen Importdaten oder formatieren Ausgaben – und greifen dabei ständig zu Left, Mid, InStr und Replace. Trotzdem wurden diese Funktionen in unserer VBA-Reihe bisher nie vollständig vorgestellt. Das holen wir hier nach: zuerst eine kompakte Übersicht aller Stringfunktionen, dann praxisnahe Lösungen für typische Aufgaben – vom CSV-Parsing über Pattern-Matching bis zur sicheren Zusammensetzung von SQL-Strings. Die VBA-Grundlagen setzen wir voraus; hier geht es um Techniken, die aus fragilen Einzeilern robuste Lösungen machen.

Weiterlesen

Datenbank-Zeitreisen: Temporal Tables im SQL Server

Wer hat den Preis geändert, und wie hoch war er eigentlich vor drei Wochen? Wann ist dieser Datensatz gelöscht worden, und wie sah er kurz davor aus? Sobald eine Datenbank produktiv läuft, tauchen solche Fragen auf – und oft steht man mit leeren Händen da, weil die alten Werte längst überschrieben sind. Der klassische Ausweg ist eine selbstgebaute Historientabelle samt Triggern, die bei jedem INSERT, UPDATE und DELETE die alte Zeile wegschreiben. Das funktioniert, ist aber Handarbeit. Der SQL Server bringt seit der Version 2016 eine eingebaute Lösung mit: System-Versioned Temporal Tables. Die Datenbank führt die komplette Änderungshistorie vollautomatisch mit, und Abfragen zu einem beliebigen Zeitpunkt der Vergangenheit sind eine Zeile Zusatz-SQL. Wie das gelingt, wie und wo die alten Daten landen und wie Du eine bestehende Tabelle nachträglich versionierst, liest Du in diesem Beitrag – und auch, was Temporal Tables nicht können.

Weiterlesen