August 03, 2021, 15:00:44

Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!


Mit VBA eine Tabelle im Backend erstellen über Frontend

Begonnen von TerraAOC, Juni 08, 2021, 07:47:38

⏪ vorheriges - nächstes ⏩

TerraAOC

Guten Morgen miteinander,

Ich möchte über VBA eine Tabelle in meinem Backend erstellen, das VBA soll über das Frontend ausgeführt werden.
Wenn ich es mache wie ich es kenne, wird die Tabelle im Frontend erstellt, brauche die aber im Backend.

Außerdem bräuchte ich auch die Funktion diese Tabelle wieder zu löschen mit VBA, hier habe ich docmd.deleteobject versucht, allerdings sagt mir Access das die Tabelle nicht gefunden werden konnte, da sie im Frontend nicht existiert, sondern nur im Backend.

Ich hoffe das ist nicht so super kompliziert.
Vielen Dank im Voraus und liebe Grüße!

markus888

Vielleicht zeigst du mal deinen Code.
Grundsätzlich darfst du aber nicht Currentdb für den Zugriff verwenden,
sondern musst erstmal selbst eine Verbindung zur gewünschten Datenbank erstellen.

Diese Verbindung kannst du mittels DBEngine.OpenDatabase erstellen.
10 Jahre Access

TerraAOC

Juni 08, 2021, 12:07:58 #2 Letzte Bearbeitung: Juni 08, 2021, 12:57:57 von TerraAOC
Danke für den Denkanstoß mit DBEngine.

Meinen Code kann ich nicht zeigen, ich habe noch keinen (Für Zugriff von Front auf Backend)
nur zum erstellen von einer Tabelle in der aktuellen Datenbank.
Da mach ich zuerst docmd.deleteobject um die Tabelle zu löschen, danach erstell ich die mithilfe von
docmd.transfertext eine Tabelle über eine CSV.

Ich probiere das mal aus mit DBEngine und Frage zur Not einfach noch die Access Onlinehilfe.


Edit: Habe es jetzt so, meinst du das wird so funktionieren?
Dim db As DAO.Database
Dim rst As DAO.Recordset
Set db = DBEngine.OpenDatabase("Datenbank - Kopie_be", False, False)
Set rst = db.OpenRecordset("Testtabelle", dbOpenDynaset)
DoCmd.DeleteObject acTable, "Testtabelle"

Es funktioniert, ich musste nur statt dem Namen also Datenbank - Kopie_be den kompletten Pfad zur DB angeben.

Danke für die Hilfe

TerraAOC

Nochmal ich;
es funktioniert nicht wenn ich eine Tabelle mit docmd.transfertext erstelle.

Die Tabelle wird trotzdem im Frontend erstellt.

Benötige weitere Hilfe

Dim db As DAO.Database
Dim rst As DAO.Recordset
Set db = DBEngine.OpenDatabase("Datenbank - Kopie_be", False, False)
Set rst = db.OpenRecordset("Testtabelle", dbOpenDynaset)
DoCmd.TransferText acImportDelim, "Testimport", "Testtabelle", "C:\Exporte\CSVTest.txt", True, ""

markus888

Zitat von: TerraAOC am Juni 08, 2021, 13:07:21Nochmal ich;
es funktioniert nicht wenn ich eine Tabelle mit docmd.transfertext erstelle.

Ja, wie denn auch.
Du erstellst eine Database Referenz zur Access Datei und nutzt sie dann nicht.
So macht das keinen Sinn.
Grundsätzlich bezweifle ich auch die Sinnhaftigkeit deiner Vorgehensweise.
Du sprachst ja zuerst davon einen Tabelle zu erstellen.
Jetzt geht es darum sie zu importieren und dann auch noch zu löschen.

Vielleicht solltest du das mal überdenken.
Normal erstellt mal erstmal eine Tabelle wo die Datei rein kommen.
Wenn die existiert kannst du ruhig eine Verknüpfung über das Frontend erstellen und die Daten korrekt konvertiert ins Backend schreiben.

Da dir noch so viele Grundlagen fehlen, erklärst du vielleicht mal vorerst den Sinn des Ganzen.
Zwischenzeitlich kannst du dir ja auch mal in der Hilfe ansehen, zu welcher Klasse die Docmd Methode gehört, damit du den Zusammenhang zu deinem Problem erkennen kannst.
10 Jahre Access

TerraAOC

Juni 08, 2021, 16:01:57 #5 Letzte Bearbeitung: Juni 08, 2021, 16:13:00 von TerraAOC
Wieso muss ich immer alles begründen was ich mit Access machen will?
Kannst du mir nicht einfach kurz sagen wie mein Vorhaben funktioniert oder ob es eben nicht funktioniert?

Wenn mir gesagt wird, das es so gemacht werden soll, dann mache ich das so. Da brauche ich keinen tieferen Sinn oder eine Begründung für jeden Schritt.

Das mit dem Löschen war lediglich ein Versuch ob die Verbindung funktioniert und mit docmd.deleteobject tut sie das. Die Tabelle wird aus beiden DBs entfernt.
Allerdings wird die Tabelle nur im Frontend erstellt wenn ich meine csv datei mit docmd.transfertext importiere.
Falls du mir nicht helfen willst, lass es einfach gut sein. Dieses Forum ist normalerweise ein Weg wie man Probleme löst und/oder verhindert.

Aber nach deiner Antwort bin ich mir da nicht so sicher.
Wenn ich mir andere Beiträge hier angucke, bekommen die Leute auch sofort eine Lösung geschrieben, da wird nicht nach dem tieferen Sinn hinter jeder Aktion gefragt. (Aber das ist immer ein Glücksspiel und hängt vom "Experten" ab der sich begnadigt auf einen Beitrag zu antworten)


Und außerdem: Nur weil du die "Sinnhaftigkeit" bezweifelst, heißt das nicht das es 1. Nicht Möglich ist und 2. Nicht auch von anderen Leuten so verwendet wird. Ich habe gehofft das ich einige dieser Leute hier in dem Forum finde.


Edit: Und auch wenn es am Ende vielleicht funktioniert und es trotzdem sehr fehlerbehaftet ist, dann ist das halt so, dann wird es anders gemacht.
Aber ohne das getestet zu haben, weiß ich nicht ob das bei mir funktioniert wie es soll oder nicht, das kann keiner Voraussagen

MzKlMu

Juni 08, 2021, 16:25:54 #6 Letzte Bearbeitung: Juni 08, 2021, 16:35:45 von MzKlMu
Hallo,
wenn Du in einem Accessfrum etwas fragst, musst Du Dir auch die Frage nach dem Sinn gefallen lassen. Es wäre ein schlechtes Forum wenn nicht nach dem Sinn einer Aktion gefragt werden würde. Denn je nach Sinn können sich ja unterschiedliche Lösungsvorschläge ergeben.
Du sprichst zunächst mal davon per VBA eine Tabelle zu erstellen. Dann willst Du plötzlich eine CSV importieren, was ja was anderes ist. Dann willst Du auch eine Tabelle löschen.
Das ist alles ziemlich verwirrend.

Normalerweise würde man eine CSV nur verlinken.
Und dann kann man mit einer Tabellenerstellungsabfrage eine neue Tabelle erstellen oder mit einer Anfügeabfrage die Daten in eine vorgefertigte/vorhandene Access Tabelle übertragen. Dabei kann auch eine Tabellenname im Backend angegeben werden.
Eine CSV ist auch im Regelfall nicht direkt in Access verwendbar. Da müssen auch Datenanpassungen vorgenommen werden, was man dann mit den Abfragen auch gleich erledigen kann.
Diese Abfrage:
SELECT Nachname, Geburtsdatum INTO Test IN 'X:\PfadBackend\Backend.accdb'
FROM VerlinkteCSV
Schreibt aus der verlinkten CSV 2 Felder in die gleichzeitig erstellte Backendtabelle


Die Frage dem dem Sinn des Vorhabens ist also schon mal berechtigt.
Und eine detailiertere Beschreigung des Vorhabens wäre auch sinnvoll.
Gruß
Klaus

markus888

Zitat von: TerraAOC am Juni 08, 2021, 16:01:57Wieso muss ich immer alles begründen was ich mit Access machen will?

Sei doch froh, so lernst du weit mehr.
Außerdem sind die Helfer diejenigen, die ihre Zeit opfern.

Zitat von: TerraAOC am Juni 08, 2021, 16:01:57Kannst du mir nicht einfach kurz sagen wie mein Vorhaben funktioniert oder ob es eben nicht funktioniert?

Also natürlich funktioniert das Vorhaben.
10 Jahre Access

TerraAOC

Eine Beschreibung:
Ich habe eine CSV diese soll per Druck auf einen Button importiert werden, die alte Tabelle die aus der CSV gebildet wurde, soll überschrieben werden, bzw gelöscht und neu angelegt. Das mache ich momentan als es noch nicht Front und Backend war, mit der Docmd.transfertext Methode, allerdings legt diese, wie oben schon erwähnt, die Tabelle immer lokal an. Ich möchte GENAU den gleichen Schritt den transfertext mir ausführt mit Importspezifikation und allem drum und dran in meinem Backend ausführen über das Frontend.

Ich war gestern sehr gereizt, sorry dafür. Ich hoffe wir finden eine Lösung für das Problem.

Grüße

MzKlMu

Gruß
Klaus

TerraAOC

Juni 09, 2021, 08:52:38 #10 Letzte Bearbeitung: Juni 09, 2021, 09:02:27 von TerraAOC
Ja, aber so wie in #6 möchte ich es nicht machen, ich möchte es einfach und simpel mit docmd.transfertext machen.
Wie ich in #8 sagte:
ZitatIch möchte GENAU den gleichen Schritt den transfertext mir ausführt mit Importspezifikation und allem drum und dran in meinem Backend ausführen über das Frontend.

Edit: Auch wenn ich es so machen würde wie in #6 ist das viel zu umständlich, da sich die CSV jeden Tag ändern kann. Dann müsste ich die ja jedes mal neu verlinken.

PhilS

Juni 09, 2021, 09:07:14 #11 Letzte Bearbeitung: Juni 09, 2021, 09:14:51 von PhilS
Zitat von: TerraAOC am Juni 09, 2021, 08:52:38Ja, aber so wie in #6 möchte ich es nicht machen, ich möchte es einfach und simpel mit docmd.transfertext machen.
"Einfach und simpel" geht es aber mit DoCmd.TransferText nicht, weil DoCmd ein Objekt der Access.Application ist und sich immer auf die aktuell geöffnete Datenbank, d.h. in diesem Fall das Frontend, auswirkt.

Du kannst entweder ...
  • die Tabelle im Backend erstellen, sie ins Frontend verknüpfen und dann DoCmd.TransferText verwenden,
  • ein SQL-Statement mit FROM/IN-Klausel verwenden, um Tabellen in anderen Datenbanken anzusprechen (siehe #6), oder
  • eine zweite Access.Application-Instanz starten, die BE-DB öffnen und in der Instanz DoCmd.TransferText aufrufen.

[Edit]
Zitat von: TerraAOC am Juni 09, 2021, 08:52:38Edit: Auch wenn ich es so machen würde wie in #6 ist das viel zu umständlich, da sich die CSV jeden Tag ändern kann. Dann müsste ich die ja jedes mal neu verlinken.
Und? Du kannst die CSV-Datei doch per Code neu verknüpfen.
[/Edit]
Access DevTools - Find and Replace
Komfortables Suchen und Ersetzen in den Entwurfseigenschaften von Access-Objekten. In Abfragen, Formularen, Berichten und VBA-Code - Überall und rasend schnell!

MzKlMu

Hallo,
ob importiert oder verlinkt ist egal.
Erst Transfertext ausführen (dabei lässt sich steuern ob verlinkt oder importiert) und in der nächsten Zeile dann:
CurrentDb.Execut "SELECT Feldname1, Feldname2 INTO Test IN 'X:\PfadBackend\Backend.accdb' FROM CSV", DbFailOnError
Gruß
Klaus

TerraAOC

Hallo,

Zu #11

ZitatUnd? Du kannst die CSV-Datei doch per Code neu verknüpfen.
Ich habe das grade mal getestet, solange sich der Pfad und die Struktur der csv nicht ändert, kann ich die verlinkt lassen. Das ist schon mal gut.


zu #12:
ist bei INTO Test, das Test der Name den die Tabelle im Frontend erhalten soll?
ZitatErst TransferText ausführen (dabei lässt sich steuern ob verlinkt oder importiert) und in der nächsten Zeile dann
Also DoCmd.Transfertext acLinkDelim ?
Das wäre zwar ein bisschen umständlicher, aber ich könnte die verlinken und dann so wie du gezeigt hast als Tabelle ins Backend packen? Hab ich das richtig verstanden? Falls ja, ist das genau was ich brauche.

TerraAOC

Juni 09, 2021, 11:03:52 #14 Letzte Bearbeitung: Juni 09, 2021, 11:28:17 von TerraAOC
Funktioniert nicht, muss ich bei FROM CSV den kompletten Pfad der CSV eingeben?

Funktioniert auch nicht ich kriege jedes mal einen Laufzeitfehler.
Dieser besagt das meine CSV nicht in C:\CSV.mdb gefunden wurde, ich hab aber den Pfad mit .txt am Ende der CSV angegeben.
Wieso sucht der also nach einer mdb?