Hallo Wissende,
in meinem Access-Projekt gibt es sechs grundlegende, optimal nomalisierte Tabellen, mit denen der Anwender arbeitet (Filter, Abfragen etc.)
Die zugrundeliegenden Daten ändern sich wöchentlich. Auf Knopfdruck "Update" läuft ein VBA-Code los und
- lädt aus dem Netz diverse txt-Dateien herunter
- diese werden im Originalzustand mittels Transfertext in Dateien eingelesen, die ich mit tmp kennzeichne
- mittels SQL-Befehlen im VBA werden dann die Daten angepasst und mittels INSERT-INTO in die "Haupttabellen" (die also immer bestehen) eingefügt. (Diese werden natürlich vorher geleert)
- Die temporären Tabellen werden danach geDROPt.
- Die Option "beim Schließen komprimieren" ist aktiv, sodass beim Schließen aufgeräumt wird.
Allerdings erst dann... Trotz des DROP ist die accdb noch riesengroß und wenn der Anwender nach dem Update direkt weiterarbeitet, ist es schwerfällig (mein Eindruck). Natürlich könnte man sagen "nach dem Update schließen, Komprimierung abwarten und wieder öffnen", aber ich suche nach einer charmanteren Lösung.
Ich habe die Option "temporäre Tabellen" gefunden, was gut klingt. Dazu würde ich die temporäre Tabelle vorm Transfertext CREATEn, was eigentlich nicht nötig ist. Problem nur: Der Befehl (laut Syntax (https://support.microsoft.com/de-de/topic/create-table-anweisung-8d050d24-9bb3-46f1-ab5f-f8216d9e7b11))
DoCmd.RunSQL "CREATE TEMPORARY TABLE tbltest (testfeld INTEGER)"führt zu einem Syntax-Fehler bei der CREATE TABLE-Anweisung, der normale Weg
DoCmd.RunSQL "CREATE TABLE tbltest (testfeld INTEGER)"funktioniert jedoch einwandfrei.
Obwohl das Temporary in der Syntax ausdrücklich vorgegeben ist, wird er nicht akzeptiert. Was mache ich falsch? Gibt es vielleicht noch eine andere Lösung?
Vielen Dank
Hans-Jürgen
Hallo Hans-Jürgen,
CREATE TEMPORARY war mir bislang nicht bekannt, aber wie Du schon sagst, die Seite beschreibt es, aber viele solcher Kommandos wirken nicht für Access. Da Access ja auch mit nahezu allen externen Datenbanken arbeiten kann, würde ich vermuten, daß es nur dort funktioniert.
Innerhalb von Access ist es einfacher und erlaubt auch mehr einzustellen, eine TableDef zu verwenden, damit kann man Tabellen auch ohne CREATE TABLE erstellen und die zusätzlichen Properties können eingestellt werden.
Allerdings blähst Du so oder so damit die Datenbank immer auf, da ggf. viele Daten importiert werden und wiedr gelöscht werden, was erst bei einer Komprimierung wieder behoben wird. Darüber hinaus, je nach Größe Deiner Datenbank, ist möglicherweise kein Platz mehr für größere Imports.
1. Du kannst diesen Vorgang einfach in einer zweiten Access-Datei durchführen, die kann auch lokal sein, weil sie ja nur temporär benutzt wird. Die dort erstellte Tabelle verwendest Du dann in einer Abfrage in Deiner Hauptdatenbank, um sie entsprechend einzulesen (oder, wenn unbedingt erforderlich, mit einer VBA-Verarbeitung).
2. Statt TransferText könntest Du die Daten auch gleich mit einem ADO Stream als Ganzes in den Arbeitsspeicher laden und dann entsprechend mit VBA einlesen und verarbeiten. Das würde Dir u.a. auch erlauben, einen Progress-Balken anzuzeigen.
3. der optimalere Weg: Gleich weg von Access als Backend und einen DB-Server wie SQL Server verwenden, hier hat jede Serverinstanz eine Datenbank namens tempdb, die man für sowas nutzen kann und die der Server selbst verwaltet/bereinigt. Zum Einlesen von Textdateien gibt es hier auch viele Möglichkeiten.
Gruß
Christian
Hallo Christian,
wo, eine schnelle und extrem hilfreiche Antwort (auch wenn es mir "einfacher" natürlich lieber gewesen wäre...)
Ich werde nochmal in den "Schmerz" mit der aktuellen Version hineinhorchen und dann gegebenenfalls einen der drei Wege beschreiten. Vielen Dank nochmals!
Viele Grüße
Hans-Jürgen