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 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. Der erste Teil dieser Reihe zeigt, wo sich T-SQL von dem SQL unterscheidet, das wir aus Access kennen, und wie wir T-SQL direkt aus Access heraus ausführen.

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

Timer() – Performance-Messungen in VBA

Wer VBA-Code optimieren möchte, braucht eine zuverlässige Methode zur Zeitmessung. Die VBA-Funktion Timer() liefert die verstrichenen Sekunden seit Mitternacht – und damit ein einfaches, aber wirkungsvolles Werkzeug, um die Laufzeit von Prozeduren zu messen und verschiedene Implementierungen zu vergleichen. In diesem Artikel zeigen wir, wie Du Timer() gezielt einsetzt und die Ergebnisse sinnvoll auswertest.

Weiterlesen

VBA Basics: Auflistungen mit Dictionarys

Im Artikel “VBA Basics: Auflistungen mit Collections” (www.vbentwickler.de/514) haben wir die Collection kennengelernt – eine einfache, geordnete Liste ohne Verweis. Ihr grösstes Manko: Es gibt keine Möglichkeit zu prüfen, ob ein Schlüssel existiert. Genau hier setzt das Dictionary aus der Microsoft Scripting Runtime an. Es bietet Exists, erlaubt das direkte Ändern von Werten und liefert Schlüssel und Werte als Array – damit ist es die erste Wahl für Duplikatprüfungen, Häufigkeitszählungen und Lookup-Tabellen im Speicher. Wie wir es einrichten, was es kann und wo Stolpersteine lauern, zeigt dieser Beitrag.

Weiterlesen

Fehlerbehandlung in VBA: Patterns für die Praxis

Eine Prozedur, die monatelang unauffällig ihren Dienst getan hat, bricht plötzlich mit einer kryptischen Meldung ab – und der Anwender steht vor einem Dialog, mit dem er nichts anfangen kann. Der Grund ist fast immer derselbe: Es gibt keine oder nur eine halbherzige Fehlerbehandlung. Dabei ist “On Error” eines der mächtigsten Werkzeuge in VBA, wenn man weiß, wie man es einsetzt. Wir schauen uns die Muster an, die aus einer fragilen Lösung eine robuste machen: wie wir Fehler nicht nur abfangen, sondern strukturiert behandeln, Ressourcen zuverlässig freigeben, Fehler zwischen den Schichten einer Anwendung weiterreichen und sie in einer Tabelle protokollieren. Die Beispiele findest Du im Modul “mdlFehlerbehandlung” der Beispieldatenbank. Wie das im Einzelnen gelingt, zeigt der vorliegende Beitrag.

Weiterlesen

ADODB: Formulare mit gespeicherten Prozeduren

Access-Formulare leben traditionell von ihrer Datensatzquelle. Du weist dem Formular eine Tabelle oder eine Abfrage zu, und Access kümmert sich um alles Weitere – Navigieren, Bearbeiten, Speichern, Löschen. Das funktioniert hervorragend, solange die Daten in einer Access-Datenbank oder in verknüpften Tabellen liegen. Arbeitest Du jedoch mit einem SQL Server und möchtest den Datenzugriff ausschließlich über gespeicherte Prozeduren abwickeln – etwa, weil Du die Datenbanklogik serverseitig kapseln, Berechtigungen feingranular steuern oder die Performance optimieren willst -, stößt dieses Modell an seine Grenzen. Gespeicherte Prozeduren lassen sich nicht als Datensatzquelle eines Formulars zuweisen, und die klassischen Access-Mechanismen zum Speichern greifen nicht. In diesem Artikel zeigen wir Dir, wie Du ein vollständiges CRUD-Formular mit Übersicht und Detailansicht baust, das komplett ohne Datensatzquelle auskommt. Stattdessen füllen wir die Unterformular-Recordsets und die Detailfelder zur Laufzeit mit dem Ergebnis gespeicherter Prozeduren, die wir über den Wrapper aus dem Artikel “ADODB: Gespeicherte Prozeduren einfach aufrufen” (www.vbentwickler.de/505) aufrufen. Das Ergebnis ist eine Formularoberfläche, die sich vom Benutzer aus anfühlt wie ein klassisches Access-Formular, intern aber ausschließlich mit serverseitigen Prozeduren kommuniziert.

Weiterlesen