Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Tabelle mit Dezimalfeld erstellen

Begonnen von risingstar, Januar 02, 2025, 17:13:46

⏪ vorheriges - nächstes ⏩

risingstar

Guten Abend,
mit VBA Code soll eine neue Tabelle erstellt werden. Dabei soll das Feld Stand fom Typ Dezimal sein. Ohne dieses Feld wird die Tabelle erstellt. Mit diesem Feld passiert nichts.

dbs.Execute "CREATE TABLE [Zählerstand 2030] ([Zählerstand-ID] COUNTER PRIMARY KEY, [Zähler-ID] LONG, [Messvariante-ID] LONG, Ablesedatum DATE, Stand DECIMAL(18,3));"

LG Friedrich

Claypool

Hallo,

verwende currentproject.Connection.Execute statt dbs.Execute. DAO unterstützt keine DECIMAL und GUID Datentypen. Siehe auch https://learn.microsoft.com/de-de/office/client-developer/access/desktop-database-reference/create-table-statement-microsoft-access-sql letztes Beispiel.

Grüße
Ingo

Knobbi38

DAO unterstützt in DDL Anweisungen die Datentypen DECIMAL und GUID nicht. Stattdessen kann dafür ADO verwendet werden.

Siehe Beispiel 6:
https://learn.microsoft.com/de-de/office/client-developer/access/desktop-database-reference/create-table-statement-microsoft-access-sql

Knobbi38


Nachtrag:
Ingo war etwas schneller

risingstar

Danke euch beiden für die Hinweise.

Mit currentproject.Connection.Execute wird eine Tabelle in der FE-DB erstellt. Die Tabelle soll in der BE-DB erstellt werden und da happerts wieder. Bei der Dim Zeile kommt schon die Fehlermeldung "Benutzerdefinierter Typ nicht definiert". Lasse ich die Dim Zeile weg, passiert nichts. Ich muss zugeben, dass ich Probleme mit den Begriffen DAO Und ADODB habe.

Dim con As ADODB.Connection
Set dbs = OpenDatabase("Z:\Access Tabellen\Betriebsdaten Tabellen 2024.accdb")
Set con = dbs.Connection

'CurrentProject.Connection
con.Execute "CREATE TABLE [Zählerstand 2030] ([Zählerstand-ID] COUNTER PRIMARY KEY, [Zähler-ID] LONG, [Messvariante-ID] LONG, Ablesedatum DATE, Stand DECIMAL(18,3));"

LG Friedrich

Bitsqueezer

Hallo Friedrich,

DAO bezieht sich auf die Access-eigene JET/ACE-Engine und "kann alles, was Access kann", um es einfach zu formulieren, also bezogen auf Datenbankobjekte.

ADO ist nicht von Access abhängig, kann sozusagen in jeder Programmiersprache verwendet werden und benötigt einen Connectionstring zur Zieldatenbank, arbeitet dann mit dem SQL der Zieldatenbank. Wenn Du also mit einem SQL Server verbindest, mit T-SQL, wenn Du mit einem Access-Backend arbeitest, mit Access SQL usw. Entsprechend kann man hier alles nutzen, was die Zieldatenbank zur Verfügung stellt.

"CurrentProject.Connection" ist ein Relikt aus der Zeit bis A2010, wo es noch ADPs gab. Hier wird per Default die Verbindung zum Backend-SQL-Server hinterlegt. Im Fall einer Access-Datenbank steht wird hier (immer, automatisch) die ADO-Verbindung zu der aktuellen Datenbank hinterlegt. Eine automatische Connection auf ein Backend gibt es natürlich nicht, da Du das Frontend ja theoretisch mit x Backends verbinden kannst.

Das heißt: Für ein Backend mußt Du selbst einen Connectionstring erstellen, ein ADO-Connectionobjekt und dann die Verbindung mit Open öffnen. Die Auswahl findest Du hier: https://www.connectionstrings.com/access/

Für das Dim mußt Du natürlich die Referenz auf die ADO-Library (aktuell: 6.x) in den Optionen von VBA einrichten. Möglichst die Objekte IMMER so referenzieren, also auch bei DAO immer ein "DAO.Recordset", um Namenskonflikte zu vermeiden.

Gruß

Christian

PS: Decimal-Felder kann man in VBA nur mit Variant-Variablen verarbeiten.
PPS: Du machst schon irgendwas falsch, wenn Du je Jahr eine Tabelle einrichtest. Das gehört alles in eine Tabelle mit dem Jahr als Feld. Das Erstellen von Tabellen per Code ist i.d.R. nicht notwendig.

risingstar

Danke Christian für Deine Erklärung. Die Sache mit dem Jahr ist richtig und ich habe das geändert. Dadurch brauche ich die Tabellenerstellung nicht mehr.

MzKlMu

Hallo,
oftmals ist auch ein extra Feld für das Jahr überflüssig, weil sich das Jahr aus einem Datum ableiten lässt.
Gruß Klaus