Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: risingstar am Januar 02, 2025, 17:13:46

Titel: Tabelle mit Dezimalfeld erstellen
Beitrag von: risingstar am Januar 02, 2025, 17:13:46
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
Titel: Re: Tabelle mit Dezimalfeld erstellen
Beitrag von: Claypool am Januar 02, 2025, 21:46:26
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
Titel: Re: Tabelle mit Dezimalfeld erstellen
Beitrag von: Knobbi38 am Januar 02, 2025, 21:52:47
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 (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
Titel: Re: Tabelle mit Dezimalfeld erstellen
Beitrag von: risingstar am Januar 04, 2025, 15:23:07
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
Titel: Re: Tabelle mit Dezimalfeld erstellen
Beitrag von: Bitsqueezer am Januar 04, 2025, 15:53:41
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.
Titel: Re: Tabelle mit Dezimalfeld erstellen
Beitrag von: risingstar am Januar 11, 2025, 17:12:03
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.
Titel: Re: Tabelle mit Dezimalfeld erstellen
Beitrag von: MzKlMu am Januar 11, 2025, 17:35:02
Hallo,
oftmals ist auch ein extra Feld für das Jahr überflüssig, weil sich das Jahr aus einem Datum ableiten lässt.